【问题标题】:Selenium XPath logical AND joining multiple contains() filters?Selenium XPath 逻辑 AND 加入多个 contains() 过滤器?
【发布时间】:2020-08-20 16:33:23
【问题描述】:

我正在尝试使用 Selenium 定位以下元素:

<a class="ABC" href="#" data-test-id="XXX|YYY|ZZZ">

页面上有多个元素,“ABC”、“XXX”、“YYY”和“ZZZ”,但我的关键词是“ABC”和“ZZZ”。所以为了精确定位这个元素,我需要写如下内容:

//input[@class="ABC"] AND //*[contains(@data-test-id,'ZZZ')]")

有没有办法在单个 XPath 中编写它?

【问题讨论】:

    标签: python html xml selenium xpath


    【解决方案1】:

    使用以下 Xpath 或 css 选择器。

    Xpath:

    //a[@class='ABC' and contains(@data-test-id,'ZZZ')]
    

    CSS 选择器:

    a.ABC[data-test-id*='ZZZ']
    

    【讨论】:

    • 谢谢 - 我使用了 XPath 选项,它成功了!我找不到阅读相关语法的好资源 - 你能指导我吗?
    • 你可以向 Edureka 学习。但是如果你用 google 搜索的话,有很多博客和网站可用。
    【解决方案2】:

    您可以在 XPath 中编写复合谓词,如下所示:

    //a[@class='ABC' and contains(@data-test-id,'ZZZ')]
    

    //a[@class='ABC'][contains(@data-test-id,'ZZZ')]
    

    小心contains(),因为它的子字符串测试可能会产生误报:例如,ZZZ 也是ZZZZ 的子字符串。这种更精细的测试可以避免分隔值的问题,例如|

    //a[@class='ABC'][contains(concat('|',@data-test-id,'|'), '|ZZZ|')]
    

    【讨论】:

    • ...当然,如果需要,可以将类似的习语应用于以空格分隔的@class 属性。
    • 谢谢!它有效,我只需要用'a'替换'input'!我找不到阅读相关语法的好资源 - 你能指导我吗?
    • 我将答案更新为使用a 而不是input。 (抱歉,我查看的是您原来的 XPath,而不是原来的标记示例。)
    • 原始的XPath 1.0 recommendation 可读性非常好,是在进入 XPath 2.0 和 3.0+ 中可用的进步之前开始的好地方。如果您更喜欢一本书,请购买一本 Michael Kay 的 XSLT 书籍,其中也涵盖了 XPath。
    • @kjhughes 为了统一起见,我已将双引号编辑为单引号。让我知道编辑是否适合您。
    猜你喜欢
    • 2022-11-30
    • 2014-06-23
    • 2018-03-10
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多