【问题标题】:Is xpath different for different browser?不同浏览器的 xpath 是否不同?
【发布时间】:2014-05-28 00:45:31
【问题描述】:

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

例如。

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

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

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

【问题讨论】:

  • 嗯,答案不是肯定的,也不是否定的。 IE 没有本机 XPath 引擎,因此 Selenium 使用基于 Javascript 的引擎 - 称为 Wicked Good XPath。因此,您可能会出现不一致 - 毕竟它是大多数其他浏览器本机具有的 JS 实现。另一件事是浏览器对元素的不同支持。一个常见的是某些元素 (HTML5) 中的 placeholder 属性 - 需要更多信息!!!
  • getText() 应该按照文档 (selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/…) 返回一个字符串。所以你可能最后不需要 .toString()

标签: selenium selenium-webdriver xpath webdriver xpath-1.0


【解决方案1】:

开始,由开发/测试工程师 (SDET) 构建。因此,构建有效的xpath 很大程度上取决于开发/测试工程师。在cross browsercross platform 测试的情况下,优化的xpath 应该同样有效。


getText()

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

java.lang.String getText()

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

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

规格

根据WebDriver-W3C Editor's Draft

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

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


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

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


解决方案

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

  • 使用HTML <!DOCTYPE> Declaration:所有 HTML 文档必须以 声明开头。声明不是 HTML 标记。这是一个information 给浏览器的关于期望的文档类型。在 HTML 5 中,声明是:

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

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


这个用例

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

System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='error-box']/ul/li"))).getText());

【讨论】:

    【解决方案2】:

    区别仅在于 IE 和 Chrome 之间的 Xpath 中的 [索引] 数字。在 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 中非常适合我.

    【讨论】:

      【解决方案3】:

      阅读 Selenium 如何处理 Xpath here

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

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

      Firefox(带有 Firebug):/html/body/div[4]/div2/div2/div2/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,它将失败。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          没有。 XPath 在任何地方都以相同的方式解释。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-29
            • 2016-02-16
            • 1970-01-01
            • 2011-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多