我正在使用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个元素的顺序很重要。
答案 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可以做的事情。