在量角器测试中无法使用户会话保持活动状态

时间:2016-01-26 17:26:42

标签: javascript angularjs http protractor

我在我的应用程序上使用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请求时。

1 个答案:

答案 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");
  })
  
});