Selenium

时间:2016-04-22 07:13:42

标签: java selenium selenium-webdriver

我无法通过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;第二种方法解决了这个问题。这里到底发生了什么,以及这背后的逻辑?

3 个答案:

答案 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节点的值。

希望这会有所帮助。如果您需要更多相关信息,请与我们联系。