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

时间:2017-11-24 10:23:31

标签: java string selenium gettext

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

    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个。可能是原因?

4 个答案:

答案 0 :(得分:4)

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

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

可能无视这种差异:

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

Unicode的另一个属性是é可以是一个char或两个(e +重音)。而java内部使用Unicode作为文本。实际上,在比较之前,应该normalize发短信。

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

顺便说一下assertTrue而不是assertEquals方法<!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>Cube_v2</title> <style> body { margin: 0; } canvas { width: 100%; height: 100% } </style> </head> <body> <script src="build/three.js"></script> <script> var scene = new THREE.Scene(); scene.background = new THREE.Color( 0xf0f0f0 ); var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); var renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); var geometry = new THREE.BoxGeometry( 1, 1, 1 ); var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); var cube = new THREE.Mesh( geometry, material ); //cube.position.x = 100; //cube.translateX = 100; //three.cube.position.x = 100; scene.add( cube ); camera.position.z = 10; camera.position.x = 10; var geometry_2 = new THREE.BoxGeometry( 2, 2, 2 ); var material_2 = new THREE.MeshBasicMaterial( { color: 0xff0000 } ); var cube_2 = new THREE.Mesh( geometry_2, material_2 ); scene.add( cube_2 ); function animate() { requestAnimationFrame( animate ); cube.rotation.y += 0.01; cube_2.position.x += 0.05; renderer.render( scene, camera ); } animate(); </script> </body> </html> 的预期值和实际值会提供更好的错误消息。

答案 1 :(得分:1)

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

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.

这是你失败的根本案例。仅当给定对象表示与此字符串

等效的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.";

成功执行测试。

答案 2 :(得分:0)

使用修剪并删除空白区域并进行检查。

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

答案 3 :(得分:0)

将您的代码更改为

旧:

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

新:

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