ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

R
Robin

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-Functionsw3.org/TR/xpath-functions/#func-ends-with
如何知道我的 selenium 测试中使用了哪个版本的 xpath?
不能在 xpath 1.0 中使用 end-with,但 starts-with 完美工作:)
H
Harish Kiran

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

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

p
paul trmbrth

如果您在 Firefox 中使用 Selenium,您应该可以使用 EXSLT extensionsregexp: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 扩展。有迹象表明这里有人这样做 stackoverflow.com/a/19130149/2572383 ...啊不,我认为那里的解析是在外面完成的
@paultrmbrth - 你能帮我解决一个相关的问题吗? stackoverflow.com/questions/44292671/…