Selenium :我有一个网页,其中两个元素具有相同的 Xpath,即使索引也不会将它们分开



当索引为 [1] 时,它们都会被识别,而对于索引 [2],它们都不会被识别。唯一将它们分开的是第一个弹出窗口有display:none,另一个弹出窗口有display:block,但他们在决定这个特定字段方面没有发挥作用,因为 Xpath,因为这些字段是从某个不同的来源获取的。

唉,这些div即使它们具有相同的元素,它们也具有文档属性,因此,这些 Xpath 不是从这个div 开始的,而是在文档的一部分之后。我已经尽我所能绞尽脑汁,我可以给你一个模糊的概念,下面的代码是什么样子的。

代码如下所示:

<div name='some-name' style="display:none;">
...
<!document>
<div id='some-id'>
....
<button name='some-name-2'>some-button-name</button>
....
</div>
...
</div>
<div name='some-name' style="display:block;">
...
<!document>
<div is='some-id'>
....
<button name='some-name-2'>some-button-name</button>
....
</div>
...
</div>

所以他们的两个Xpath看起来像:

[id='some-id']/...../button

给出 ([id='some-id']/...../button)[1] 获取这两个元素。

给予([id='some-id']/...../button)[2]不会获取它们中的任何一个。

更新

在这种情况下,我有两个 iframe,由于我必须在它们之间切换,因此无法检测到它。谢谢,我解决了这个问题。

Xpath 读取的方式是找到带有id='some-id'的元素,然后找到其中的第一个或第二个按钮。如果将其更改为将[1][2]放置在[id='some-id']之后而不是路径的末尾,则可以选择查找第一个或第二个[id='some-id'],然后选择该元素中的按钮。

除非这两个元素实际上是一个元素,否则总会有 XPath 表达式选择一个而不是另一个。事实上,这样的表达方式是无数种。诀窍在于找到一个好的 XPath 表达式,这取决于页面内容中有多少是固定的,有多少是可变的(如果数据是完全固定的,那么你甚至不需要阅读它,因为你已经知道它的一切)。

我认为您关于下标 [1] 和 [2] 不起作用的推断是不正确的。知道你实际使用了什么表达方式会很有用,因为你在帖子中写了什么:

([id='some-id']/...../button)[1]

根本不是有效的 XPath 表达式。

最新更新