使用Safari声明文本时出现java.lang.AssertionError,但使用Selenium TestNG与Chrome和FireFox一起传递

时间:2019-01-25 00:29:00

标签: selenium safari testng native assertion

我有一个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);
}

2 个答案:

答案 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情况。

浏览器的本机XPath功能

在更高层次上,WebDriver尽可能使用浏览器的本机XPath功能。在那些没有本机XPath支持的浏览器上, Selenium 提供了自己的实现。由于各种XPath引擎之间的差异,这可能导致某些意外行为。

Browser_Native_Xpath_Capabilities

例如,下面的HTML:

<input type="text" name="example" />
<INPUT type="text" name="other" />

如果您的代码行是:

List<WebElement> inputs = driver.findElements(By.xpath("//input"));

将找到以下匹配数:

Xpath_Native_Support

解决方案

由于根据文本将元素标识为 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来标识所需的元素。