
[英]Selenium Firefox/Web-Driver can't find element by XPath
[英]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。如果您查看绝对路径,您会发现差异。 关键是找到一条唯一的路径。 在许多情况下,您会发现一个 web 页面,其中您会发现许多文本框/标签/下拉菜单具有相同的 ID,但仅通过绝对路径来区分。
大多数时候,这些事情取决于用于开发网页的框架以及开发人员的偏好。 例如,用 React 开发的应用程序与使用 Angular 开发的应用程序将具有不同的 DOm 结构。
是的,你是对的,在这种情况下很难找出哪个是感兴趣的元素。 在这种情况下,不仅要依赖于特定元素,还要添加一个父/wibling 或祖先来访问该元素。 虽然这可能需要一些时间并且会很简单,但大多数时候可以找到一个唯一的 xpath。
有一些测试自动化工具,如 Ranorex,有一个 object 浏览器(称为 objext 间谍),可用于固定任何 web 元素并访问其属性,如隐藏/可见/启用等。但这些工具不是免费的: (
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.