在 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>
个元素:
- 出现在
<tr>
元素之后,该元素包含带有文本“project2”的 <td>
-> [preceding-sibling::tr[td[.="project2"]]]
- 出现在
<tr>
元素之前,该元素包含带有文本“project3”的 <td>
-> [not(preceding-sibling::tr[td[.="project3"]])]
- 带有文本“name2”的
<td>
元素 -> [td[.="name2"]]
然后它将向下钻取到该行中 <td>
元素内的 <input>
元素。
问题: 我正在使用 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>
个元素:
- 出现在
<tr>
元素之后,该元素包含带有文本“project2”的<td>
->[preceding-sibling::tr[td[.="project2"]]]
- 出现在
<tr>
元素之前,该元素包含带有文本“project3”的<td>
->[not(preceding-sibling::tr[td[.="project3"]])]
- 带有文本“name2”的
<td>
元素 ->[td[.="name2"]]
然后它将向下钻取到该行中 <td>
元素内的 <input>
元素。