我正在使用此代码比较两个字符串:
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个。可能是原因?
答案 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));
我建议使用 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));
由于您的测试仍然失败,我建议您将expected string
减少到实质性而不是整个字符串。例如:
String text = "Votre commande a été";
作为最后的手段,您应该能够扩展预期的字符串,如下所示:
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()));