xpath对于不同的浏览器是不同的吗?

时间:2014-04-14 06:46:53

标签: selenium selenium-webdriver

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

实施例。

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

在Firefox和Chrome中它提供相同的文本,而在IE中则提供不同的文本。

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

5 个答案:

答案 0 :(得分:5)

了解Selenium如何处理Xpath here

在Chrome和Firefox中,我右键单击相同的DOM元素(如here所述),选中"复制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,它将会失败。

答案 1 :(得分:0)

仅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并将索引减少一,因此它对我来说非常适合HTMLDocument,方法是使用我自己的将xpath转换为IE的IHTMLElement标记的方法

答案 2 :(得分:0)

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


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项目。在编写此规范之前,这种方法已得到广泛使用,因此也为用户设定了“获取元素文本”命令的工作方式的期望。因此,此处介绍的方法存在缺陷,但与现有用户具有最佳兼容性。


元素xpath为什么会更改?

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


解决方案

对此问题的全面解决方案是尽可能使用,因为在严格的样式表规则下,浏览器趋向于最佳合规。几个例子:

  • 使用HTML <!DOCTYPE> Declaration:所有HTML文档必须以<!DOCTYPE>声明开头。该声明不是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());

答案 3 :(得分:-1)

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

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

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

答案 4 :(得分:-1)

每个浏览器都不同。有些是区分大小写的,有些则不是。每个w3schools.com“不幸的是,在Internet Explorer和其他浏览器中有不同的处理XPath的方法。”