量角器:使用api调用的结果

时间:2014-05-16 23:24:50

标签: javascript ajax http promise protractor

我创建了一个小的api来动态生成测试数据。每次调用都会创建一个新用户并返回创建的数据。

要加载数据,请使用包request

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {
    var defer = protractor.promise.defer();
    request('http://localhost/test/recipe/person', function (error, response, body) {
        if (!error && response.statusCode === 200) {
            defer.fulfill(JSON.parse(body));
        }
    });
    return defer.promise;
});

要使用检索到的数据,我必须解决承诺并在回调中继续测试脚本:

result.then(function(data) {
    element(by.model('username')).sendKeys(data.person.email);
    element(by.model('password')).sendKeys('test');
    $('button[type="submit"]').click();
});

我不喜欢这种回调处理以及可能导致的问题。除此之外,量角器在隐藏这个凌乱的回调处理方面非常出色。所以,问题是:

如何使用异步调用的结果?

最后,我想执行以下代码:

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {...});

element(by.model('username')).sendKeys(result.person.email);
//...

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你可以使http请求同步 - 在大多数情况下这是一件坏事 或者,您可以将回调插入执行函数:

var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {
    var defer = protractor.promise.defer();
    request('http://localhost/test/recipe/person', function (error, response, body) {
        if (!error && response.statusCode === 200) {
            defer.fulfill(JSON.parse(body));
        }
    });

    defer.promise.then(function(data) {
       element(by.model('username')).sendKeys(data.person.email);
       element(by.model('password')).sendKeys('test');
       $('button[type="submit"]').click();
    });

    return defer.promise;
});

但结果将是一个承诺。

答案 1 :(得分:1)

它对我有用:

var request = require('request');

var options = {
  method: 'POST',
  url: 'http://testurl.com/endpoint/test/',
  headers: {'id': 'ABCD',
    'sessionid': 'dummyId',
    'Accept': 'application/json',
    'Accept-Language': 'en-us'
  },
  body: '{ "pay_load": [] }'
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(body);
    console.log(info);
  }
}

request(options, callback);