我在我的应用程序上使用Protractor进行e2e测试。
故事:对于特定用例,我需要确保表上的项目数与API响应相匹配。我读到我可以使用'request'进行http调用并检索信息。我需要在浏览器会话中成为经过身份验证的用户才能检索信息。
问题:成功登录后,我尝试获取项目列表,但获得401响应(“没有用户会话可用”)。
一些材料:
var request = require('request');
var querystring = require('querystring');
app.createSession = function() {
var formData = querystring.stringify({
email: browser.params.user.admin.email,
password: browser.params.user.admin.password
});
request({
url: "https://MY_API_DOMAIN/auth",
method : 'POST',
headers: [
{
name: 'Accept',
value: 'application/x-www-form-urlencoded'
}
],
body: formData
}, function(err, response, body) {
console.log('FIRST:', body); //returning 200 ALL FINE
request({
url: "https://MY_API_DOMAIN/api/v1/auth",
method : 'GET',
withCredentials: true,
headers: [{
name: 'Accept',
value: 'application/json'
}]
}, function(err, response, body) {
console.log('SECOND:', body); //returning 401
});
});
};
如果您需要更多信息,请告诉我。当我使用Selenium模拟我的HTML登录时,一切正常并且正在获取项目。问题是在我的帮助函数中处理HTTP请求时。
答案 0 :(得分:1)
您可以使用Protractor promises和controlFlow将异步调用转换为顺序执行,并强制框架等待所有promise都解决并且流程完成。为了实现这一点,所有异步函数都必须返回一个稍后将要解决的promise。
代码将变为:
it ("expect to call all functions", function() {
createSession = function() {
var defer = protractor.promise.defer();
var formData = querystring.stringify({
email: browser.params.user.admin.email,
password: browser.params.user.admin.password
});
request({
url: "https://MY_API_DOMAIN/auth",
method : 'POST',
headers: [
{
name: 'Accept',
value: 'application/x-www-form-urlencoded'
}
],
body: formData
}, function(err, response, body1) {
console.log('FIRST:', body1); //returning 200 ALL FINE
request({
url: "https://MY_API_DOMAIN/api/v1/auth",
method : 'GET',
withCredentials: true,
headers: [{
name: 'Accept',
value: 'application/json'
}]
}, function(err, response, body2) {
defer.fulfill({body1: body1, body1: body2});
//or defer.reject()
console.log('SECOND:', body2); //returning 401
});
});
return defer.promise;
};
var flow = protractor.promise.controlFlow();
flow.execute(createSession);
flow.execute(function(){
console.log("All requests were resolved");
})
});