我需要在有文本的表格中选择一行,因此我想利用选择文本然后最终选择父项的选项
现在页面看起来像:
<tr class=" tableRow1" id="_pu5ufb" dr="1" _awtisprimaryrow="1">
<td width="1" class="tableBody w-tbl-cell" align="center"><span
class="selectColumnMarker">
<div class="w-chk-container">
<input bh="CHKINP" hasaction="false" class="w-chk-native"
id="_m7iynb" value="1" type="checkbox" elementid="_jw4lmb"
issender="false" awnomitcomponent="true" name="_jw4lmb"><label
bh="CHK" class="w-chk w-chk-dsize"></label>
</div>
</span>
</td>
<td align="left" class="tableBody w-tbl-cell">
<span>
<table role="presentation" class="mls" cellpadding="0"
cellspacing="0">
<tbody><tr>
<td class="" id="_tz87e" tabindex="0"><a id="_3iqrbb" href="#"
bh="HL" _sf="true">Analyst</a>
</td>
</tr>
</tbody></table>
</span>
</td><td class="tableBody w-tbl-cell">
</td>
<td class="tableBody w-tbl-cell">
</td>
</tr>
我需要找到文本 Analyst ,然后找到关联的<tr>
类并选择<tr>
类。
任何帮助都是非常重要的
答案 0 :(得分:2)
我需要找到文本Analyst,然后找到关联的
tr
类并选择tr
类。
此XPath,
//tr[td/normalize-space() = "Analyst"]/@class
将选择@class
个元素的所有tr
个属性,这些元素包含一个td
,且其空间归一化的字符串值为“ Analyst”。
但是请注意,在示例HTML中,这样的tr
没有@class
。
1 感谢您的纠正,@ DebanjanB
答案 1 :(得分:2)
首先,每当您混合使用内容(文本和标记)时,最好比较元素的字符串值而不是文本节点,因为内联标记可能会将比较的文本拆分为不同的文本节点。
第二,您可以使用:
//tr[td='Analyst']/@class
注意:节点集比较是一个存在的比较。这意味着您要询问是否存在某个字符串值等于td
的节点(在这种情况下为'Analyst'
元素。)
当然,在HTML中,尽管源文件中存在空白,但对于空白来说,空白并不重要(不保留)。在这种情况下,您可以使用这个简单的XPath 1.0表达式:
//tr[td[normalize-space()='Analyst']]/@class
注意:当且仅当节点集为空时,其节点集的布尔值才为假。您可以“嵌套”谓词(正确地,谓词可以是任何XPath表达式)。
答案 2 :(得分:1)
将您的XML文件固定到
<?xml version="1.0"?>
<!DOCTYPE stylesheet [
<!ENTITY nbsp " ">
]>
<root>
<tr class=" tableRow1" id="_pu5ufb" dr="1" _awtisprimaryrow="1">
<td width="1" class="tableBody w-tbl-cell" align="center">
<span class="selectColumnMarker">
<div class="w-chk-container">
<input bh="CHKINP" hasaction="false" class="w-chk-native" id="_m7iynb" value="1" type="checkbox" elementid="_jw4lmb" issender="false" awnomitcomponent="true" name="_jw4lmb"/>
<label bh="CHK" class="w-chk w-chk-dsize"/>
</div>
</span>
</td>
<td align="left" class="tableBody w-tbl-cell">
<span>
<table role="presentation" class="mls" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="" id="_tz87e" tabindex="0">
<a id="_3iqrbb" href="#" bh="HL" _sf="true">Analyst</a>
</td>
</tr>
</tbody>
</table>
</span>
</td>
<td class="tableBody w-tbl-cell">
</td>
<td class="tableBody w-tbl-cell">
</td>
</tr>
</root>
然后,您要查找的表达式是
//tr[td/a/text()='Analyst']/@class
但是因为tr
元素没有class
属性,所以结果为空。
答案 3 :(得分:1)
有点不清楚您的意思是 ...找到关联的tr类并选择tr类... 一旦找到 ...文本Analyst ... 。
但是,由于元素是动态元素,并且要使用 Analyst 作为文本来定位元素,因此可以使用以下基于 Java 的Locator Strategies之一:< / p>
linkText
WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Analyst")));
cssSelector :
WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("td.tableBody table.mls a[bh='HL']")))
xpath :
WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//td[contains(@class, 'tableBody')]//table[@class='mls']//a[text()='Analyst']")));
要相对于作为 Analyst 的文本提取class
元素的<tr>
属性,可以使用以下 Java 基于解决方案:
xpath :
String tr_class_attrib = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//td[contains(@class, 'tableBody')]//table[@class='mls']//a[text()='Analyst']//preceding::tr[1]"))).getAttribute("class");