Selenium XPaths中的魔术名称空间前缀

时间:2018-08-05 16:55:24

标签: java selenium-webdriver xpath xml-namespaces

名称空间的问题已在此处进行了广泛讨论,我的问题是我没有找到任何解释或文档的某些“魔术”行为:

我们来看看this网站。对于以下示例,假设我要提取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)

所以,我的问题是:在哪里可以找到负责解析名称空间前缀的代码?还有其他定义的“默认”前缀吗?

[edit] 好的,这似乎是特定于浏览器或驱动程序的。 By.xpath("//xhtml:h1")不适用于例如Firefox:-(

0 个答案:

没有答案