【问题标题】:Protractor: Using result of an api call量角器:使用 api 调用的结果
【发布时间】:2014-07-05 12:50:15
【问题描述】:

我创建了一个小 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();
});

我不喜欢这种回调处理以及它可能导致的地狱。除此之外,Protractor 非常擅长隐藏这种混乱的回调处理。所以,问题是:

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

最后我想执行如下代码:

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

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

有什么想法吗?

【问题讨论】:

  • Closing as duplicate - 简短的回答:你真的不能以一种好的方式,如果你这样做,它会减慢你的测试一大堆,他们会在性能方面表现不可靠。长答案在重复的问题中。如果您认为我找到的重复文件不能涵盖您的问题(我相信确实如此)- 请告诉我,我会重新打开它。
  • @BenjaminGruenbaum:我不认为这是完全重复的。不同的是进行 ajax 调用的环境。一方面,您有一个事件驱动的客户端,其中阻塞 IO 意味着阻塞的 UI。另一方面,您有一个测试执行框架,其关键功能是在一行中执行后续异步调用,就像它们在同步调用中一样。
  • 随心所欲,我觉得核心问题一模一样这里也一样,不过我重新打开了

标签: javascript ajax http promise protractor


【解决方案1】:

您可以使 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;
});

但结果将保持承诺。

【讨论】:

    【解决方案2】:

    它对我有用:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多