在Selenium .NET Core项目中使用XPath选择属性时出现问题

时间:2020-09-30 13:55:26

标签: c# selenium asp.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 .//li[@data-original-title]在chrome调试器中使用搜索功能在DOM中查找元素时,匹配预期的子元素。

所以我现在认为连字符必须引起问题。我对此问题进行了一些研究,但我唯一能找到的是this stackoverflow article

在这里,他们建议改用CSS选择器,我尝试过也没有用,而且我认为相对于父函数的CSS选择器不起作用。

在本文的发帖人comments中,问题最终是由DOM结构引起的,这对我没有多大帮助,也使我认为我只是犯了一个大错误,一直在俯视。

结论

基于上述XPath选择器,我做错了什么导致我的不匹配,或者我应该知道,chrome调试器与.NET Core Selenium库在XPath的实现方面可能存在差异,可能会导致此问题问题?

在此先感谢并感谢您发表冗长的帖子:$

1 个答案:

答案 0 :(得分:0)

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

结论

我应该更彻底地检查源HTML,以获取有关用户交互的DOM更新。