[英]Selenium WebDriver Xpath current element attribute reports invalid Xpath exception
我有喜欢的html
<html>
<body>
<div class='open'>
<h1>Title</h1>
<div>Opened</div>
</div>
</body>
</html>
在我的Selenium WebDriver 3测试中,我尝试使用以下xpath选择div.open元素:
//h1/../.[contains(@class, 'open')]
在c#中的以下命令中:
driver.FindElement(By.XPath("//h1/../.[contains(@class, 'open')]"));
导致
OpenQA.Selenium.InvalidSelectorException:无效选择器:由于以下错误,无法使用xpath表达式//h1/../.[contains(@class,'open')]定位元素::无法执行'evaluate'在'Document'上:字符串'//h1/../.[contains(@class,'open')]' 不是有效的XPath表达式。
在Firefox控制台中通过相同的Xpath搜索成功找到该元素。
为什么WebDriver认为此xpath无效?
注意:我的示例当然是简化的
我想说这可能是由于规范未明确说明缩写步骤即后是否谓词.
和..
应该被允许,说明书中都没有提到缩略步骤后涉及谓词的例子。
因此,某些XPath实现只是不支持它。 我注意到,其中之一是.NET框架中的XPath实现。 其他实现明确禁止使用它,甚至为用户提供了有用的替换建议.
或..
在它们的XPath中使用等价的非缩写表达式,例如self::node()
或parent::node()
,例如xpathtester使用的实现 。 但是正如您所注意到的,其他实现可能会支持它。
作为解决方法,XPath有许多替代品,它们与您最初尝试的XPath等效或接近。 最简单的方法是扩展.
就像我在上面提到的那样 就个人而言,如果可能的话,我宁愿不要掉下树然后返回以返回父元素。 相反,只要停在我们要返回的父元素上,然后在predicate中检查子元素:
//*[contains(@class, 'open')][h1]
如果要针对“ h1”标记引用“ div”,则可以将xpath更改为以下内容:
//h1/ancestor::div[contains(@class, 'open')]
取而代之的//h1/../.[contains(@class, 'open')]
xpath
可以尝试//div[@class='open']
xpath
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.