如何解决3个不同的Xpath之间的差异产生相同的结果
我正在尝试找到元素<a>
。
HTML:
<html><head></head><body>
<a href="https://www.google.com">Click Here!</a>
</body></html>
以下是使用Xpath产生相同结果的Selenium代码:
driver.findElement(By.xpath("self::node()/child::node()/child::body/child::a")).click(); //Statement1
driver.findElement(By.xpath("/child::node()/child::body/child::a")).click(); //Statement2
driver.findElement(By.xpath("child::node()/child::body/child::a")).click(); //Statement3
我的理解:
在Statement1中,它将初始上下文节点称为self::node
。在这里,我们将整个HTMLDocument
传递为self::node()
。因此,我们的初始上下文节点设置为整个HTMLDocument
(也称为文档根节点(/)
)。因此,我们的初始上下文节点设置为文档根节点(/)
在Statement2中,它绝对将初始上下文节点称为文档根节点(/)
。
但是在Statement3中,没有提到初始上下文节点。
那么,这是否意味着如果我们不提及初始上下文节点,那么默认情况下是否会将其设置为文档根节点(/)
?
请帮助增进我的理解。
解决方法
从“上下文”的角度来看,您的1和3语句是相同的(self
和child
都是xpath轴)。两者都以文档的根为上下文(在Selenium中,它称为SearchContext
)。
在这种情况下,上下文是根目录,因为您可以在驱动程序内直接查找元素。如果您将使用WebElement
并尝试在该元素中查找元素,则对于1和3语句,上下文将不会是root
。
下面是一些更详细的说明。
假设我们有test.html
,其内容如下:
<A val="success A">
<B val="success B"/>
</A>
和这样的测试:
@Test
public void test(){
driver.get("file:///path_to_page/test.hml");
WebElement a = driver.findElement(By.xpath("html/body/A")); // (1,2)
System.out.println(a.getAttribute("val"));
try{
System.out.println(driver.findElement(By.xpath("body/A/B")).getAttribute("val")); // (3)
}catch (NoSuchElementException e){
System.out.println("body/A/B cannot be found as the context is root");
}
WebElement b = a.findElement(By.xpath("B")); // (4)
System.out.println(b.getAttribute("val"));
System.out.println(b.findElement(By.xpath("/html/body/A")).getAttribute("val")); // (5)
}
以下是明显点:
- 尽管我们的文件具有根
A
,但浏览器会自动添加html标签以使html文件有效。因此它添加了html
节点和body
节点 - 考虑上一点,我们从访问具有
html/body/A
上下文的root
开始 - 然后,确保由于上下文仍为
B
,因此无法使用路径body/A/B
找到root
。 - 然后我们看到可以在先前位于
B
的上下文中找到A
。 - 最后一件事是我们正在
/html/body/A
的上下文中查找B
。尽管我们使用B
作为搜索上下文,但仍然可以找到该元素,因为我们从/
开始,这意味着root
的路径而忽略了任何搜索上下文。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。