c# - 在 Selenium .NET Core 项目中使用 XPath 选择属性时出现问题
问题描述
我有一个奇怪的问题,我似乎无法在这个论坛(或互联网上的其他地方)上找到解决方案
我正在使用 Selenium 和 .NET Core 3.1 构建一个测试自动化应用程序。我正在尝试使用OpenQA.Selenium.IWebDriver
以前选择OpenQA.Selenium.IWebElement
的和 Xpath 选择器在 DOM 中选择一个元素,如下所示:
IWebElement parent => driver.FindElement(By.CssSelector("#parent"));
IWebElement child(string t) = parent.FindElement(By.XPath($".//li[@data-original-title=\"{t}\"]"))
...
var el = child("'title-1'");
DOM 如下:
<div id="parent">
... <!-- child element is nested multiple levels -->
<li title data-original-title="'title-1'"></li>
<li title data-original-title="'title-2'"></li>
...
</div>
当我尝试执行此操作时,我收到以下错误:
OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"xpath","selector":".//li[@data-original-title="'title-1'"]"} (Session info: chrome=85.0.4183.102)
但是,当我复制这个显然不存在的 xpath 并使用 chrome 调试器搜索 dom 时,它确实与元素匹配。
然后我试图找出可能是什么原因,也许是我与父母或某事犯了错误。所以我为子选择器尝试以下 XPath,匹配另一个属性(没有值)
IWebElement child(string t) = parent.FindElement(By.XPath($".//li[@title]"))
这确实返回了一个元素,并且在检查调试器之后它是我想要的子元素。现在我假设字符串的格式一定有问题所以我尝试下面的选择器(没有值)
IWebElement child(string t) = parent.FindElement(By.XPath($".//li[@data-original-title]"))
这会产生(大致)与以前相同的错误:
OpenQA.Selenium.NoSuchElementException:没有这样的元素:无法找到元素:{"method":"xpath","selector":".//li[@data-original-title]"}(会话信息:chrome=85.0 .4183.102)
再次,当我尝试使用上述 xpath 使用 chrome 调试器中的搜索功能在 DOM 中查找元素时,.//li[@data-original-title]
它确实与我预期的子元素匹配。
所以我现在认为连字符一定会导致问题。我尝试对这个问题进行一些研究,但我能找到的唯一真实的东西是这篇 stackoverflow 文章
在这里,他们建议改用 CSS 选择器,我尝试过但也没有用,此外,我认为相对于父函数的相关功能不适用于 CSS 选择器。
在这篇文章中,发帖人评论说问题最终是由 DOM 结构引起的,这对我没有多大帮助,也让我觉得我只是在我一直忽略的某个地方犯了一个大错误。
结论
基于上面的 XPath 选择器,我做错了什么导致我的不匹配,或者我应该知道的 chrome 调试器与 .NET Core Selenium 库中 XPath 的实现可能会导致这个问题吗?
在此先感谢并抱歉发了这么长的帖子:$
解决方案
所以事实证明这是我忽略的东西。data-original-tile 属性是根据用户鼠标输入(因为它用于有条件地显示工具提示)而设置的,并且 title 属性被清除。由于 selenium 仅触发单击事件,并且在没有明确说明的情况下实际上不会将鼠标悬停在元素上方,因此在自动化过程中不会交换属性。
结论
我应该更彻底地检查源 HTML 以了解用户交互时对 DOM 的更新。
推荐阅读
- c# - Linq/Entity Framework 查询无法识别我的所有范围变量
- javascript - 在按钮单击时将字符串插入 div 并在下次单击之前将其清除
- algorithm - 对大数组进行排序,保留一些元素(每种语言)
- javascript - 如何按 id 打印所有元素(JS,PHP)
- c# - SRP 和类内的附加逻辑
- swift - Swift 默认重载不可用 - 找不到 SCNReferenceNode(named: )
- user-interface - 如何将屏幕的一部分“流式传输”到另一部分
- asp.net-mvc - ASP.net MVC - 视图中的动态引导进度条
- parsing - 在 Julia 1.xx 中解析无符号整数数组
- python - 没有 PANDAS 的 Python 聚合