Javascript nightwatchjs-如何等待ajax调用完成
我正在使用nightwatchJS实现浏览器自动化。我看到的一个常见用例是,我网页中的大部分内容都是通过来自ajax调用的数据更新的。所以,在我的测试中,我正在寻找一种方法来保持我的测试,直到我从Ajax得到结果。我在nightwatch或selenium中找不到任何api 我已经尝试了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请求之后
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。