sch*_*eld 2 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;
});
Run Code Online (Sandbox Code Playgroud)
要使用检索到的数据,我必须解决承诺并在回调中继续测试脚本:
result.then(function(data) {
element(by.model('username')).sendKeys(data.person.email);
element(by.model('password')).sendKeys('test');
$('button[type="submit"]').click();
});
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种回调处理以及它可能导致的地狱。除此之外,Protractor 在隐藏这个混乱的回调处理方面非常出色。所以,问题是:
如何使用异步调用的结果?
最后,我想执行如下代码:
var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {...});
element(by.model('username')).sendKeys(result.person.email);
//...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
您可以使 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;
});
Run Code Online (Sandbox Code Playgroud)
但结果将保持承诺。
| 归档时间: |
|
| 查看次数: |
6062 次 |
| 最近记录: |