如何在 XPath“包含”函数中使用正则表达式

Posted

技术标签:

【中文标题】如何在 XPath“包含”函数中使用正则表达式【英文标题】:How to use regex in XPath "contains" function 【发布时间】:2014-02-19 17:34:30 【问题描述】:

我想使用以下正则表达式匹配以下文本sometext12345_text

我在我的一项硒测试中使用它。

String expr = "//*[contains(@id, 'sometext[0-9]+_text')]";
driver.findElement(By.xpath(expr));

但它似乎不起作用。有人可以帮忙吗?

【问题讨论】:

您使用的是什么版本的 XPath? 是什么让您认为它可能有效?您只是在猜测,还是在某处发现了误导性信息? @MichaelKay,我猜它可能支持。据此,(w3.org/TR/xquery-operators/#string.match) 可能不会。谢谢。 【参考方案1】:

XPath 1.0 本身不处理正则表达式,您可以尝试类似

//*[starts-with(@id, 'sometext') and ends-with(@id, '_text')]

(正如 paul t 所指出的,//*[boolean(number(substring-before(substring-after(@id, "sometext"), "_text")))] 可用于执行与原始正则表达式相同的检查,如果您还需要检查中间数字)

在 XPath 2.0 中,试试

//*[matches(@id, 'sometext\d+_text')]

【讨论】:

这似乎工作://*[boolean(number(substring-before(substring-after(@id, "sometext"), "_text")))],但它高度特定于这个用例 是的,正则表达式支持显然会更强大/更灵活。不错的技巧! 似乎 'ends-with()' 只带有 XPath2/XQuery 而不是 XPath1.0,证明:w3.org/TR/xpath/#section-String-Functions,w3.org/TR/xpath-functions/#func-ends-with 我如何知道我的 selenium 测试中使用了哪个版本的 xpath? 在 xpath 1.0 中不能使用 end-with,但可以完美运行:)【参考方案2】:

在 Robins 的回答中,xpath 1.0 也不支持 end-with .. 仅支持 starts-with... 因此,如果您的情况不是很具体..您可以像这样使用对我有用

//*[starts-with(@id,'sometext') and contains(@name,'_text')]`\

【讨论】:

【参考方案3】:

如果您在 Firefox 中使用 Selenium,您应该可以使用 EXSLT extensions 和 regexp:test()

这对你有用吗?

String expr = "//*[regexp:test(@id, 'sometext[0-9]+_text')]";
driver.findElement(By.xpath(expr));

【讨论】:

我正在使用 webdriver(2.39.0) 和 firefox(26.0)。我尝试了上述建议,但它导致错误。 InvalidSelectorError: Unable to locate an element with the xpath expression //*[regexp:test(@id, 'sometext[0-9]+_text')] because of the following error: [Exception... "An attempt was made to create or change an object in a way which is incorrect with regard to namespaces" code: "14" nsresult: "0x8053000e (NamespaceError)" location: "<unknown>"] 感谢您的帮助。 我对 Selenium 不熟悉,但是如果你找到一种方法在 "regexp" 前缀下注册命名空间 "http://exslt.org/regular-expressions",它可以工作 看起来问题仍然存在于注册命名空间 (code.google.com/p/selenium/issues/detail?id=1694),并且它独立于 EXSLT 扩展。有迹象表明有人在这里做***.com/a/19130149/2572383 ...啊不,我认为那里的解析是在外面完成的 @paultrmbrth - 你能帮我解决一个相关的问题吗? ***.com/questions/44292671/…

以上是关于如何在 XPath“包含”函数中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy的Xpath表达式总结

如何通过移动 xpath 与 Appium 匹配 @text 属性和正则表达式(正则表达式)来查找元素?

使用 PHP 和 XPath 获取匹配正则表达式的 href

R中的正则表达式及字符处理函数总结

正则表达式反对 XPath 之后的标记?

Python爬虫应用实战案例-xpath正则表达式使用方法,爬取精美壁纸