我正在使用nightwatchJS进行浏览器自动化。我看到的一个常见用例是,我网页中的大部分内容都是通过ajax调用的数据进行更新的。所以,在我的测试中,我正在寻找一种方法来保持我的测试,直到我从Ajax获得结果。我在夜间观察或硒中找不到任何api。
我尝试了waitForElementVisible
,但我觉得这还不够。如果我的ajax调用没有返回任何数据,会发生什么。
以前有人试过吗?
答案 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
选项验证发生了什么。详细可以告诉您未处理的错误消息,这可能会导致您解决一个棘手的小问题。