Java Selenium XPath:祖先不包含

Java Selenium XPath:祖先不包含,java,selenium-webdriver,xpath,Java,Selenium Webdriver,Xpath,查找类为“bar”的div,其祖先在顶级“foo”范围内没有类“foo”。比如说, <div class="foo"> <div class="foo"> <div><div> <div class="bar"> </div> </div></div> </div> <div class="bar">

查找类为“bar”的div,其祖先在顶级“foo”范围内没有类“foo”。比如说,

<div class="foo">
    <div class="foo">
         <div><div>
         <div class="bar"> </div>
         </div></div>
    </div>

    <div class="bar"> </div>
</div>
但是XPath返回两个元素。还尝试了css选择器:

root.findElements(By.cssSelector(":not(.foo) .bar"));

也不起作用。

请尝试此XPath-1.0表达式:

//div[contains(@class, 'bar') and not(ancestor::*[@class='foo'])]

它只返回一项:所需的

此项仅返回第二条(至少当我运行它时…)


如果您试图使用bar类访问直接子div,那么下面是xpath

//div[@class='bar' and parent::div[@class='foo']]

很抱歉我的场景是在一个范围内查找元素。更新问题。我尝试了您的xpath,如果使用作用域进行搜索,则不会返回任何结果。谢谢。不确定为什么会被否决。我复制了OP发布的HTML,并使用Chrome的内置
$x
运行了这个查询,它返回了一个
元素,该元素没有封装在
中。OP,试着在Chrome控制台上运行它,看看它是否有效:
$x('//div[contains(@class,“bar”)而不是(祖先::div[contains(@class,“foo”))])我的错误。我的实际场景是在上下文元素中搜索栏。这个答案建议的xpath即使不在范围内也可以工作。问题已更新。
//*[@class='bar'][(parent::div[@class='foo'])]
//div[@class='bar' and parent::div[@class='foo']]