我有一个非常有趣的问题。我有一个 xpath,我通过它检索值。
前任。
System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText().toString());
在 Firefox 和 Chrome 中,它给出相同的文本,而在 IE 中给出不同的文本。
各种浏览器的 xpath 之间是否有任何区别,或者这是我没有得到的其他问题。
我有一个非常有趣的问题。我有一个 xpath,我通过它检索值。
前任。
System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText().toString());
在 Firefox 和 Chrome 中,它给出相同的文本,而在 IE 中给出不同的文本。
各种浏览器的 xpath 之间是否有任何区别,或者这是我没有得到的其他问题。
在此处阅读有关 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,它将失败。
首先,xpath由开发/测试工程师 (SDET) 构建。因此,构建有效的xpath很大程度上取决于开发/测试工程师。在跨浏览器和跨平台测试的情况下,优化的xpath应该同样工作。
getText()
获取该元素的可见(即未被CSS隐藏)文本,包括子元素,即返回该元素的可见文本。
java.lang.String getText()
因此,您不必显式地强制转换返回的结果toString()
,您可以将其删除。因此,您的有效代码行将是:
System.out.print(driver.findElement(By.xpath("//*[@id='error-box']/ul/li")).getText());
获取元素文本命令旨在返回元素的文本“呈现”。元素的渲染文本还用于通过其链接文本和部分链接文本来定位元素。
该规范的主要输入之一是开源 Selenium 项目。在编写本规范之前,它已被广泛使用,因此设定了用户对 Get Element Text 命令应该如何工作的期望。因此,这里介绍的方法已知存在缺陷,但提供了与现有用户的最佳兼容性。
所有浏览器都没有使用相同的渲染引擎或渲染规则,这成为 Web 开发人员面临的主要障碍,而且似乎不会很快消失。
这个问题的一揽子解决方案是尽可能使用css,因为在严格的样式表规则下浏览器往往会最好地遵守。几个例子:
使用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());
它们因浏览器而异。有些区分大小写,有些则不区分大小写。根据 w3schools.com “不幸的是,在 Internet Explorer 和其他浏览器中处理 XPath 的方式不同。”
区别仅在于 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 中非常适合我。
不,XPath 在任何地方都以相同的方式解释。
您可能需要检查 getText() 方法。
或者您可能想检查您是否在 IE 中登录了某个帐户(而不是在 chrome/FF 中),反之亦然。EG:你会为 google.com 获得一个与 google.com 不同的 DOM(登录到 google 帐户)