【问题标题】:Selenium : I have a webpage where two elements have same Xpath, even index doesn't separate them apartSelenium:我有一个网页,其中两个元素具有相同的 Xpath,即使索引也不会将它们分开
【发布时间】:2018-07-12 03:29:25
【问题描述】:

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

唉,尽管这些 div 有相同的元素,但它们有一个文档属性,因此,这些 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']/...../按钮

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

Giving ([id='some-id']/...../button)[2] 不获取它们。

更新

在这种情况下,我有两个 iframe,因为我必须在它们之间切换,所以没有被检测到。谢谢,我解决了这个问题。

【问题讨论】:

  • 我怀疑您是否使用([id='some-id']/...../button)[1] 获取这两个元素,因为此 xpath 不能返回多个元素。由于您的 html 有一些 &lt;!document&gt;,因此您的问题可能是由于框架造成的。搜索如何使用 Selenium 处理帧。
  • 为什么不测试包含的 div 的样式,如果这就是全部不同的话?
  • 实际上,它根本没有被检测到,样式不是作为根来的,它结束了 选项卡之前的所有内容
  • 您的 XPath 选择器中是否有连续四个句点?或者您是否使用它来表明存在像您在代码部分中显示的干预标签?请编辑问题,以便它显示您正在使用的确切 XPath。
  • 你能给我们更多的 HTML DOM 吗?未更改、格式化、基于文本?

标签: javascript html selenium xpath


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • //*[@id="some-app"]/.../button 我尝试通过google开发人员复制整个Xpath,copy-> xpath,仍然检测到这两个元素,添加在第一个索引元素中检测到一个索引,而在 [2] 索引中没有检测到。
    • 当您不显示实际代码时,很难调试您的代码,但我强烈怀疑原始版本中的括号实际上并不存在。你想要(/a/b/c)[1](/a/b/c)[2],而不是/a/b/c[1]/a/b/c[2]
    • 确切的 Xpath 是 //*[@id="app"]/div/div[2]/div/div[1]/div/div[1]/div/div/div /div[2]/button,我试过了 (//*[@id="app"]/div/div[2]/div/div[1]/div/div[1]/div/div/div /div[2]/button)[2] 并如上所述尝试过 //*[@id="app"][2]/div/div[2]/div/div[1]/div/div[1 ]/div/div/div/div[2]/button 不起作用,两个元素都在索引 [1] 中检测到
    • iframe 是否存在问题?
    • 我不知道 Selenium 如何处理 iframe。当然,Selenium 总是有可能出错:我是从 XPath 规范的角度来回答的,而不是 Selenium 实现。
    猜你喜欢
    • 2017-12-25
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多