【问题标题】:Assert - 2 Exact Same String Comparing Returns Error断言 - 2 完全相同的字符串比较返回错误
【发布时间】:2017-11-24 10:23:31
【问题描述】:

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

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

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

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

测试确实运行了很多次,并且在这种情况下一直有效。 字符串内没有空格。 特殊字符在任何其他情况下都不会引起问题。

有什么想法吗?谢谢!

更新:

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

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 ?

我注意到在每种情况下,符号前都有一个空格 (_! / _? / _:)。这(符号前的空格)永远不会出现在其他传递的断言中。我正在测试其中的 500 个。可能是什么原因?

【问题讨论】:

  • 什么情况
  • From Page 和 My Test S 的差异不足以导致失败吗?
  • 不,这些只是我添加的标题。将通过编辑删除它们以避免误解。
  • 您应该尝试打印用破折号“-”包围的字符串,以确保额外的不需要和无人看管的空间不会拖累您的腿。输出字符串的长度也可能会有所帮助。
  • 谢谢,没有帮助。我试过破折号,看起来还是一样。试过.length,它们都是37个字符长,还是一样的。

标签: java string selenium gettext


【解决方案1】:

我的猜测是,文本周围的空白在 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 + 重音符号)。 Java 在内部使用 Unicode 作为文本。实际上,在比较之前应该normalize 文本。

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

顺便说一下,assertEquals 方法与 assertTrue 相比,具有预期值和实际值会提供更好的错误消息。

【讨论】:

  • 谢谢你的建议,我也想到了。我会在一段时间内测试它并回复您!
  • 已解决。我在出现错误的字符串中添加了规范化器,它就像一个魅力!非常感谢。
【解决方案2】:

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

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

在Assert.assertTrue 中,您正在比较 2 个值。第一个值是driver.findElement(By.cssSelector(cssSelector)).getText(),它可以返回text(不含空格字符)或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.

这是你失败的根源。仅当给定对象表示与此字符串等效的 String 时,这将返回 True

同样,如果您查看 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.";

并成功执行您的测试。

【讨论】:

  • 感谢您的建议。三个都试过了,可惜都没有用。这 2 个字符串中一定有一些隐蔽的区别。
  • 不,它没有从 getText 返回 null,因为我在测试期间看到了输出。我也尝试了 .getAttribute("innerHTML"),但得到了相同的结果。我更新了我的问题,请检查一下,也许有帮助。
  • 这确实使测试通过。但这不是我正在寻找的解决方案,因为我的要求是测试整个元素文本。还是谢谢你的建议!
  • 感谢您的建议,字符串的全长导致错误。我确实对您耐心地尝试提供了支持;)但是,上面@Joop Eggen 建议的规范化器解决了我的问题。
【解决方案3】:

把你的代码改成

旧:

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

新:

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

【讨论】:

  • 谢谢你的建议,很遗憾没用。
  • 字符串不相等。
【解决方案4】:

使用修剪并删除空白空间并检查它。

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

【讨论】:

  • 谢谢你的建议,很遗憾没用。
猜你喜欢
  • 2011-12-25
  • 1970-01-01
  • 2016-12-18
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多