我正在创建一个使用量角器和其他库(如柴,黄瓜和小黄瓜)的测试工具。我有三个文件:
my_feature.feature
# features/my_feature.feature
Feature: Test cucumber automation
As a front-end developer
I want to automate e2e testing
Scenario: Altro test
Given I go on "file:///Users/Emanuele/Desktop/lavoro/test-automation/app/html/index.html"
Then The text of the element with selector "#test-button" should be "My button"
test_step.js
'use strict';
var chai = require('chai'),
chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var expect = chai.expect;
// Protractor won't wait for Angular
browser.ignoreSynchronization = true;
module.exports = function() {
this.World = require('../support/world').World;
// default timeout for all step definitions
this.setDefaultTimeout(20 * 1000);
/*
** Open a page based on an absolute url
** Ex. https://www.google.com
*/
this.Given(/^I go on "([^"]*)"$/, function(url, callback){
browser.get(url);
callback();
});
/*
** Check if the text of the element with a given selector is equal to myText.
*/
this.Then(/^The text of the element with selector "([^"]*)" should be "([^"]*)"$/, function(elementSelector, myText, callback){
var selectedElement = element(by.css(elementSelector));
//Resolve the promise
selectedElement.getText().then(function(text){
expect(text).to.equal(myText);
});
callback();
});
};
的index.html
<html>
<head></head>
<body>
<button id="test-button">Test button</button>
</body>
</html>
现在,当我运行测试时,我得到了一个奇怪的结果,因为给定方案的两个步骤都已通过,但由于expect(text).to.equal(myText);
行,我在第二个步骤中出错。
这是因为根据小黄瓜功能,按钮内的文字应该是我的按钮,而不是测试按钮。
我想知道为什么即使出现错误也会通过第二步?我认为测试应该失败,因为比较的字符串是不同的。我错了吗?我该如何避免这种行为?
修改
如果我使用eventually
中的chai-as-promised
来解决承诺,我会得到相同的结果。所有测试都通过但错误文本略有不同:AssertionError: expected 'Test button' to equal 'My Button'
提前谢谢。
答案 0 :(得分:2)
我发现了两个解决此问题的方法。
<强>首先强>
selectedElement.getText().then(function(text){
try{
expect(text).to.equal(myText);
} catch(error){
callback(new Error("Compare error"));
}
callback();
});
这里我解析了promise,然后检查元素的文本是否等于字符串myText
。我不喜欢这个解决方案,因为,手动解决承诺,我没有使用chai-as-promised的很多功能。
<强>第二强>
expect(selectedElement.getText()).to.eventually.equal(myText).notify(callback);
我认为这是最好的解决方案,并且基于由chai-as-promise提供的notify。 这个关于黄瓜量角器的 post对这个问题非常有帮助。
答案 1 :(得分:1)
这里发生的是因为你的断言是在异步操作的回调中,测试在遇到expect(text).to.equal(myText);
语句之前就完成了,因此传递了。
您需要确定测试不应该通过,直到您等待的承诺得到解决!
根据我认为你应该使用的Chai documentation on promises模式是:
expect(selectedElement.getText()).to.eventually.equal(myTest);
答案 2 :(得分:1)
getText()
,正如Protractor
中的许多其他方法一样,返回承诺,使用chai-as-promised
及其最终&#34;&#34; #34;:
expect(selectedElement.getText()).to.eventually.equal(myText);
而且,您在HTML中显然有Test button
,但由于某种原因,您希望看到My button
。换句话说,不应该是:
Then The text of the element with selector "#test-button" should be "Test button"