使用包含(node())和包含(@attribute)的xpath查找元素

时间:2019-04-23 19:42:18

标签: selenium xpath

我正在尝试通过检查innerHTML(属性node())和某些属性(例如@class)来定位元素。 两种方法都可以单独使用,但是我无法将它们与“和”组合使用

HTML部分:

<tr class="tableRow1">
  <td nowrap="" class="ct">
    <input type="CheckBox" name="RowKey" tabindex="17" value="15635">
    <img src="/tm/images/1pixel.gif" style="height:9px;width:9px;border:0" name="RowIndicator">
  </td>
  <td class="lt" title="ID">XXXXX</td><nobr>0021234567</nobr><td class="rt">1.00</td>
</tr>

因此,我需要通过捕获以下部分来找到 class =“ tableRow1” 的这个节点(来自其他许多节点):

<nobr>002123456</nobr>.

这两个作品(但包含几个元素):

.find_element_by_xpath('//tr[contains(node(), "0021234567")]')
.find_element_by_xpath('//tr[contains(@class, "Row")]')

这不是:

.find_element_by_xpath('//tr[contains(node(),"0021234567") and contains(@class,"Row")]')

4 个答案:

答案 0 :(得分:1)

尝试以下XPath-1.0表达式:

descendant::*[contains(node(), "0021234567")]/ancestor::tr[contains(@class, "Row")][1]

或完整说明

.find_element_by_xpath('descendant::*[contains(node(), "0021234567")]/ancestor::tr[contains(@class, "Row")][1]')

此指令选择(全局)tr的第一个class祖先-拥有Row属性,其中node()属性包含值0021234567-包含值{{ 1}}。

答案 1 :(得分:1)

您的两个XPath选择器正在选择不同的节点。

包含字符串的节点是具有类名称的<tr>节点的后代。这就是为什么当您同时为一个节点设置两个条件时,它找不到任何匹配的节点。

尝试一下:

.find_element_by_xpath('//[contains(node(), "0021234567")]/ancestor::tr[contains(@class), "Row"]')

答案 2 :(得分:1)

要找到包含子<tr>节点的<nobr>节点,可以使用以下解决方案:

driver.find_element_by_xpath("//nobr//ancestor::tr[contains(@class, 'Row')]")

注意:假设innerText中的<nobr>是变量,否则innerText可以包含在 XPath表达式< / em>。

答案 3 :(得分:1)

  

所以我需要找到 class =“ tableRow1” 的这个节点(从许多   其他):抓住这一部分:

<nobr>002123456</nobr>

XPath表达式应为:

//tr[@class='tableRow1'][.//nobr='002123456']

那是基本的。然后,您可以根据自己的情况进行调整。

  • 示例1 (许多可能的类标记)

    //tr[contains(concat(' ',@class,' '),' tableRow1 ')][.//nobr='002123456']

  • 示例2 nobr中可能的空白)

    //tr[contains(concat(' ',@class,' '),' tableRow1 ')] [.//nobr[normalize-space()='002123456']]

  • 示例3 (类令牌以'tableRow'开头)

    //tr[contains(concat(' ',@class,' '),' tableRow')] [.//nobr[normalize-space()='002123456']]