如何找到通过innerText标识的子元素的父元素?

问题描述 投票:-2回答:4

我需要在表中选择一行我有文本,因此我想利用选择文本的选项,然后最终选择父

现在页面看起来像:

<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">



&nbsp;</td>
<td class="tableBody w-tbl-cell">
&nbsp;</td>
</tr>

我需要找到文本Analyst,然后找到相关的<tr>类并选择<tr>类。

任何帮助都会非常值得赞赏

selenium selenium-webdriver xpath webdriver webdriverwait
4个回答
2
投票

首先,每当您有混合内容(文本和标记)时,最好比较元素的字符串值而不是文本节点,因为内联标记可能会将比较文本拆分为不同的文本节点。

其次,你可以使用:

//tr[td='Analyst']/@class

注意:节点集比较是一种存在性比较。这意味着你在询问是否有一些节点(在这种情况下是一些td元素),其字符串值等于'Analyst'

当然,在HTML中,尽管存在于源文档中,但是有些元素的空白对于渲染并不重要(它没有被保留)。在这种情况下,您可以使用这个简单的XPath 1.0表达式:

//tr[td[normalize-space()='Analyst']]/@class

请注意:当且仅当它是空的时,节点集具有错误的布尔值;你可以“嵌套”谓词(正确地,谓词可以是任何XPath表达式)。


2
投票

我需要找到文本Analyst,然后找到相关的tr类并选择tr类。

XPath 2.01

这个XPath,

//tr[td/normalize-space() = "Analyst"]/@class

将选择包含@classtr元素的所有td属性,其中空格标准化的字符串值为“Analyst”。

但请注意,在您的示例HTML中,这样的tr没有@class

1谢谢纠正,@ DebanjanB


1
投票

修复您的XML文件

<?xml version="1.0"?>
<!DOCTYPE stylesheet [
<!ENTITY nbsp "&#160;">
]>
<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">



&nbsp;</td>
    <td class="tableBody w-tbl-cell">
&nbsp;</td>
  </tr>
</root>

然后,您正在寻找的表达式是

//tr[td/a/text()='Analyst']/@class

但由于tr元素没有class属性,因此结果为空。


1
投票

有点不清楚你究竟是什么意思...找到相关的tr类并选择tr类...一旦你找到了...文本分析师....

但是,由于元素是动态元素,并且使用文本作为Analyst定位元素,您可以使用以下基于Java的Locator Strategies

  • 连结文字 该qazxswpo
  • cssSelector: WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Analyst")));
  • XPath的: WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("td.tableBody table.mls a[bh='HL']")))

要将WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//td[contains(@class, 'tableBody')]//table[@class='mls']//a[text()='Analyst']"))); 元素的class属性作为Analyst提取到文本,您可以使用以下基于Java的解决方案:

  • XPath的: <tr>
© www.soinside.com 2019 - 2024. All rights reserved.