断言 - 2 完全相同的字符串比较 Returns 错误

Assert - 2 Exact Same String Comparing Returns Error

我正在使用以下代码比较两个字符串:

    Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().equals(text));

两个字符串输出在输出中完全相同:

    Merci ! Votre commande a été envoyée.
    Merci ! Votre commande a été envoyée.

测试 运行 多次,并且在这种情况之前一直有效。 字符串中没有 spaces。 特殊字符在任何其他情况下都不会引起问题。

有什么想法吗?谢谢!

更新:

我在比较这些字符串时遇到同样的错误,可能有一些共同点破坏了测试:

Merci ! Votre commande a été envoyée.
Merci ! Votre commande a été envoyée.

Référence de la commande : {0}
Référence de la commande : {0}

Contactez-moi !
Contactez-moi !

Quelle est la probabilité que vous recommandiez nous à un ami ou un collègue ?
Quelle est la probabilité que vous recommandiez nous à un ami ou un collègue ?

我注意到在每种情况下都有一个 space 符号 (_! / _? / _:)。这(符号前的 space)从未出现在其他传递断言中。我正在测试其中的 500 个。可能是原因?

使用trim并删除空的space并检查它。

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText()trim().equals(text.trim()));

将代码更改为

旧:

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().equals(text));

新:

Assert.assertTrue(text.equals(driver.findElement(By.cssSelector(cssSelector)).getText()));

让我们看看您的代码中发生了什么。您使用过:

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().equals(text));

Assert.assertTrue 中,您正在比较 2 个值。第一个值是 driver.findElement(By.cssSelector(cssSelector)).getText() 可以 return text (w/out 白色 space 字符)或 NULL。第二个值是纯 text.

现在,如果您查看 equals 的 javadoc,它被定义为:

boolean java.lang.String.equals(Object anObject)
//Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.

这是你失败的根本原因。这将 return True 仅当给定对象表示 String 等同于此字符串

同样,如果您查看 assertTrue 的 javadoc,它被定义为:

void org.testng.Assert.assertTrue(boolean condition)
//Asserts that a condition is true. If it isn't, an AssertionError is thrown.

解决方案:

解决方案是使用 containsequalsIgnoreCasecontentEquals 而不是 equals 如下:

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().contains(text));
//OR
Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().equalsIgnoreCase(text));
//OR
Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().contentEquals(text));

更新 1:

我建议使用 getAttribute("innerHTML") 而不是 getText() 如下:

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getAttribute("innerHTML").contains(text));
//OR
Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getAttribute("innerHTML").equalsIgnoreCase(text));
//OR
Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getAttribute("innerHTML").contentEquals(text));

更新 2:

由于您的测试仍然失败,我建议您将 expected string 缩减为实质内容而不是整个字符串。示例:

String text = "Votre commande a été";

更新 3:

作为最后的手段,您应该能够按如下方式扩展预期的字符串:

String text = "Merci ! Votre commande a été envoyée.";

并成功执行测试。

我的猜测是,文本周围的空白在 getText 中被修剪或添加。

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().equals(text));

可能忽略这个区别:

Assert.assertTrue(driver.findElement(By.cssSelector(cssSelector)).getText().trim()
    .equals(text.trim()));

Unicode 的另一个 属性 是 é 可以是一个字符或两个字符(e + accent)。 java 内部使用 Unicode 编码文本。实际上在比较之前应该 normalize 文字。

s = Normalizer.normalize(s, Normalizer.Form.NFKC); // Most compact

顺便说一句,与 assertTrue 不同的是,使用预期值和实际值的方法 assertEquals 会给出更好的错误消息。