【问题标题】:How to locate the parent element of a child element identified through innerText?如何定位通过innerText标识的子元素的父元素?
【发布时间】:2019-04-04 22:53:27
【问题描述】:

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

现在页面看起来像:

<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,然后找到关联的&lt;tr&gt;类并选择&lt;tr&gt;类。

任何帮助都会非常感激

【问题讨论】:

    标签: selenium selenium-webdriver xpath webdriver webdriverwait


    【解决方案1】:

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

    其次,可以使用:

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

    注意:节点集比较是一种存在比较。这意味着您正在询问是否存在字符串值等于'Analyst' 的某个节点(在这种情况下为一些td 元素)。

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

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

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

    【讨论】:

    • //tr[td[normalize-space()='Analyst']]/@class 工作谢谢
    • 一个后续问题:现在,如果我想使用父子关系的概念如果我想选择,实际位于文本 Analyst 旁边的复选框,我该如何选择它 我尝试做以下事情://tr[td[normalize-space()='Analyst]]。 //输入,但它似乎不起作用
    • @supratimdutta input 元素位于另一个层次结构级别,与'Analyst' 字符串的层次结构非常不同。如果没有比您提供的输入样本更多的上下文,我只能推荐//tr[td[normalize-space()='Analyst']]/preceding::input[1]
    【解决方案2】:

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

    XPath 2.01

    这个 XPath,

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

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

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

    1感谢纠正,@DebanjanB

    【讨论】:

      【解决方案3】:

      将您的 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属性,所以结果为空。

      【讨论】:

        【解决方案4】:

        有点不清楚到底是什么意思...找到相关的 tr 类并选择 tr 类...一旦你找到 ...文本 Analyst... .

        但是,由于元素是动态元素,并且要将带有文本的元素定位为 Analyst,您可以使用以下基于 JavaLocator Strategies

        • 链接文本

          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']")));
          

        要提取&lt;tr&gt; 元素的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");
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-18
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          相关资源
          最近更新 更多