Java Webdriver通过xpath查找数据项

Java Webdriver通过xpath查找数据项,java,selenium,xpath,selenium-webdriver,webdriver,Java,Selenium,Xpath,Selenium Webdriver,Webdriver,1) 我正在做一个教程来展示xpath的findElements是如何工作的。我想知道为什么它返回属性为id=container的元素后面的所有文本 xpath的代码:By.xpath(“//div[@id='container'] 2) 如何修改代码,使其只返回父注释后面的第一个或前几个节点 e、 g.第一个节点,如“主页”,前几个节点,如主页,手动测试和自动化测试 谢谢你的建议和帮助 以下是本教程的代码片段: import java.util.List; 导入org.junit.Test;

1) 我正在做一个教程来展示xpath的findElements是如何工作的。我想知道为什么它返回属性为
id=container
元素后面的所有文本

xpath的代码:
By.xpath(“//div[@id='container']

2) 如何修改代码,使其只返回父注释后面的第一个或前几个节点 e、 g.第一个节点,如“主页”,前几个节点,如主页,手动测试和自动化测试

谢谢你的建议和帮助

以下是本教程的代码片段:

import java.util.List;
导入org.junit.Test;
导入org.junit.Before;
导入org.junit.After;
导入org.openqa.selenium.By;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.WebElement;
导入org.openqa.selenium.firefox.FirefoxDriver;
公共类WD_findElements
{
@试验
公共无效测试_byxpath(){
WebDriver=newfirefoxdriver();
试一试{
驱动程序。获取(“http://www.hexbytes.com");
List elements=driver.findElements(By.xpath(//div[@id='container']);
System.out.println(“Test7元素数:+elements.size());
for(WebElement ele:elements){
//ele.sendKeys(“hexbyes”);
System.out.println(ele.getText());
//System.out.println(ele.getAttribute(“id”);
//System.out.println(ele.getTagName());
} 
}
最后{
driver.close();
}
}//测试结束\u byxpath
公共无效xpathDemo2(){
WebDriver=newfirefoxdriver();
试一试{
驱动程序。获取(“http://www.hexbytes.com");
WebElement WebElement=driver.findElement(By.id(“容器”);
//将单个元素与属性值=容器匹配
System.out.println(“id值为:”+webelement.getAttribute(“id”));
System.out.println(“标记名为:”+webelement.getTagName());
}
最后{
driver.close();
}
}//xpathDemo2的结束
公共无效xpathDemo3(){
WebDriver=newfirefoxdriver();
试一试{
驱动程序。获取(“http://www.hexbytes.com");
//查找属性为container的div元素的第一个子节点
List elements=driver.findElements(By.xpath(“//div[@id='container']]/*[1]”);
System.out.println(“Test1元素数:+elements.size());
for(WebElement ele:elements){
System.out.println(ele.getTagName());
System.out.println(ele.getAttribute(“id”);
System.out.println(“”);
System.out.println(“”);
}
}
最后{
driver.close();
}
}//xpathDemo3的结束
}

XPath转换为:

获取id为等于容器的所有div元素

至于获得第一个etc,您有两个选择

将其转换为
.findElement()
-无论如何,这只会为您返回第一个

要在XPath中显式执行此操作,您将看到:

(//div[@id='container'])[1]
对于第一个,对于第二个等:

(//div[@id='container'])[2]
然后XPath有一个特殊的索引器,名为last,它将(您猜到了)获得找到的last元素:

(//div[@id='container'])[last()]
值得一提的是,XPath索引器将从1开始,而不是像大多数编程语言那样从0开始

至于获取父节点,您可以使用父节点

//div[@id='container']/parent::*
这将得到div的直接父级

然后,您可以进一步说,我想要id为容器的第一个*div*,我想要他的父对象:

(//div[@id='container'])[1]/parent::*
希望对您有所帮助!

您的问题:

Q 1.)我想知道为什么它会返回div后面的所有文本?
它不应该,我想也不会。它返回所有具有'id'属性值等于'containter'的div(以及它的所有子项)。但是您正在使用
ele.getText()
其中getText将返回结果所有子级的所有文本内容

获取此元素(包括子元素)的可见(即未被CSS隐藏)innerText,无任何前导或尾随空格。
返回:
此元素的内部文本

Q 2.)我应该如何修改代码,使其只返回父注释后面的第一个或前几个节点
这并不清楚你在寻找什么。 例如:

或更短

 //div[@id='container'][1]/../following-sibling::* 
如果只查找第一个区段,请使用带有“谓词”的表达式 (例如,第一个为
[1]
,前三个为
[position()4]

如果您正在寻找第一个div的第一个孩子:

//div[@id='container'][1]/*[1]
如果只有一个id为an的div,则您正在查找第一个孩子:

   //div[@id='container']/*[1]
等等。

而不是

css=#container
使用


感谢您的回复。我明白了。findElement方法只返回一个匹配元素,但是。findElement返回多个匹配元素。我尝试将第一个节点或div元素的子元素与attribute=container匹配,它将id值作为container返回。对我来说,第一个子元素应该是id=header的div元素
driver.findElements(By.xpath(“//div[@id='container'][1]”)
System.out.println(ele.getAttribute(“id”);
它重新调整了容器而不是标头。我这样做正确吗?请给我一些反馈。您正在寻找
//div[@id='container']/div[id@='header']
。感谢您的回复。我对节点的概念不是很确定。从查看html源代码页,
我认为div标记的第一个子节点是
。我尝试通过usin输出第一个子节点的id值
   //div[@id='container']/*[1]
css=#container
css=div.container:nth-of-type(1),css=div.container:nth-of-type(2)