【问题标题】:Why do 2 identical looking elements return when using XPATH to map elements for selenium web-driver为什么在使用 XPATH 为 selenium web-driver 映射元素时返回 2 个外观相同的元素
【发布时间】:2023-02-01 01:14:08
【问题描述】:

我有一段时间有这个问题,但从未对此做过任何事情,在为 UI 测试映射某些元素时,我有时会遇到返回 2 个相同结果的元素。

我们过去通过使用findelements 然后使用索引 [1] 解决了这个问题

但是我仍然不明白为什么当我在应该定位的代码中只能看到 1 个元素时它返回 2 个元素。

示例如下,您可以在下面看到此用户名字段框

如果我使用一些 xpath 之类的

//input[@name='username']

我只希望得到 1 个元素作为回报,但使用工具 Chropath 我可以看到我得到 2 个元素作为回报

这些元素看起来相同,一个没有隐藏等等。 我一直不明白为什么会这样,因为如果我使用 findelement。我收到一个元素不可交互错误,因为我猜驱动程序无法决定使用哪个元素?或者他们互相妨碍。

所以我一直使用的解决方法是

return self.browser.find_elements(by=By.XPATH, value="//input[@name='username']")[1]

当我实际上应该能够使用

return self.browser.find_element(by=By.XPATH, value="//input[@name='username']")

任何有助于理解为什么会这样的帮助将不胜感激

【问题讨论】:

  • 你能提供网址吗?谢谢
  • 不幸的是,我不能将 url 作为其内部共享,但我只是想知道其他软件测试人员是否遇到过这个问题。

标签: selenium xpath


【解决方案1】:

页面上可能有多个具有相同名称属性的相同元素。一个必须隐藏。

如果要访问第一个,请使用以下 xpath。

return self.browser.find_element(by=By.XPATH, value="(//input[@name='username'])[1]")

如果你想访问最后一个使用以下

return self.browser.find_element(by=By.XPATH, value="(//input[@name='username'])[last()]")

【讨论】:

    【解决方案2】:

    严格来说,没有两个元素具有相同的 xpath。如果您查看绝对路径,您会发现不同之处。关键是找到一条唯一的路径。在许多情况下,您会发现一个网页,其中有许多文本框/标签/下拉菜单,它们具有相同的 ID,但仅通过它们的绝对路径来区分。

    大多数时候,这些事情取决于用于开发网页的框架以及开发人员的偏好。例如,用 React 开发的应用程序与使用 Angular 开发的应用程序将具有不同的 DOm 结构。

    是的,你是对的,在这种情况下很难找出哪个是感兴趣的元素。在这种情况下,不仅要依赖于特定元素,还要添加一个父/wibling 或祖先来访问该元素。虽然这可能需要一些时间并且会很简单,但大多数时候都可以找到唯一的 xpath。

    有一些测试自动化工具,如 Ranorex,有一个对象浏览器(称为 objext spy),可用于固定任何 Web 元素并访问其属性,如隐藏/可见/启用等。但这些工具不是免费的: (

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2013-06-16
      • 2013-09-17
      • 2019-11-09
      • 2015-09-17
      相关资源
      最近更新 更多