1)我正在做一个教程来展示 findElements By xpath 是如何工作的。我想知道为什么它会返回 <div>
之后的所有文本具有属性 id=container
的元素.
xpath 代码:By.xpath("//div[@id='container']
2) 我应该如何修改代码,以便它只返回父注释后面的第一个或前几个节点 例如第一个节点如“Home”,前几个节点如“Home”、“手动测试”和“自动化测试”。
感谢您的建议和帮助!
这是本教程的代码片段:
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
}
最佳答案
您的问题:
Q 1.) 我想知道为什么它会返回所有跟在 div 后面的文本?
它不应该,我认为不会。它返回所有“id”属性值等于“container”的 div(以及它的所有子元素)。但是您正在使用 ele.getText()
打印结果
其中 getText 将返回结果的所有子项的所有文本内容。
获取此元素(包括子元素)的可见(即未被 CSS 隐藏)innerText,没有任何前导或尾随空格。
返回:
此元素的 innerText。
问题 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 的 div 并且您正在寻找第一个 child :
//div[@id='container']/*[1]
等等。
关于java - Webdriver findElements 通过 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361535/