首页 > 解决方案 > 在 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 的实现可能会导致这个问题吗?

在此先感谢并抱歉发了这么长的帖子:$

标签: c#seleniumasp.net-corexpath

解决方案


所以事实证明这是我忽略的东西。data-original-tile 属性是根据用户鼠标输入(因为它用于有条件地显示工具提示)而设置的,并且 title 属性被清除。由于 selenium 仅触发单击事件,并且在没有明确说明的情况下实际上不会将鼠标悬停在元素上方,因此在自动化过程中不会交换属性。

结论

我应该更彻底地检查源 HTML 以了解用户交互时对 DOM 的更新。


推荐阅读