请考虑以下代码段:
getApiEndpoints.billingCycle()
.then(apiURL=>{
return RestClient.doGet(apiURL);
}).then(console.log(data))
在上面的代码段中,getApiEndpoints.billingCycle()
和RestClient.doGet(apiURL)
都返回了承诺。上面的代码只是挂起Web驱动程序,以后随着超时错误而崩溃。
我在这里缺少什么?
更新:RestClient.doGet(apiURL)
function doGet(url){
var defer = Helper.getPromise().defer();
request.get(url, (error, response, body) => {
if (response&&(response.statusCode == 200 || response.statusCode == 201)) {
defer.fulfill(JSON.parse(body));
} else {
defer.reject(error);
}
});
return defer.promise;
}
我做了什么
let flow = browser.controlFlow();
flow.execute(getApiEndpoints.billingCycle())
.then((apiURL)=> console.log(apiURL))
让我Failed: fn is not a function
错误...
答案 0 :(得分:2)
失败:fn不是函数
您应该将函数传递给execute()
(不要调用它):
flow.execute(getApiEndpoints.billingCycle)
或者,如果需要传递参数:
flow.execute(function () {
return getApiEndpoints.billingCycle(param1, param2);
});
答案 1 :(得分:0)
量角器有自己的control flow of Promises,非-Webdriver承诺默认不链接
所以有两种方法可以解决这个问题。我个人更喜欢第二种方法,因为它利用了Protractor配置提供的选项。
在Protractor Control流程中插入非Web驱动程序的承诺。有关如何实现此目的的beautiful post。
如果这与数据设置或执行的先决条件有关,我建议在conf.js
onPrepare()
部分添加它
醇>
- 您可以通过将onPrepare设置为*文件名字符串来指定包含要运行的代码的文件。 onPrepare可以选择返回一个 承诺,*量角器将在继续之前等待 执行。如果*准备涉及任何,则可以使用 异步调用,例如与*浏览器交互。除此以外 量角器不能保证执行顺序*并且可以启动 准备结束前的测试。
onPrepare: function() {
return getApiEndpoints.billingCycle()
.then(apiURL=>{
return RestClient.doGet(apiURL)
}).then(
// Any value you want to set with API response. Some examples below
browser.profile = data.user.name;
browser.params.password = data.user.password;
// Or else get the complete JSON onto global browser and use it through-out test case
browser.apiresponse = data;
)
},