【问题标题】:Selenium WebDriver Xpath current element attribute reports invalid Xpath exceptionSelenium WebDriver Xpath 当前元素属性报告无效 Xpath 异常
【发布时间】:2017-10-15 10:07:16
【问题描述】:

我有喜欢的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')] 找到元素:: 无法对“文档”执行“评估”:字符串 '//h1/../.[contains(@class, 'open')]'不是有效的 XPath 表达式。

在 Firefox 控制台中通过相同的 Xpath 搜索成功定位到元素。

任何想法为什么 WebDriver 认为这个 xpath 无效?

注意:我的例子当然是简化的

【问题讨论】:

    标签: selenium xpath selenium-webdriver


    【解决方案1】:

    代替//h1/../.[contains(@class, 'open')]xpath你能试试//div[@class='open']xpath

    【讨论】:

    • 并非如此。你可以认为我有很多
      ,所以这行不通。另外我的主要问题是为什么这被认为是 INVALID XPATH。
    • @Jeni 我认为如果您遇到困难,您需要提出一个由您所做的相关工作/研究以及测试环境详细信息和错误堆栈跟踪支持的适当问题。请相应地更新您的问题和详细信息。谢谢
    【解决方案2】:

    如果您想针对“h1”标签引用“div”,则可以将 xpath 更改为以下内容:

    //h1/ancestor::div[contains(@class, 'open')]
    

    【讨论】:

    • 我认为这不是 OP 所要求的
    • 谢谢!如果我使用父代,而不是祖先(因为祖先选择更多节点)//h1/parent::div[contains(@class, 'open')],这可行,并且看起来完全一样。但正如 Narendra 指出的那样,如果我知道我的 xpath 失败的原因会很好。
    【解决方案3】:

    我会说这可能是因为the specification 没有明确说明是否应该允许 缩写步骤... 之后的谓词,规范都没有提到涉及缩略步骤后的谓词。

    所以一些 XPath 实现就是不支持它。我注意到其中之一是 .NET 框架中的 XPath 实现。其他实现明确禁止它,甚至为用户提供有用的建议,将其 XPath 中的... 替换为等效的未缩写表达式,依次为self::node()parent::node(),例如, xpathtester。但正如您所注意到的,其他实现可能支持它。

    作为解决方法,有许多 XPath 替代方案与您最初尝试的 XPath 相当或足够接近。正如我上面提到的,最简单的方法是将. 扩展为其未缩写的表达式。就个人而言,如果可能的话,我不喜欢沿着树向下然后返回以返回父元素。相反,只需停在我们要返回的父元素,并检查谓词中的子元素:

    //*[contains(@class, 'open')][h1]
    

    【讨论】:

    • 非常感谢!我现在很清楚了。即使我从实现点发现这不一致,因为同一个库认为以下路径有效 "//*[contains(@class, 'open')][h1]" - 当 * 在规范中也被声明为缩写时.无论如何,很好的答案,再次感谢!
    • 很高兴它有帮助。旁注,* 本身不是缩写(在Name Test 部分中明确提及)。我相信在缩写语法部分中提到了*,因为它选择子元素而不指定轴,即*,而不是更冗长的表达式child::*
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签