我正在尝试通过检查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")]')
答案 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']]