如何定位通过 innerText 识别的 child 元素的 parent 元素?
How to locate the parent element of a child element identified through innerText?
我需要 select 在我有文本的 table 行中,因此我想利用 select 文本的选项,然后最终 select正在 parent
现在页面看起来像:
<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>
class 和 select <tr>
class。
任何帮助将不胜感激
I need to find the text Analyst and then find the associated tr
class and select the tr
class.
XPath 2.01
这个 XPath,
//tr[td/normalize-space() = "Analyst"]/@class
将 select tr
元素的所有 @class
属性包含 td
和 space- 规范化字符串值 "Analyst"。
但是请注意,在您的示例 HTML 中,这样的 tr
没有 @class
。
1感谢指正,@DebanjanB
将您的 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
属性,所以结果为空。
有点不清楚你所说的 到底是什么意思...找到相关的 tr class 和 select tr class... 一旦您找到 ...文本分析师....
但是,由于元素是动态元素,并且要将带有文本的元素定位为 Analyst,您可以使用以下任一方法 Java 基于 :
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']")));
提取 <tr>
元素的 class
属性 作为 Analyst 你可以使用以下基于 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");
首先,当您有混合内容(文本和标记)时,比较元素的字符串值比文本节点更好,因为内联标记可能会将比较的文本拆分到不同的文本节点。
其次,您可以使用:
//tr[td='Analyst']/@class
注意:节点集比较是存在性比较。这意味着您在询问是否有某个节点(在本例中为某些 td
元素)的字符串值等于 'Analyst'
.
当然,在 HTML 中有一些元素的白色 space 对于渲染来说并不重要(它没有被保留),尽管它存在于源文档中。在这种情况下,您可以使用 这个简单的 XPath 1.0 表达式:
//tr[td[normalize-space()='Analyst']]/@class
请注意:当且仅当节点集为空时,它才具有假布尔值;您可以 "nest" 谓词(正确地说,谓词可以是任何 XPath 表达式)。
我需要 select 在我有文本的 table 行中,因此我想利用 select 文本的选项,然后最终 select正在 parent
现在页面看起来像:
<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>
class 和 select <tr>
class。
任何帮助将不胜感激
I need to find the text Analyst and then find the associated
tr
class and select thetr
class.
XPath 2.01
这个 XPath,
//tr[td/normalize-space() = "Analyst"]/@class
将 select tr
元素的所有 @class
属性包含 td
和 space- 规范化字符串值 "Analyst"。
但是请注意,在您的示例 HTML 中,这样的 tr
没有 @class
。
1感谢指正,@DebanjanB
将您的 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
属性,所以结果为空。
有点不清楚你所说的 到底是什么意思...找到相关的 tr class 和 select tr class... 一旦您找到 ...文本分析师....
但是,由于元素是动态元素,并且要将带有文本的元素定位为 Analyst,您可以使用以下任一方法 Java 基于
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']")));
提取 <tr>
元素的 class
属性 作为 Analyst 你可以使用以下基于 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");
首先,当您有混合内容(文本和标记)时,比较元素的字符串值比文本节点更好,因为内联标记可能会将比较的文本拆分到不同的文本节点。
其次,您可以使用:
//tr[td='Analyst']/@class
注意:节点集比较是存在性比较。这意味着您在询问是否有某个节点(在本例中为某些 td
元素)的字符串值等于 'Analyst'
.
当然,在 HTML 中有一些元素的白色 space 对于渲染来说并不重要(它没有被保留),尽管它存在于源文档中。在这种情况下,您可以使用 这个简单的 XPath 1.0 表达式:
//tr[td[normalize-space()='Analyst']]/@class
请注意:当且仅当节点集为空时,它才具有假布尔值;您可以 "nest" 谓词(正确地说,谓词可以是任何 XPath 表达式)。