首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Protractor执行异步脚本进行AngularJS测试

用Protractor执行异步脚本进行AngularJS测试
EN

Stack Overflow用户
提问于 2017-10-27 10:58:55
回答 2查看 199关注 0票数 0

我正在开发一套自动化测试,以便使用Protractor在AngularJS应用程序上运行。在完成此任务之前,我从未使用过自动化测试,因此对于它是如何工作/如何实现测试等,我仍然非常不熟悉。

最近,我在实现自动单击对话框的“取消”按钮方面遇到了一些麻烦,当其中一个测试浏览到某个特定页面时,该按钮会自动显示。

现在,我已经成功地单击了“取消”按钮,但是测试脚本仍然失败,原因是异步回调出现了错误。

测试脚本编写为:

代码语言:javascript
运行
复制
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()函数定义如下:

代码语言:javascript
运行
复制
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值:

代码语言:javascript
运行
复制
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()的调用更改为:

代码语言:javascript
运行
复制
browser.call(closeDlg).then(function(){console.log("End Charts page test"); done();});

但还是会犯同样的错误。

我怀疑这个问题实际上是一个超时问题,但我不确定我是否正确地执行了异步脚本。

有人能发现我做错了什么吗?在指定的超时内,错误告诉我的异步回调是什么?我所做的哪些部分是异步的?

EN

Stack Overflow用户

回答已采纳

发布于 2017-10-27 14:04:58

因此,经过大量修改代码、剪切和更改代码、尝试不同的方法,并在网上查看各种文章以获得有关如何做到这一点的建议之后,我终于将测试的expect子句放入一个.then()函数中,并将其链接到对closeDlg()函数的调用中(并将其从测试的it()级别删除:

代码语言:javascript
运行
复制
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');
});

这个测试现在正确通过了,并且一步一步地执行它,我可以看到它按预期执行命令,并产生正确的结果。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46973496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档