断言 - 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.
解决方案:
解决方案是使用 contains
、equalsIgnoreCase
或 contentEquals
而不是 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
会给出更好的错误消息。
我正在使用以下代码比较两个字符串:
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.
解决方案:
解决方案是使用 contains
、equalsIgnoreCase
或 contentEquals
而不是 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
会给出更好的错误消息。