XPath为两个单独的路径?

问题描述 投票:1回答:2

我正在使用Selenium Webdriver使用文本的XPath在网页上查找文本。我想要查找两个单独的条件:具有类'correct'的span标记,并使用来自li标签的父标签跨越带有'answer_correction'类的标签。

有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
2个回答
1
投票

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

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

这将按顺序返回20个项目的列表。


0
投票

我会使用CSS选择器。它们更短,更易于阅读,更易于编写。

li.answer_correction > label > span , span.correct

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

CSS Selector Reference

Selenium Tips: CSS Selectors

Taming Advanced CSS Selectors

© www.soinside.com 2019 - 2024. All rights reserved.