我无法通过selenium webdriver如何在网页中找到元素来找到合乎逻辑的答案。我试图迭代特定列的行(单元格值)并找到它。
<table id="Results">
<tr> <td id="item"> Apple </td> <td> 10 </td> </tr>
<tr> <td id="item"> Ball </td> <td> 20 </td> </tr>
<tr> <td id="item"> Cat </td> <td> 30 </td> </tr>
<table>
我只需要提取Apple,Ball和Cat,因此使用以下方法,
1: List<WebElement> rows = driver.findElements(By.xpath("//table[@id='Results']//tr”));
2: for(WebElement row : rows){
3: List<WebElement> cells = row.findElements(By.xpath("//td[@id='item']"));
4: for(WebElement cell : cells){
5: System.out.println(cell.getText);
6: }
7: }
Output:
Apple
Apple
Apple
但改变Line#:3后,
3: List<WebElement> cells = row.findElements(By.xpath(".//td[@id='item']"));
Output:
Apple
Ball
Cat
所以,我在这里不明白的一点是,为什么我的第一种方法没有得到正确的结果,因为我试图使用父节点查询子元素?相反,&#34;。&#34;第二种方法解决了这个问题。这里到底发生了什么,以及这背后的逻辑?
答案 0 :(得分:0)
如果您没有指定起始节点,它将从root开始。在这种情况下,//td[@id='item']
会找到/html
中的元素,这意味着它可能会找到其他元素。正如您在第二种方法中提到的那样,您必须使用.//td[@id='item']
,因此它将从当前节点row
开始。
答案 1 :(得分:0)
我认为你的第二种方法也不正确。由于您无法将WebElements列表分配给WebElement。您将收到编译错误。如果您想获得所需的输出,请使用下面的代码片段:
List<WebElement> cells = driver.findElements(By.xpath("//*[@id='item']"));
for(WebElement cell : cells){
System.out.println(cell.getText());
}
认为你理解。
答案 2 :(得分:0)
当你指定'//'时,xpath将开始在整个xml上搜索该节点而不管其父节点,并返回它遇到的第一个元素,在这种情况下每次都是'Apple'。
如果指定'.//',xpath将开始搜索上下文节点下的元素(在本例中为tr),这意味着,每次都不会在完整的xml中搜索td元素。它将搜索上下文节点的后代。在这种情况下,它将返回tr节点下存在的每个td节点的值。
希望这会有所帮助。如果您需要更多相关信息,请与我们联系。