【问题标题】:How can I write a better xpath expression?如何编写更好的 xpath 表达式?
【发布时间】:2015-01-16 13:38:20
【问题描述】:

我有类似这样的html:

<tr>
  <td>
    <span>
      <span class = "x28w"></span>
    </span>
  <td>
    <span>
      <a>
        <span>3899393</span>
      </a>
    </span>
  </td>
</tr>

<tr>
  <td>
    <span>
    </span>
  <td>
    <span>
      <a>
        <span>3899394</span>
      </a>
    </span>
  </td>
</tr>

所以基本上第一个跨度是空白的,但如果它下面有一个带有类"x28w" 的子跨度,则会显示一个图标。第二个(即3899393)是一个案例编号。

我想用Java写一个selenium方法List&lt;String&gt;getCasesWithAlert()

我可以做一个findElements(By.xpath("//tr")),循环遍历元素,检查当前tr是否有td/span/span[contains(@class,'x28w')]

如果有则取该行,查找子 td 元素,获取第二个元素并找到元素 a/span,然后获取文本。但这有点复杂。

是否可以使用某种 xpath 表达式(例如跟随兄弟或其他)来查找在一个表达式中包含警报图标(x28w 类)的案例?

【问题讨论】:

    标签: html selenium xpath


    【解决方案1】:

    对于每个tr,您可以检查第一个td 是否符合条件,并从第二个td 中获取所需的span 元素:

    //tr[td[1][span/span[contains(@class,'x28w')]]]/td[2]/span/a/span
    

    【讨论】:

    • 谢谢。这实际上是在更多的 html 中,所以不是 tr,而是 //div[contains(@id,'t1::db') 或 contains(@id,'t2::db') ]/table[1]/tbody[ 1]/tr" 但我想我可以推断出你的路径,对吧?
    • @user3257891 是的,想法保持不变,我使用了您提供的 HTML 进行测试 - 为我工作。如果您在应用该解决方案时遇到困难,请告诉我您真正的 HTML 代码是什么。谢谢。
    • 逆向怎么样?那些没有x28w的?然后没有第二个x28w。我不能使用 span[not contains ... 因为不会有内部跨度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多