如何在Selenium中通过DOM属性识别元素?

时间:2015-09-25 08:22:01

标签: java selenium dom xpath css-selectors

我正在用Java编写一些Selenium测试,后来需要通过在html中看不到的DOM属性来查找元素。下面的代码尝试使用“class”属性在google中找到搜索栏,然后“检查”DOM属性。只有第一个适用于我,第二个失败了“无法找到元素”。

我认为我要么在xpath上做错了,要么我没有正确理解DOM属性。我尝试了DOM中的其他几个属性,但总是得到相同的结果。我也尝试使用cssSeletor而不是xpath,但同样的结果也是如此。

如代码中所示,我使用Chrome(使用Windows 7)。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

public class SeleniumTest {

    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "D:\\Selenium\\Drivers\\chromedriver.exe");
        DesiredCapabilities caps = DesiredCapabilities.chrome();
        WebDriver driver = new ChromeDriver(caps);
        driver.manage().window().maximize();
        driver.get("http://www.google.com");
        WebElement elementByClass = driver.findElement(By.xpath("//input[@class='gsfi']"));
        WebElement elementByDOM = driver.findElement(By.xpath("//input[@checked='false']"));
    }
}

编辑: 如果我使用F12开发工具检查谷歌搜索栏,我会找到html:

<input spellcheck="false" dir="ltr" style="border: medium none; padding: 0px; margin: 0px; height: auto; width: 100%; background: transparent url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) repeat scroll 0% 0%; position: absolute; z-index: 6; left: 0px; outline: medium none;" aria-autocomplete="both" role="combobox" aria-haspopup="false" class="gsfi" id="lst-ib" maxlength="2048" name="q" autocomplete="off" title="Søk" value="" aria-label="Søk" type="text">

如果我检查这个元素的DOM属性,我可以看到属性"checked"=true。见图:

2 个答案:

答案 0 :(得分:2)

您的方法存在一些问题。

XPath按字面意思

您使用的//input[@checked='false']表达式只匹配input 明确设置为checked的{​​{1}}元素。它不会考虑那些未设置"false"的{​​{1}}元素,因此默认值为input

属性!==属性

如果您想知道checked 当前选中的false 属性是否属于该属性,您需要检查一下。该属性仅用于为属性提供初始值。之后,操纵input将不会更改属性(除非您实际上编写代码来执行此操作)。将会改变checked的属性。您的XPath检查属性,并且不能使用XPath按属性进行选择。

您可以使用伪类选择器:input

input

您可以使用:checked查找未经检查的内容。

答案 1 :(得分:0)

您好经过一些研究和与selenium的初步斗争后,我了解到您可以使用Selenium JavaScriptExecutor类执行javascript来访问Web控件的任何DOM属性。所以我设计了一个通用函数,可以在页面上搜索任何Web控件,前提是您输入了在浏览器中搜索的该控件的唯一DOM属性。由于此函数遍历DOM层次结构,因此它实际上可以跨多个浏览器工作。看看

` 
/// <summary>
        /// Fetch the object reference of any control on the screen
        /// Please Note : Make sure you pass unique objPropNames,objPropValues    of the control,
        /// if not then the first matched control is returned
        /// </summary>
        /// <param name="driver"></param>
        /// <param name="objPropNames"></param>
        /// <param name="objPropValues"></param>
        /// <param name="elementTagName"></param>
        /// <returns></returns>
        public static IWebElement GetWebObject(IWebDriver driver,string[] objPropNames, string[] objPropValues, string elementTagName)
        {
            IWebElement webObj = null;
            //string elementPropVlu;

            //string propName, propVlu;
            try
            {
                IList<IWebElement> lstElement = driver.FindElements(By.TagName(elementTagName));
                foreach (var item in lstElement)
                {
                    //reset the flag to true for every iteration
                    bool objectFound = true;

                    for (int i = 0; i < objPropNames.Length; i++)
                    {
                        ObjPropName = objPropNames[i];
                        ObjPropVlu = objPropValues[i];
                        //get the value of the attribute
                        //elementPropVlu = item.GetAttribute(ObjPropName.ToString());
                        var elementPropVlu = (Object)null;
                        try
                        {
                           elementPropVlu = ((IJavaScriptExecutor)driver).ExecuteScript("return arguments[0]." + ObjPropName + "; ", item);
                        }
                        catch (InvalidOperationException ex)
                        {


                        }
                        if (elementPropVlu != null)
                        {
                            if (elementPropVlu.ToString().ToLower().Trim() != ObjPropVlu.ToString().ToLower().Trim())
                            {
                                objectFound = false;
                                break;
                            }
                        }                     

                    }
                    //if all the prop values of that object are satisfied then the match is found which 
                    //means the element we are searching for is found
                    if (objectFound)
                    {
                        webObj = item;
                        break;
                    }
                }
            }
            catch (NoSuchElementException e)
            {
                //throw;
                //log the exception
            }
            return webObj;
        }` 

用法:

GetWebObject(DriverContext.Driver, new string[] { "checked", "className" }, new string[] { "false", "gsfi" }, "INPUT")