如何在 Protractor 中创建和操作 Promise?

Posted

技术标签:

【中文标题】如何在 Protractor 中创建和操作 Promise?【英文标题】:How to create and manipulate promises in Protractor? 【发布时间】:2014-01-30 01:55:48 【问题描述】:

我想使用 Node Http 模块直接调用我的服务器以设置我的量角器测试。 Http 是基于回调的,我想把它变成 Promise。

例如,我想让这个函数返回承诺:

function callMyApi() 
  var promise = // somehow create promise;

  http.request(path: '/yada/yada', method: 'POST', function(resp) 
    promise.complete(resp);
  );

  return promise;

所以,问题是:我需要什么require() 并代替“以某种方式创建承诺”才能使其工作?

【问题讨论】:

【参考方案1】:

这是错误的做法,但了解 Protractor Control Flow 可能会有所帮助。如果您希望常规 javascript 在 Protractor 中运行,请通过控制流添加它。

在这种情况下,您可以根据需要使用自己的 Promise 库,然后只需使用 browser.wait 等待您的 Promise 完成。

var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() 
    var p = new Promise...
    promises.push(p);
);
browser.wait( function() return Promise.all(promises); , timeoutMs );

我不是将它用于常规承诺,而是用于console.log 语句或为测试的一部分进行计时,甚至使用fs 将测试中的某些内容打印到文件中。

var startTime, duration; 
browser.controlFlow().execute(function() 
    startTime = new Date().getTime();
);
//Protractor code you want timed
browser.controlFlow().execute(function() 
    duration = new Date().getTime() - startTime;
    console.log("Duration:", duration);
);

【讨论】:

【参考方案2】:

Protractor 使用 WebDriver 的 Promise 并在“protractor”上全局公开该 API。所以你应该可以做到

var deferred = protractor.promise.defer();
return deferred.promise;

有关完整的 WebDriverJS Promise API,请参阅https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js 处的代码

【讨论】:

谢谢!这有帮助。将其添加到github.com/angular/protractor/blob/master/docs/api.md 的 API 页面怎么样? 我正在创建一个返回承诺的函数,我们如何在量角器中解析/拒绝? 您可以使用deferred.fulfill(result)deferred.reject(reason) 解析/拒绝延迟对象

以上是关于如何在 Protractor 中创建和操作 Promise?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac 上的“邮件”中创建和使用电子邮件签名?

如何在 Mongoose 中创建和使用枚举

如何在 Python 中的 Pymmsql 中创建和重新创建索引?

如何在jquery中创建和访问数组

如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?

如何在 Django ModelAdmin 中创建和保存动态字段?