【问题标题】:InvalidSelectorError, need help defining my xpath selectorInvalidSelectorError,需要帮助定义我的 xpath 选择器
【发布时间】:2017-10-15 23:48:53
【问题描述】:

我在看一棵巨大的dom树。使用 NodeJS/Selenium,我特别需要在 a 标签中按标题查找,并且需要单击关联的 href。我对正则表达式非常陌生,并且已经遇到很多错误。

这是我迄今为止最好的尝试:

By.xpath(//ul/class='slds-grid'//a[title="${uniqueStringToMatch}"]).click()

得到

InvalidSelectorError:无效选择器:无法使用 xpath 定位元素 表达式 //ul/class='slds-grid slds-grid--pull-padded slds-wrap list'//a[text()="Load Client Referrals"] 因为以下 错误:语法错误:无法对“文档”执行“评估”:类型 计算表达式时转换失败。

下面的树省略了上面的所有层次结构,因为我认为这并不重要,但如果我错了,请纠正我。从树中的第一个唯一的 className...

    <ul class='slds-grid'>
        <li class='slds-col'>
            <a class="app_launcher" href="thelinkIwantToclick" title="uniqueStringToMatch"
                <span class="label-ctr">
            </a>
        </li>
        <li class='slds-col'>
            <a class="app_launcher" href="thelinkIwantToclick" title="uniqueStringToMatch"
                <span class="label-ctr">
            </a>
        </li>
        <li class='slds-col'>
            <a class="app_launcher" href="thelinkIwantToclick" title="uniqueStringToMatch"
                <span class="label-ctr">
            </a>
        </li>
    </ul>

li 中的所有标题都是唯一的。

我正在使用W3学校学习,但是这里时间不多了。

(我也在寻找自己编写 xpath 的最快方法 - 工具或教程将不胜感激!)

【问题讨论】:

  • @Mark 现在我正在使用这个: //ul[@class="slds-grid"]/li/a[@title="uniqueStringToMatch"] 我收到一个新错误:NoSuchElementError:没有这样的元素:无法定位元素:{"method":"xpath","selector":"//ul[@class='slds-grid slds-grid--pull-padded slds-wrap list']/li /a[@title="Accounts"]"} 我用 Chrome Xpath Helper 插件验证了这是完美的 xpath

标签: javascript html selenium dom xpath


【解决方案1】:

我现在无法测试它,但我通常使用@语法来匹配 XPath 中的属性。像这样的东西对你有用吗?

By.xpath("//ul[@class='slds-grid']//a[@title='${uniqueStringToMatch}']").click()

我还发现很难找到简单 XPath 的初学者级教程,最终通过反复试验学到了很多东西。 Chrome 和 Firefox 也有一个扩展,它为网页中的元素生成 XPath 字符串,我从中学到了很多。

【讨论】:

  • 还没有运气。我也尝试将 /.. 添加到末尾,但同样的错误。 By.xpath(//ul/class='slds-grid'//a[@title="${page}"]/..).click()
  • 更新了上面的 dom 树以反映实际架构
  • //ul[@class="slds-grid slds-grid--pull-padded slds-wrap list"]/li/a[@title="${page}"]跨度>
【解决方案2】:

与阅读 W3C XPath 1.0 规范相比,您可能做得更糟:与后来的规范相比,它出奇地短且易读

https://www.w3.org/TR/xpath/

当然,与尝试通过反复试验或复制粘贴示例来学习相比,您将节省大量时间。当然,每个人都有自己的学习方式。

但是当我看到类似的东西时

//ul/class='slds-grid'//a[title="${uniqueStringToMatch}"]

我只是想知道你到底在想什么:你显然还没有掌握路径和步骤的核心概念。

XPath 中有两个基本操作。

  • A/B意思是找到A选择的东西,从那里开始,再找到B选择的东西。

  • A[P]的意思是找到A选择的东西,然后剔除那些不符合条件P的东西。

您的class='slds-grid' 显然是一个过滤条件,并且(因为类和标题是属性而不是元素)因此应该是

//ul[@class='slds-grid']//a[@title="${uniqueStringToMatch}"]

顺便说一句,XPath 几乎与正则表达式无关。

【讨论】:

  • 感谢您的厚爱 :) 自从我的原始帖子以来,我来到了以下内容:现在我正在使用这个://ul[@class="slds-grid"]/li/a [@title="uniqueStringToMatch"] 我收到一个新错误:NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"//ul[@class='slds-grid slds-grid--pull-padded slds-wrap list']/li/a[@title="Accounts"]"} 我用 Chrome Xpath Helper 插件验证了这是完美的 xpath –
  • 试过你的xpath,同样的错误。有道理,因为我正在学习 //a 与 /li/a 做同样的事情(我确实在 W3 上读过关于高级别的文章)
  • 我应该提一下,我正在使用这个符号“${uniqueStringToMatch}”
  • 对我来说,错误消息中的 XPath 表达式与您所说的正在使用的表达式不同,这似乎很奇怪。但这是特定于您的代码或 XPath 引擎或 API 的内容,因此我无法帮助您。
【解决方案3】:

//ul[@class="slds-grid"]//a[@title="uniqueStringToMatch"]

【讨论】:

  • 谢谢你们:迈克尔和马克!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多