如何在 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“包含”函数中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
如何通过移动 xpath 与 Appium 匹配 @text 属性和正则表达式(正则表达式)来查找元素?