【问题标题】:Find the first element matching conditions with preceding-sibling找到第一个元素匹配条件与前兄弟
【发布时间】:2020-03-05 20:11:27
【问题描述】:

我的目标是在第一个前同级中找到包含匹配的文本。

我的 xpath 如下://*[@id='myid']/parent::td(/preceding-sibling::td/label/a)[1]

这里我想要td/label/a的文本最接近//*[@id='myid']的父级。

如果你发现任何错误,你能告诉我吗?非常感谢。

更新 1

这个是//*[@id='myid']/parent::td/preceding-sibling::td[2]/label/a,但不是每次都可以2,有时它可以是6或其他什么。

更新 2

示例 1

<tbody>
    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
            <label>
                <a>text</a>
            </label>
        </td>
        <td></td>
        <td>
            <input id='myid'>
        </td>
    </tr>
</tobdy>

示例 2

<tbody>
    <tr>
        <td></td>
        <td>
            <label>
                <a>text</a>
            </label>
        </td>
        <td></td>
        <td></td>
        <td></td>
        <td>
            <input id='myid'>
        </td>
    </tr>
</tobdy>

示例 3

<tbody>
    <tr>
        <td></td>
        <td>
            <label>
                <a>text</a>
            </label>
        </td>
        <td></td>
   </tr>
   <tr> 
        <td></td>
        <td></td>
        <td>
            <input id='myid'>
        </td>
    </tr>
</tobdy>

【问题讨论】:

  • 以文本格式分享 HTML
  • 是的,我会的。我添加了附加信息。
  • @Sers 我添加了两个示例。而且我必须找到一个通用的 xpath。
  • 为什么不根据 href 创建选择器?如果你想要链接
  • 您能否将您的完整代码发布为一个而不是示例数

标签: selenium xpath


【解决方案1】:

我认为你不需要去找任何祖先;只需转到前面的第一个td(包含label/a)...

//input[@id='myid']/preceding::td[label/a][1]/label/a

【讨论】:

    【解决方案2】:

    您可以在下面使用 xpath。获取第一个父母tr 和它的孩子label/a

    //input[@id='myid']/ancestor::tr[1]//label/a
    

    另一种方法是在 xpath 中将union operator 与所有定位器一起使用,以满足您的需要:

    //input[@id='myid']/ancestor::td/preceding-sibling::td/label/a | //input[@id='myid']/ancestor::tr[1]/preceding-sibling::tr//label/a
    

    【讨论】:

    • 谢谢,但是有了这个,我得到了两个元素,而不是一个。确实,我想要最近的一个。此外,有时,它可以在另一个tr 中。我添加了另一个示例。
    • 那么,用xpath,是不是不能说“根据条件取最后一个找到的元素”?
    • 如果你input元素总是最后一个,后面没有label元素,那么你可以得到最后一个
    • input 不是最后一个。但我想抓住input 之前的最后一个label/a。我希望它很清楚。
    • 小修正:| 不是“或”;这是union operator
    【解决方案3】:

    正如我在您的示例中所见,似乎表格内容是动态的,但 &lt;tbody&gt; 必须是该表格的内容。

    (//input[@id='myid']/preceding::td/label/a)[last()]
    

    【讨论】:

    • 谢谢。是的,但不是第三个。
    • 但只有在只有一个a 时它才有效,对吗?如果有几个label/a 都会被抓到吧?我只需要最后一个
    • 输入前的最后一个。
    • 我似乎(//input[@id='myid']/preceding::td/label/a)[last()] 正在工作...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2013-10-22
    • 2017-05-15
    • 2014-02-05
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多