Selenium,Java。需要通过Xpath选择表内的祖先元素

时间:2016-07-27 17:29:18

标签: java selenium xpath

我有一个包含以下代码的HTML页面:

<table class="report" style="width:100%">
   <tbody>
      <tr>
         <th/>
         <th>Position Open
            <br>
            <span class="timestamp">27/7/2016 16:12:12</span>
            </br>
         </th>
         <th>Position closed
            <br>
            <span class="timestamp">27/7/2016 16:12:42</span>
            </br>
         </th>
      </tr>
      <tr>
         <td>
            <span dir="ltr">EURJPY</span>
         </td>
         <td>116.098</td>
         <td>116.156</td>
      </tr>
   </tbody>
</table>

在这个页面上,我有另一个具有相同类属性“report”的表,但只有这个表包含文本“Position Open”和“Position Closed”。 我需要选择包含“EURJPY”,“116.098”和“116.156”数据的元素。 这些元素内容正在发生变化,而不是“EURJPY”可能会出现“EURUSD”或“GBPCAD”等。 我尝试了以下代码:

driver.findElement(By.xpath("//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span")).getAttribute("textContent");  

获取第一个必填字段文本,但出现Invalid selector错误。

3 个答案:

答案 0 :(得分:3)

你的XPath很接近,但有几个问题。

//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span
  1. 您正在搜索包含文字&#39; Position Open&#39;的SPAN。实际上它是一个包含文本的TH

    //th[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span
    
  2. (//tr)应更正为//tr

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td/span
    
  3. 您想要的是TD中包含的文字,而不是SPAN。如果您从TD中提取文本,则可以从所有三个元素中获取所需的文本。如果你拉SPAN,那么你还需要拉出最后两个TD。这种方式更简单。

  4. ...最后,TH不仅包含您要查找的文字。使用.contains()获得匹配。

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td
    
  5. 所以我们把XPath放到Java代码中,我们得到以下内容。

    List<WebElement> tds = driver.findElements(By.xpath("//th[contains(text(),'Position Open')]/ancestor::table[@class='report']//tr[2]/td"));
    for (WebElement td : tds)
    {
        System.out.println(td.getText());
    }
    

答案 1 :(得分:3)

有时会出现与文本匹配的问题,请改用use contains,尝试使用此选择器

//th[contains(.,'Position')]/ancestor::table[@class='report']//tr[2]/td/span

答案 2 :(得分:2)

您可以使用此xpath找到您感兴趣的3个<td>代码

//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td

使用它将为您提供三个元素的列表,您可以从中提取文本

List<WebElement> tds = driver.findElement(By.xpath"//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td");
String currency = tds.get(1).getText(); // this will be EURJPY
tds.get(2).getText(); // 116.098
tds.get(3).getText(); // 116.156