6

我有一个非常有趣的问题。我有一个 xpath,我通过它检索值。

前任。

System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText().toString());

在 Firefox 和 Chrome 中,它给出相同的文本,而在 IE 中给出不同的文本。

各种浏览器的 xpath 之间是否有任何区别,或者这是我没有得到的其他问题。

4

5 回答 5

7

在此处阅读有关 Selenium 如何处理 Xpath的信息。

在 Chrome 和 Firefox 中,我右键单击相同的 DOM 元素(如此所述),选择“复制 Xpath”,这就是我得到的:

Chrome : //*[@id="js-pjax-container"]/div 2 /div 2 /form/button

Firefox(带有 Firebug):/html/body/div[4]/div 2 /div 2 /div 2 /form/button

(一个是带属性值,另一个(FF)是绝对路径,说明FF不理解Crhome生成的Xpath)

因此,出于 Selenium 测试的目的,它在浏览器之间很重要。(我没有在IE上测试)

我跑了这个

 @Test
        public void testGitHubButton(){
        WebDriver driver = new FirefoxDriver();
        driver.get("https://github.com/");
       String signup = driver.findElement(By.xpath("/html/body/div[4]/div[1]/div[1]/div[1]/form/button")).getText();
           Assert.assertEquals("Testing for string equality", "Sign up for GitHub", signup );
        driver.close();
        driver.quit();
        }

并且测试通过了。如果我在那里复制粘贴 Chrome 的 Xpath,它将失败。

于 2016-02-20T19:31:54.537 回答
0

首先,由开发/测试工程师 (SDET) 构建。因此,构建有效的xpath很大程度上取决于开发/测试工程师。在跨浏览器跨平台测试的情况下,优化的xpath应该同样工作。


获取文本()

getText()获取该元素的可见(即未被CSS隐藏)文本,包括子元素,即返回该元素的可见文本。

java.lang.String getText()

因此,您不必显式地强制转换返回的结果toString(),您可以将其删除。因此,您的有效代码行将是:

System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText());

规格

根据WebDriver-W3C 编辑草案

获取元素文本命令旨在返回元素的文本“呈现”。元素的渲染文本还用于通过其链接文本和部分链接文本来定位元素。

该规范的主要输入之一是开源 Selenium 项目。在编写本规范之前,它已被广泛使用,因此设定了用户对 Get Element Text 命令应该如何工作的期望。因此,这里介绍的方法已知存在缺陷,但提供了与现有用户的最佳兼容性。


为什么元素 xpath 会发生变化?

所有浏览器都没有使用相同的渲染引擎或渲染规则,这成为 Web 开发人员面临的主要障碍,而且似乎不会很快消失。


解决方案

这个问题的一揽子解决方案是尽可能使用,因为在严格的样式表规则下浏览器往往会最好地遵守。几个例子:

  • 使用HTML <!DOCTYPE> 声明:所有 HTML 文档都必须以 <!DOCTYPE> 声明开头。声明不是 HTML 标记。information对于浏览器来说,期望什么文档类型是一个问题。在 HTML 5 中,声明是:

  • 使用重置 CSS:重置样式表的目标是减少浏览器在默认行高、页边距和标题字体大小等方面的不一致。

  • 使用clearfix:清除浮动的有用方法。


这个用例

理想情况下,要提取所需的文本,您需要诱导WebDriverWait并且 visibilityOfElementLocated()您可以使用以下Locator Strategy

System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='error-box']/ul/li"))).getText());
于 2020-12-14T21:27:28.727 回答
-1

它们因浏览器而异。有些区分大小写,有些则不区分大小写。根据 w3schools.com “不幸的是,在 Internet Explorer 和其他浏览器中处理 XPath 的方式不同。”

于 2015-08-07T19:05:13.070 回答
-1

区别仅在于 IE 和 Chrome 之间的 Xpaths 中的 [Index] 数字。在 IE 中索引以 0 开头,但在 chrome 中索引以 1 开头。
示例:

如果您从 chrome 获得的 Xpath 是

/html/body/div[4]/div[3]/div[3]/div[1]/form/button 

Internet Explorer(IE) 中的相同 Xpath 将是

/html/body/div[3]/div[2]/div[2]/div/form/button

注: div 与 div[0] 相同)

由于 IE 中没有本机 Xpath 引擎,因此您可以从 chrome 复制 Xpath 并将索引减一,如上所述,通过使用我自己的将 xpath 转换为 IE 的 IHTMLElement 标记的方法,它在 HTMLDocument 中非常适合我。

于 2018-10-21T14:05:34.383 回答
-2

不,XPath 在任何地方都以相同的方式解释。

您可能需要检查 getText() 方法。

或者您可能想检查您是否在 IE 中登录了某个帐户(而不是在 chrome/FF 中),反之亦然。EG:你会为 google.com 获得一个与 google.com 不同的 DOM(登录到 google 帐户)

于 2014-04-14T09:30:49.363 回答