0

我有一个 TestNG Selenium 脚本,可以在 Chrome 和 Firefox 中运行,但在 Safari 中运行时失败。我正在使用 Assert 来验证名称,而 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);
}

4

2 回答 2

0

更新,实际答案。

getText()方法(或“getElementText”webdriver 命令)返回呈现的文本(至少根据它应该的规范)。
该页面显然对文本应用了一些 css 转换 - 节点值大写(Jeff Smith),但它返回为 JEFF SMITH(这也是您在浏览器中看到的,对吗?);这很容易做到 - 使用类似text-transform: uppercase;.

因此 Chrome 和 Firefox 正在遵循 webdriver 规范,而 Safari 显然还没有——它不返回呈现的形式,而是返回源代码中的形式。

因此,如果您只需要验证元素的内容,我建议对其文本值进行规范化 - 删除过多的空格,并将其转换为小写。
在 Java 中,你的字符串变量的名称st.trim().toLowerCase()在哪里。st

于 2019-01-25T04:34:13.207 回答
0

显然,您的代码块中没有错误,但由于WebDriver使用浏览器的 Native XPath 功能,存在Catch-22情况。

浏览器的本机 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 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);
}

注意:使用 XPath 的text()识别元素并检索文本并不是断言任何文本getText()的正确方法。也许应该使用其他一些有效的定位器策略来识别所需的元素。

于 2019-01-25T14:50:27.720 回答