我有一个TestNG Selenium脚本,它将在Chrome和Firefox中运行,但是在Safari中运行时会失败。我正在使用断言来验证名称,而Safari却没有。我仍然是菜鸟,所以我不确定从这里去哪里。感谢您的帮助
HTML:
<a href="https://xxxxxx/users/show/733981" target="_blank" xpath="1">Jeff Smith</a>
Safari错误:
java.lang.AssertionError: expected [JEFF SMITH] but found [Jeff Smith]
代码试用:
@Test(priority = 4)
public void VerifyGuest() {
WebElement guestName = driver.findElement(By.xpath("//a[contains(text(),'Jeff Smith')]"));
String expectedName = "JEFF SMITH";
String actualName = guestName.getText();
Assert.assertEquals(actualName, expectedName);
System.out.println("Reservation Code Belongs to " + actualName);
}
答案 0 :(得分:0)
更新,并提供实际答案。
getText()
方法(或“ getElementText” webdriver命令)返回呈现的文本(at least according to the specs it should)。
该页面显然在文本上应用了一些CSS转换-节点值被大写(杰夫·史密斯),但是它以JEFF SMITH的形式返回(这也是
在浏览器中看到,对吗?);这很容易做到-使用text-transform: uppercase;
之类的样式。
因此Chrome和Firefox遵循了webdriver规范,而Safari显然还没有-不会返回渲染的表单,而是源代码中的表单。
因此,如果您只需要验证元素的内容,我建议将其文本值标准化-删除过多的空格,并将其转换为小写。
在Java中,使用st.trim().toLowerCase()
完成,其中st
是您的字符串变量的名称。
答案 1 :(得分:0)
显然,您的代码块中没有错误,但是由于 WebDriver 使用Catch-22而导致Browser’s Native XPath capabilities情况。
在更高层次上,WebDriver尽可能使用浏览器的本机XPath功能。在那些没有本机XPath支持的浏览器上, Selenium 提供了自己的实现。由于各种XPath引擎之间的差异,这可能导致某些意外行为。
例如,下面的HTML:
<input type="text" name="example" />
<INPUT type="text" name="other" />
如果您的代码行是:
List<WebElement> inputs = driver.findElements(By.xpath("//input"));
将找到以下匹配数:
由于根据文本将元素标识为 Jeff Smith ,因此需要与渲染文本匹配,即 Jeff史密斯。因此,您的有效代码块将是:
@Test(priority = 4)
public void VerifyGuest() {
WebElement guestName = driver.findElement(By.xpath("//a[contains(text(),'Jeff Smith')]"));
String expectedName = "Jeff Smith";
String actualName = guestName.getText();
Assert.assertEquals(actualName, expectedName);
System.out.println("Reservation Code Belongs to " + actualName);
}
注意:使用XPath的 text()标识元素并通过getText()
检索文本不是声明的正确方法任何文本。也许应该用其他有效的Locator Strategy来标识所需的元素。