1)我正在做一个教程来展示findElements by xpath是如何工作的。我想知道为什么它会返回<div>
元素后面带有属性id=container
的所有文本。
xpath的代码:By.xpath("//div[@id='container']
2)我应该如何修改代码,以便它只返回跟随父笔记的第一个或前几个节点 例如第一个节点如'Home',首先是几个节点,如Home,Manual Testing and 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<WebElement> 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<WebElement> 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
}
答案 0 :(得分:6)
您的问题:
问1.)我想知道为什么它会返回div之后的所有文本?
它不应该,我认为不会。它返回所有div,其中'id'属性值等于'containter'(及其所有子节点)。但是您使用ele.getText()
打印结果
getText将返回结果的所有子项的所有文本内容。
获取此元素的可见(即未被CSS隐藏)innerText,包括子元素,没有任何前导或尾随空格。
返回:
此元素的innerText。
问2. 2.我应该如何修改代码,以便它只返回跟随父笔记的第一个或前几个节点
这并不是很清楚你在寻找什么。
例如:
<p1> <div/> </p1 <p2/>
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]
等等。
答案 1 :(得分:3)
XPath变成了这个:
获取所有 div 元素,其
至于获得第一个等,你有两个选择。
将其变为.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 的直接父母。
然后你可以进一步说我想要第一个 * div *,ID为容器,我想他的父母:
(//div[@id='container'])[1]/parent::*
希望有所帮助!
答案 2 :(得分:0)
而不是
css=#container
使用
css=div.container:nth-of-type(1),css=div.container:nth-of-type(2)