Javascript nightwatchjs-如何等待ajax调用完成

Javascript nightwatchjs-如何等待ajax调用完成,javascript,selenium-webdriver,automation,nightwatch.js,Javascript,Selenium Webdriver,Automation,Nightwatch.js,我正在使用nightwatchJS实现浏览器自动化。我看到的一个常见用例是,我网页中的大部分内容都是通过来自ajax调用的数据更新的。所以,在我的测试中,我正在寻找一种方法来保持我的测试,直到我从Ajax得到结果。我在nightwatch或selenium中找不到任何api 我已经尝试了waitForElementVisible,但我觉得这还不够。如果我的ajax调用不返回任何数据,将会发生什么 以前有人试过吗?我面临着类似的问题,我看到了两种可能的解决方案: 1) 在单击/检查ajax请求之后

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

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


以前有人试过吗?

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

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

客户端暂停(5000)应该与技巧相关

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


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

我们在这里提供了一个自定义命令:

我们一直在努力将我们的命令与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",

如果您知道ajax路径是解决问题的方法, 其思想是将“ajaxComplete”事件附加到客户端并匹配执行的请求路径:

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
})

欢迎来到堆栈溢出!请避免直接回复其他帖子,因为不能保证帖子或帖子不会被删除。还有,你提到“我们”。。。“我们”是谁?如果您与营利性产品有关联,请联系pease。