Java Selenium XPath中的神奇名称空间前缀

Java Selenium XPath中的神奇名称空间前缀,java,selenium-webdriver,xpath,xml-namespaces,Java,Selenium Webdriver,Xpath,Xml Namespaces,名称空间的问题在这里被广泛讨论,我的问题是关于一些“神奇”的行为,我没有找到任何解释或文档: 我们来看看这个网站。对于下面的示例,假设我想要提取h1。以下操作将不起作用: WebDriver driver = new ChromeDriver(new ChromeOptions().setHeadless(true)); driver.get("https://www.w3.org/TR/2002/WD-XHTMLplusMathMLplusSVG-20020430/sample.xhtml")

名称空间的问题在这里被广泛讨论,我的问题是关于一些“神奇”的行为,我没有找到任何解释或文档:

我们来看看这个网站。对于下面的示例,假设我想要提取
h1
。以下操作将不起作用:

WebDriver driver = new ChromeDriver(new ChromeOptions().setHeadless(true));
driver.get("https://www.w3.org/TR/2002/WD-XHTMLplusMathMLplusSVG-20020430/sample.xhtml");
WebElement element = driver.findElement(By.xpath("//h1"));
System.out.println(element.getAttribute("innerHTML"));
是的,可怕的名称空间。好的,让我们添加名称空间URI。XPath变得难看,但这一个可以工作:

By.xpath("//*[local-name()='h1' and namespace-uri()='http://www.w3.org/1999/xhtml']")
但现在,我从一些我凭直觉编写的旧代码中发现,下面的代码同样有效:

By.xpath("//xhtml:h1")
这是怎么来的?这些前缀在哪里得到解决?显然,这必须由Selenium自己完成,因为如果我直接在浏览器中执行类似操作,我会得到一个关于“无法解析的名称空间”的错误:

document.evaluate('//xhtml:h1', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)
那么,我的问题是:在哪里可以找到负责解析名称空间前缀的代码?是否定义了更多的“默认”前缀


[编辑]好的,这似乎是特定于浏览器或驱动程序的
By.xpath(“//xhtml:h1”)
将无法与例如Firefox:-(

我想您正在寻找
driver.getTitle();
;)@JeffC Nope一起使用,这只是一个示例。我会让这更明显。我总是发现标题标签在使用定位器时表现得很奇怪,但我不知道为什么。我没有在其他标签上看到这个。。。你还有其他的例子吗?哦XPath引擎是特定于每个驱动程序/浏览器的,这就是为什么大多数人推荐XPath作为最后的手段。我对这个题目不感兴趣。假设我想从页面中提取任意元素。我编辑了这个问题以反映这一点,并用
h1
替换了
title
。一开始我没有意识到的是,这个特定文档被定义为XHTML文档,而不是HTML。这可能是不同行为的原因。