在 XPath 中,我如何寻找两个元素之间的东西?

In XPath, how do i look for something between two elements?

问题: 我正在使用 Selenium 在本网站的输入字段中输入数据。 其中一个表有问题,因为它没有这些字段的唯一 ID。 我想在“name2”的“project2”下的输入字段中输入文本。所有项目在其项目中都具有相同的名称。名称可能会更改,并且他们将来可能会添加一些新字段。

问题: 是否可以在我在 project2 之后但同时在 project3 之前做某事的地方进行 XPATH 查询? 例如://something/preceding-sibling::tr and //something_else/following-sibling::tr

提前致谢。

示例代码:

<table border="0">
    <tr><td>project1</td><td></td></tr>
    <tr><td>name1</td><td><input type="text"></td></tr>
    <tr><td>name2</td><td><input type="text"></td></tr>
    <tr><td>name3</td><td><input type="text"></td></tr>
    <tr><td>name4</td><td><input type="text"></td></tr>

    <tr><td>project2</td><td></td></tr>
    <tr><td>name1</td><td><input type="text"></td></tr>
    <tr><td>name2</td><td><input type="text"></td></tr>
    <tr><td>name3</td><td><input type="text"></td></tr>
    <tr><td>name4</td><td><input type="text"></td></tr>

    <tr><td>project3</td><td></td></tr>
    <tr><td>name1</td><td><input type="text"></td></tr>
    <tr><td>name2</td><td><input type="text"></td></tr>
    <tr><td>name3</td><td><input type="text"></td></tr>
    <tr><td>name4</td><td><input type="text"></td></tr>
</table>

截图:

你可以试试下面的 xpath :

//td[text()='project2']/../following-sibling::tr[2]/descendant::input

更新:

如果 td[2] 是问题所在,那么可能使用这个:

//td[text()='project2']/../following-sibling::*/td[text()='name2']/following-sibling::td/input

甚至下面一个:

(//*[text()='project2']/../following-sibling::*/*[text()='name2'])[1]/following-sibling::td/input

这会给你想要的:

//tr[preceding-sibling::tr[td[.="project2"]]][not(preceding-sibling::tr[td[.="project3"]])][td[.="name2"]]/td/input

以上将找到所有 <tr> 个元素:

  1. 出现在 <tr> 元素之后,该元素包含带有文本“project2”的 <td> -> [preceding-sibling::tr[td[.="project2"]]]
  2. 出现在 <tr> 元素之前,该元素包含带有文本“project3”的 <td> -> [not(preceding-sibling::tr[td[.="project3"]])]
  3. 带有文本“name2”的 <td> 元素 -> [td[.="name2"]]

然后它将向下钻取到该行中 <td> 元素内的 <input> 元素。