我正在开发一套自动化测试,以便使用Protractor在AngularJS应用程序上运行。在完成此任务之前,我从未使用过自动化测试,因此对于它是如何工作/如何实现测试等,我仍然非常不熟悉。
最近,我在实现自动单击对话框的“取消”按钮方面遇到了一些麻烦,当其中一个测试浏览到某个特定页面时,该按钮会自动显示。
现在,我已经成功地单击了“取消”按钮,但是测试脚本仍然失败,原因是异步回调出现了错误。
测试脚本编写为:
it('should navigate to the Charts page', function(done) {
console.log("Start Charts page test");
browser.waitForAngularEnabled(false);
browser.actions().mouseMove(chartsMenuBtn).perform();
chartsMenuBtn.click();
browser.waitForAngularEnabled(true);
//browser.sleep(5000);
browser.call(closeDlg);
//var closeDlgFn = closeDlg();
//browser.wait(closeDlgFn, 5 * 1000, 'Dialog should close within 5 seconds');
console.log("End Charts page test");
expect(browser.getCurrentUrl()).toBe('http://192.168.1.212:8080/#/charts');
});
在脚本中调用的closeDlg()
函数定义如下:
function closeDlg(){
browser.waitForAngularEnabled(false);
console.log("closeDlg() function called ")
var EC = protractor.ExpectedConditions;
var chartConfigForm = element(by.id('chartConfigForm'));
var closeDlgBtn = element(by.id('editGraphCancelBtn'));
console.log("About to click closeDlgBtn ");
closeDlgBtn.click();
console.log("just clicked closeDlgBtn ");
console.log("End of closeDlg() function ")
}
browser.call(closeDlg).then(function(){console.log("End Charts page test"); done();});
当我按当前状态运行脚本时,我在命令行中得到以下输出:
.Start图表页面测试 终结图页测试 -下一个命令: findElements -下一个命令: mouseMoveTo -下一个命令: findElements -下一个命令: clickElement closeDlg()函数调用 即将单击closeDlgBtn 刚点击closeDlgBtn closeDlg()函数的末尾--下一个命令: findElements
当所有这些都显示出来时,对话框仍然是在浏览器中打开的。当我继续进行测试时,我在命令行中得到了下面两个提示:
-下一个命令: clickElement 终结图页测试 -下一个命令: executeAsyncScript
这时对话框就关闭了。
如果我继续执行我的测试脚本,我会得到一个失败:
茉莉花规格超时了。重置WebDriver控制流。 茉莉花的规格超时了。重置WebDriver控制流。 失败: 1)应用程序应该导航到图表页面 消息:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
堆栈:Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. at ontimeout (timers.js:386:11) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5)
消息:Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
堆栈:Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. at ontimeout (timers.js:386:11) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5)
5规格,1次失败 在260.014秒内完成
我在网上发现的一切似乎都表明,我应该增加j$.DEFAULT_TIMEOUT_INTERVAL
变量在jasmine.js
中的值,我已经这样做了--我已经将它从10000 (默认值)增加到了500000。
我还在我的allScriptsTimeout
文件中添加了一个conf.js
值:
exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['spec.js'], // List all of the different files in which the tests are defined here
allScriptsTimeout: 120000,
onPrepare: function() {
browser.addMockModule('disableModalAnimations', function(){
angular.module('disableModalAnimations', []).value('foo', 'bar');
});
},
multiCapabilities: {
browserName: 'firefox'
}
}
我不明白为什么我会有这个超时错误?
我尝试将测试脚本中对closeDlg()
的调用更改为:
browser.call(closeDlg).then(function(){console.log("End Charts page test"); done();});
但还是会犯同样的错误。
我怀疑这个问题实际上是一个超时问题,但我不确定我是否正确地执行了异步脚本。
有人能发现我做错了什么吗?在指定的超时内,错误告诉我的异步回调是什么?我所做的哪些部分是异步的?
发布于 2017-10-27 14:04:58
因此,经过大量修改代码、剪切和更改代码、尝试不同的方法,并在网上查看各种文章以获得有关如何做到这一点的建议之后,我终于将测试的expect
子句放入一个.then()
函数中,并将其链接到对closeDlg()
函数的调用中(并将其从测试的it()
级别删除:
it('should navigate to the Charts page', function() {
console.log("Start Charts page test");
browser.waitForAngularEnabled(false);
browser.actions().mouseMove(chartsMenuBtn).perform();
chartsMenuBtn.click();
browser.waitForAngularEnabled(true);
browser.call(closeDlg).then(function(){
expect(browser.getCurrentUrl()).toBe('http://192.168.1.212:8080/#/alarms');
});
这个测试现在正确通过了,并且一步一步地执行它,我可以看到它按预期执行命令,并产生正确的结果。
https://stackoverflow.com/questions/46973496
复制相似问题