XPath为两个单独的路径?

时间:2018-01-01 07:00:41

标签: python selenium xpath

我正在使用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'all_corrections'的列表

当我颠倒订单时,

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

只返回16个'正确'元素。

这导致人们相信陈述中的'或'有问题。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

这将返回20个项目的列表,所有项目都按顺序排列。

答案 1 :(得分:0)

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

li.answer_correction > label > span , span.correct

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

CSS Selector Reference

Selenium Tips: CSS Selectors

Taming Advanced CSS Selectors