繁体   English   中英

Selenium WebDriver Xpath当前元素属性报告无效的Xpath异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM