我创建了一个小型 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;
});
要使用检索到的数据,我必须解决 promise 并在回调中继续执行测试脚本:
result.then(function(data) {
element(by.model('username')).sendKeys(data.person.email);
element(by.model('password')).sendKeys('test');
$('button[type="submit"]').click();
});
我不喜欢这种回调处理以及它可能导致的 hell 。除此之外, Protractor 非常善于隐藏这种困惑的回调处理。所以,问题是:
如何使用异步调用的结果?
最后我想执行如下代码:
var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {...});
element(by.model('username')).sendKeys(result.person.email);
//...
有什么想法吗?
最佳答案
您可以使 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;
});
但结果将是一个 promise 。
关于javascript - Protractor :使用 api 调用的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705923/