【问题标题】:How to use regex in XPath "contains" function如何在 XPath“包含”函数中使用正则表达式
【发布时间】: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) 可能不会。谢谢。

标签: regex xpath selenium-webdriver contains


【解决方案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-Functionsw3.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 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/…
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2011-02-14
    • 2018-07-14
    • 1970-01-01
    • 2020-11-21
    • 2015-03-05
    • 2018-10-25
    相关资源
    最近更新 更多