【问题标题】:Finding WebElement by Xpath Using Regex使用正则表达式通过 Xpath 查找 WebElement
【发布时间】:2015-05-14 02:06:50
【问题描述】:

我有以下 WebElement:

<input id="" type="checkbox" value="/p1/foobar1" name="checkbox1" partition="p1" onclick=""/>
<input id="" type="checkbox" value="/p1/foobar" name="checkbox2" partition="p1" onclick=""/>
<input id="" type="checkbox" value="/p2/foobar2" name="checkbox3" partition="p2" onclick=""/>

我想在 xpath 中使用正则表达式根据 value 属性在上述源中找到第二个元素(值为 /p1/foobar 的那个)。我尝试了以下方法:

driver.findElement(By.xpath("//input[matches(@value,'.*\\/foobar$')]"));

但它会引发 InvalidSelectorException。我已经让它像这样与 cssSelector 一起使用......

driver.findElement(By.cssSelector(input[value$='\\/foobar']));

但我仍然很好奇如何使用 xpath 完成此任务。有什么建议吗?

编辑:我还应该注意,我希望能够在不知道最后一个斜杠之前的字符的情况下找到这个元素(又名/p1/

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

    试试

    //input[@value='/p1/foobar']
    

    如果你不知道它从什么开始,你必须求助于函数:

    //input[contains(@value, 'foobar') and substring-after(@value, 'foobar') = '']
    

    这是一个“小提琴”

    <?xml version="1.0" encoding="UTF-8"?>
    <result>
    <input id="" name="checkbox1" onclick="" partition="p1" type="checkbox" value="/p1/foobar1"/>
    <input id="" name="checkbox2" onclick="" partition="p1" type="checkbox" value="/p1/foobar"/>
    <input id="" name="checkbox3" onclick="" partition="p2" type="checkbox" value="/p2/foobar2"/>
    </result>
    

    http://www.xpathtester.com/xpath/4dc56e27ca1674ea0b5b48357214b907

    Can I use a Regex in an XPath expression? 中所述,XPath 1.0 不支持正则表达式。

    这里有很多例子:

    https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx

    这是 XPath 函数的列表:

    https://msdn.microsoft.com/en-us/library/ms256180(v=vs.110).aspx

    【讨论】:

    • 感谢您的回复,但请查看我的编辑。我试图在不知道最后一个斜杠之前的字符的情况下找到这个元素。
    【解决方案2】:

    XPath 不支持正则表达式。您将不得不求助于其他 XPath 函数,对于您的示例,您可以使用以下内容:

    //input[ends-with(@value,'foobar')]
    

    有一个很好的 XPath 函数列表here

    【讨论】:

    • ends-with 是 xpath 2.0 版的一部分。 Selenium 支持吗?
    • 是的,不幸的是,它似乎对我不起作用。
    【解决方案3】:

    使用 xpath 包含函数。相当复杂。可能你不想走这条路。但是也可以这样做

    //input[contains(@value,'foo') and (not(contains(@value,'foobar1'))) and (not(contains(@value,'foobar2')))]
    

    *记住复杂性,我认为 CssSelector 最适合这种情况。

    【讨论】:

    • 这行不通,因为其他元素属性也包含foobar
    • 克洛伊是正确的。这将找到第一个 web 元素,因为它还包含 foobar,而不是第二个。
    • @Saifur 我真的在尝试使用matches 和正则表达式来完成这个webelement 查找。它不应该依赖于所有其他来源的知识。
    • @user2150250 据我所知,Selenium 只支持 xpath 版本 1,它不支持广泛的正则表达式搜索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多