【问题标题】:how to properly chain promises in protractor如何在量角器中正确链接承诺
【发布时间】:2017-06-02 12:17:59
【问题描述】:

考虑以下 sn-p:

        getApiEndpoints.billingCycle()
           .then(apiURL=>{
                return RestClient.doGet(apiURL);
            }).then(console.log(data))

在上面的 sn-p 中,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 错误...

【问题讨论】:

  • 我不知道 Protractor,但 Promise 链对我来说看起来不错。
  • 那么第二个中的data 是什么?我不知道你是否可以这样使用它:/
  • @echonax data 显然是响应......
  • 你能像第一个一样试试then((data)=>{console.log(data)})吗?
  • 我这样做了:同样的事情......:/

标签: angular promise protractor deferred


【解决方案1】:

Protractor 有自己的 control flow of Promises 并且默认情况下不链接非 Webdriver 承诺

所以有两种方法可以解决这个问题。我个人更喜欢第二种方法,因为它利用了 Protractor 配置提供的选项。

  1. 在量角器控制流中插入一个非 Web 驱动程序承诺。有一个 beautiful post 说明如何实现这一点。

  2. 如果这与数据设置或执行的先决条件有关,我建议将其添加到 conf.jsonPrepare() 部分中

  • 您可以通过将 onPrepare 设置为 * 文件名字符串来指定包含要运行的代码的文件。 onPrepare 可以选择返回一个 承诺,* Protractor 在继续之前将等待 执行。如果 * 准备工作涉及任何 异步调用,例如* 与浏览器交互。否则 量角器不能保证执行顺序 * 并且可能会启动 准备完成前的测试。
 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;

       )
    },

【讨论】:

  • 你能提供一些堆栈跟踪吗.. 它是在步骤flow.execute() .. c 被抛出的
  • 应该说.then(function(data) {.then(data => {吗?
【解决方案2】:

失败:fn 不是函数

你应该将一个函数传递给execute()(不要调用它):

flow.execute(getApiEndpoints.billingCycle)

或者,如果需要传递参数:

flow.execute(function () {
    return getApiEndpoints.billingCycle(param1, param2);
});

【讨论】:

  • @beNerd 你可以把它包装成一个函数(更新了答案),希望有帮助。
  • 你忘了把 return 放在那里 :) 它工作正常....基本上我应该返回一个闭包...非常感谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多