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)