【问题标题】:Get request async call in protractor在量角器中获取请求异步调用
【发布时间】:2016-11-15 16:12:45
【问题描述】:

我有一个测试用例,我的代码向服务器发出请求并检查具有指定日期的文件名是否存在。由于 GET 请求是异步调用,在我检查它是否是指定日期之前,如何确保我有来自服务器的文件名?

这是我的代码的摘录:

var re = new RInterface();
it('data show exists', function() {   
    target.each(function(ele){
        browser.actions().mouseMove(ele).perform();     

        re.get(function(result){                
            expect(result).toEqual(true);   
        });
    });
});

RInterface.js

 var Service = function() {
 var serv = this;
 var uname = atob(settings.username);
 var pwd = atob(settings.password);
 var url = 'https://' + uname + ':' + pwd + '@' + settings.Url + '/' + settings.format + '/' + settings.period;
 var completeURL = url;     
 var today = DateString();

 serv.get = function(callback) {
 var dataStrAry = [];
 var count = 0;

 request(completeURL, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                var serverData = JSON.parse(body);                  

                var split = serverData[serverData.length-1].Name.split(" "); 
                var target = split[split.length-1].split(".")[0]; 

                // Check if the file with current date is available 
                // If it is, then assume data is saved on the server
                if(target == today) {
                    console.log("equal");
                    callback(true);                     
                }
                else {
                    console.log("not equal");
                    callback(false);
                }

            }
            else {
                console.log("errror call");
                callback(false);
                return;

            }
        });

    };

所以,re.get 是我向服务器发出 GET 请求并传递回调函数以在 get 请求结束时调用的地方。我认为这个问题是量角器在我的代码从服务器获取数据之前完成了测试。如何强制量角器等待以便我可以检查返回的数据?我目前的解决方法是将 get 请求放在 beforeEach 中,似乎量角器强制测试等待它完成执行。

【问题讨论】:

    标签: asynchronous jasmine protractor


    【解决方案1】:

    如果您希望控制流等待它,您需要使用 Promise 处理请求的结果:

    var re = new RInterface();
    it('data show exists', function() {   
        target.each(function(ele){
            browser.actions().mouseMove(ele).perform();     
    
            expect(re.get()).toEqual(true);
        });
    });
    
    var Service = function() {
        ...
        this.get = function() {
            var defer = protractor.promise.defer();
            ...
            request(completeURL, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    var result = ...
                    defer.fulfill(result);
                } else {
                    defer.reject(error);
                }
            });
    
            return defer.promise;
        };
    };
    

    【讨论】:

    • 像魅力一样工作。谢谢!
    【解决方案2】:

    您可以使用browser.wait 使其更简单,只需像

    一样包装请求函数(返回一个承诺)
    browser.wait(request...).then(result => { 
    // here continue execution with the result of the request
     }
    

    这会让浏览器等待你的承诺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多