繁体   English   中英

为什么在 XPATH 到 map 元素用于 selenium 网络驱动程序时返回 2 个相同的元素

[英]Why do 2 identical looking elements return when using XPATH to map elements for selenium web-driver

我有一段时间有这个问题,但从未对此做过任何事情,在为 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']")

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

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

如果您想访问第一个,请使用以下 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()]")

多个元素匹配同一个定位器的情况经常发生。
例如,可以为登录实现几个代码块:一个用于计算机浏览器,另一个用于移动浏览器等。将根据您浏览该页面的用途显示适当的元素。
Selenium find_element始终返回找到的与页面上传递的定位器匹配的第一个元素。
因此,如果第一个匹配元素被隐藏,则return self.browser.find_element(by=By.XPATH, value="//input[@name='username']")将始终返回该隐藏元素。
您需要使定位器更精确以匹配所需的 web 元素。
"(//input[@name='username'])[2]"这样的定位器可能不错,但最好在这里使用唯一的父元素,比如"//div[@class='pc_modal']//input[@name='username']"所以你的代码应该是这样的:

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

当网站同时具有“桌面”版本和移动或小屏幕版本时,我经常看到这种情况。 在全屏(或接近全屏)时,桌面元素可见,而小屏幕元素隐藏。 一旦您将浏览器调整得足够小,桌面元素就会隐藏起来,小屏幕元素就会变得可见。

为了以通用方式解决此问题,您可以做的是根据可见性过滤返回的两个元素,例如

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

那应该总是返回两者的可见元素。

答案在快照中:

快照

以下xpath

//input[@name='username']

标识HTML DOM中的 2 个不同元素。 在两个匹配元素中,第一个匹配元素用于移动显示,当您在桌面模式下访问DOM 树时,它会保持隐藏状态。 Chropath的给定快照中,作为modal-content-mobile的类名是最好的提示。


解决方案

在这些情况下,有不同的方法来识别所需的元素。 虽然一些用户倾向于使用index ,而一些用户倾向于探索displayedness性,但从个人角度来看,我发现向上遍历 DOM 以找到其任何祖先中属性值的差异,然后最终进行跟踪是非常容易和方便的。直到所需的元素。

嗯,从最严格的意义上讲,没有两个元素具有相同的 xpath。如果您查看绝对路径,您会发现差异。 关键是找到一条唯一的路径。 在许多情况下,您会发现一个 web 页面,其中您会发现许多文本框/标签/下拉菜单具有相同的 ID,但仅通过绝对路径来区分。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM