【问题标题】:Selenium, Java. Need to select ancestor element inside table by Xpath硒,Java。需要通过 Xpath 选择表内的祖先元素
【发布时间】:2016-12-01 20:34:15
【问题描述】:

我有一个包含以下代码的 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 错误。

【问题讨论】:

  • 我认为你应该尝试删除(//tr)中的括号
  • 您的 xpath 和您的需求逻辑很清楚。您的意思是“持仓开仓”OR“持仓平仓”吗?您的尝试仅测试未平仓头寸。另外,你说你想选择元素,但 FindElement() 只选择一个元素,你的例子表明你只想要跨度中包含的文本。

标签: java selenium xpath


【解决方案1】:

您的 XPath 已接近,但存在一些问题。

//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span
  1. 您正在搜索包含文本“Position Open”的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,那么您还需要拉动最后两个TDs。这种方式更简单。

  4. ...最后,TH 包含的不仅仅是您要查找的文本。使用.contains() 进行匹配。

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td
    

所以我们将 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());
}

【讨论】:

    【解决方案2】:

    有时匹配文本可能会出现问题,请改用包含,试试这个选择器

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

    【讨论】:

      【解决方案3】:

      你可以使用这个xpath来定位你感兴趣的3个&lt;td&gt;标签

      //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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 2018-05-29
        相关资源
        最近更新 更多