nightwatchjs - 如何等待ajax呼叫完成

时间:2015-09-30 10:32:19

标签: javascript selenium-webdriver automation nightwatch.js

我正在使用nightwatchJS进行浏览器自动化。我看到的一个常见用例是,我网页中的大部分内容都是通过ajax调用的数据进行更新的。所以,在我的测试中,我正在寻找一种方法来保持我的测试,直到我从Ajax获得结果。我在夜间观察或硒中找不到任何api。

我尝试了waitForElementVisible,但我觉得这还不够。如果我的ajax调用没有返回任何数据,会发生什么。

以前有人试过吗?

3 个答案:

答案 0 :(得分:2)

如果你知道这里的ajax路径是如何解决的, 我们的想法是附上“ajaxComplete”' event to client和match execution request path:

client
    .timeoutsAsyncScript(15000) // set async exec timeout
    .click('.btn-submit') // ajax form submit
    .executeAsync(
        function(targetUrl, done){
            var nightwatchAjaxCallback = function(ajaxUrl) {
                if(ajaxUrl.indexOf(targetUrl) === 0) { // if url match notify script that xhr is done
                    done(true);
                }
            };

            if(!window.nightwatchAjaxInited) { // make sure ajaxComplete is attached only once

                window.nightwatchAjaxInited = true;

                $(document).ajaxComplete(function(e, res, req) {
                    nightwatchAjaxCallback(req.url);
                });
            }
        },
        ['/ajaxpath'], // expected xhr request path
        function(status){
            // executes once ajax is done
            client.verify.containsText('.entry', 'lorem ipsup...') // verify post is created
        }
    );

这是命令' ajaxWait'根据上面的代码创建:

exports.command = function(targetUrl, action, callback) {

    this.timeoutsAsyncScript(15000);

    action();

    this.executeAsync(function(targetUrl, done){

        var nightwatchAjaxCallback = function(ajaxUrl) {
            if(ajaxUrl.indexOf(targetUrl) === 0) {
                done(true);
            }
        };

        if(!window.nightwatchAjaxInited) {

            window.nightwatchAjaxInited = true;

            $(document).ajaxComplete(function(e, res, req) {
                nightwatchAjaxCallback(req.url);
            });
        }

    }, [targetUrl], function(status){

        callback();
    });
};

并且调用应该如下所示:

client.ajaxWait('/ajaxpath', function(){
    // ajax form submit
    client.click('.btn-submit') // ajax form submit
}, function(){
    // executes once ajax is done
    client.verify.containsText('.entry', 'lorem ipsup...') // verify post is created
})

答案 1 :(得分:0)

我们在此处提供了一个自定义命令:https://github.com/mobify/nightwatch-commands

我们一直在努力将我们的命令与adaptive.js的特定要求分离,以便任何人都可以在他们的项目中使用它们。

您需要在package.json中包含nightwatch命令:1.6.0并在settings.json中引用自定义命令

"custom_commands_path": "./node_modules/nightwatch-commands/commands",
"custom_assertions_path": "./node_modules/nightwatch-commands/assertions",

答案 2 :(得分:-1)

我面临类似的问题,我看到两种可能的解决方案:

1)在您想要单击/检查ajax请求之后的所有内容之前,请执行暂停语句。大多数情况下测试失败是因为ajax请求尚未完成且缺少某些内容。

client.pause(5000);应该诀窍。

2)adaptive.js似乎有一个nightwatchJS的waitForAjax实现。无论如何它似乎是封闭的代码,我不能告诉你任何事情。

3)使用--verbose选项验证发生了什么。详细可以告诉您未处理的错误消息,这可能会导致您解决一个棘手的小问题。