XPath:在包含函数中使用正则表达式

rag*_*esh 48 regex xpath contains selenium-webdriver

我想sometext12345_text使用下面的正则表达式匹配以下文本.我在我的一个硒测试中使用它.

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

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

Rob*_*bin 60

XPath 1.0本身不处理正则表达式,你可以尝试类似的东西

//*[starts-with(@id, 'sometext') and ends-with(@id, '_text')]
Run Code Online (Sandbox Code Playgroud)

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

在XPath 2.0中,试试吧

//*[matches(@id, 'sometext\d+_text')]
Run Code Online (Sandbox Code Playgroud)

  • 似乎'ends-with()'只有XPath2/XQuery而不是XPath1.0,证明:http://www.w3.org/TR/xpath/#section-String-Functions,http:// www .w3.org/TR/XPath的函数/#FUNC-端-与 (8认同)
  • 这似乎有效:`//*[boolean(number(substring-before(substring-after(@ id,"sometext"),"_ text")))]`,但它对这个用例非常具体 (3认同)
  • 不能在xpath 1.0中使用ends-with,但是启动 - 完美的工作:) (3认同)
  • 是的,正则表达式支持显然会更强大/更灵活.不错的伎俩! (2认同)
  • 我怎样才能知道在我的硒测试中使用哪个版本的xpath? (2认同)

小智 6

在 Robins 的回答中,xpath 1.0 也不支持结尾与......只支持开始......所以如果你的条件不是很具体......你可以像这样使用对我有用

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


pau*_*rth 5

如果您在Firefox中使用Selenium,则应该能够使用EXSLT扩展名regexp:test()

这对您有用吗?

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