【问题标题】:XPath for two separate paths?两个独立路径的 XPath?
【发布时间】:2018-01-01 07:00:41
【问题描述】:

我正在使用 Selenium Webdriver 使用文本的 XPath 来定位网页上的文本。我要查找两个单独的条件:具有“正确”类的跨标签和具有“answer_correction”类的 li 标签的父标签的跨标签。

有 4 个“answer_corrections”元素和 16 个“正确”元素。

到目前为止,我想出的 XPath 是:

answers = browser.find_elements_by_xpath('//li[@class="answer_correction"]/label/span' or '//span[@class="correct"]')

我认为这应该从两个条件返回一个 WebElements 列表。

这段代码:

browser.find_elements_by_xpath('//li[@class="answer_correction"]/label/span')

按预期返回一个包含 4 个元素的列表。

这段代码:

 browser.find_elements_by_xpath('//span[@class="correct"]')

按预期返回一个包含 16 个元素的列表。

但是,当我尝试使用我创建的 XPath 来合并两者时,它只返回“或”之前第一个路径中的 Web 元素。

answers = browser.find_elements_by_xpath('//li[@class="answer_correction"]/label/span' or '//span[@class="correct"]')

仅返回 4 个“answer_corrections”的列表

当我颠倒顺序时,

answers = browser.find_elements_by_xpath('//span[@class="correct"]' or '//li[@class="answer_correction"]/label/span')

仅返回 16 个“正确”元素。

这导致人们相信语句中的“或”有问题。

将两个单独的 XPath 合并为一个的正确方法是什么?

我不能只将一个列表附加到另一个列表上,因为 20 个元素的顺序很重要。

【问题讨论】:

    标签: python selenium xpath


    【解决方案1】:

    找到我自己的答案! “或”运算符不适用于计算 2 个节点集。对于该任务,您必须使用“|”操作员。 | != 或。因此,将两者结合起来的正确 XPath 是:

    answers = browser.find_elements_by_xpath('//li[@class="answer_correction"]/label/span | //span[@class="correct"]')
    

    这会返回一个包含 20 个项目的列表,全部按顺序排列。

    【讨论】:

      【解决方案2】:

      我会为此使用 CSS 选择器。它们更短,更容易阅读,也更容易编写。

      li.answer_correction > label > span , span.correct
      

      CSS 选择器更快,支持更广泛。我确实使用 XPath,但只有当我需要通过包含的文本查找元素时,这是只有 XPath 才能做到的。

      CSS Selector Reference

      Selenium Tips: CSS Selectors

      Taming Advanced CSS Selectors

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 2019-07-24
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多