我正在用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("data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D") 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
。见图:
答案 0 :(得分:2)
您的方法存在一些问题。
您使用的//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")