Webdriver findElements由xpath

1)我正在做一个教程来展示findElements by xpath是如何工作的。 我想知道为什么它返回属于id=container

元素之后的所有文本。

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

2)我应该如何修改代码,以便它只返回跟随父笔记的第一个或前几个节点,例如第一个节点,如“Home”,首先是几个节点,如Home,Manual Testing和Automation Testing。

感谢您的建议和帮助!

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

 import java.util.List; import org.junit.Test; import org.junit.Before; import org.junit.After; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class WD_findElements { @Test public void test_byxpath(){ WebDriver driver = new FirefoxDriver(); try{ driver.get("http://www.hexbytes.com"); List elements = driver.findElements(By.xpath("//div[@id='container']")); System.out.println("Test7 number of elements: " + 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()); } } finally { driver.close(); } }//end of test_byxpath public void xpathDemo2() { WebDriver driver = new FirefoxDriver(); try{ driver.get("http://www.hexbytes.com"); WebElement webelement = driver.findElement(By.id("container")); //matching single element with attribute value=container System.out.println("The id value is: " + webelement.getAttribute("id")); System.out.println("The tag name is: " + webelement.getTagName()); } finally { driver.close(); } }//end of xpathDemo2 public void xpathDemo3() { WebDriver driver = new FirefoxDriver(); try{ driver.get("http://www.hexbytes.com"); //find first child node of div element with attribute=container List elements = driver.findElements(By.xpath("//div[@id='container']/*[1]")); System.out.println("Test1 number of elements: " + elements.size()); for(WebElement ele : elements){ System.out.println(ele.getTagName()); System.out.println(ele.getAttribute("id")); System.out.println(""); System.out.println(""); } } finally { driver.close(); } }//end of xpathDemo3 } 

你的问题:

问1.)我想知道为什么它会返回div之后的所有文本?
它不应该,我认为不会。 它返回所有div,其中’id’属性值等于’containter’(及其所有子节点)。 但是您使用ele.getText()打印结果,其中getText将返回结果的所有子项的所有文本内容。

获取此元素的可见(即不被CSS隐藏)innerText,包括子元素,没有任何前导或尾随空格。
返回:
这个元素的innerText。

问2.)我应该如何修改代码,以便它只返回父笔记后面的第一个或前几个节点
这并不是很清楚你在寻找什么。 例:

  

以下是div的父级是p2。 这将是:

  //div[@id='container'][1]/parent::*/following-sibling::* 

或更短

  //div[@id='container'][1]/../following-sibling::* 

如果你只是在寻找第一个带有“谓词”的表达式(例如[1] – 对于第一个。或[position() < 4]为前三个)

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

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

如果只有一个id为id的div,那么你正在寻找第一个孩子:

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

等等。

XPath变成了这样:

给我所有id 等于 容器div元素。

至于获得第一个等,你有两个选择。

把它变成一个.findElement() – 无论如何,这只会为你返回第一个。

要么

要在XPath中明确地执行此操作,您将看到:

 (//div[@id='container'])[1] 

对于第一个,对于第二个等:

 (//div[@id='container'])[2] 

然后XPath有一个特殊的索引器,名为last ,它会(你猜对了)得到你找到的最后一个元素:

 (//div[@id='container'])[last()] 

值得一提的是,XPath索引器将从1开始,而不是像大多数编程语言中那样从0开始。

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

 //div[@id='container']/parent::* 

这将得到div的直接父母。

然后你可以进一步说我希望第一个 * div *的容量为id,我想要他的父母:

 (//div[@id='container'])[1]/parent::* 

希望有所帮助!

代替

 css=#container 

使用

 css=div.container:nth-of-type(1),css=div.container:nth-of-type(2)