你如何使用 Protractor 和 Chai 等待承诺?

How do you wait for a promise using protractor and Chai?

我正在等待使用 Cucumber、Chai 和 Protractor 的承诺解决方案。有没有办法在发送回调之前使用 Chai 等待某些事情(如页面加载)发生?

我想要这样的东西:

browser.get(url).then(callback)

我以为会在 Chai:

browser.get(url).should.be.fulfilled.and.notify(callback);

虽然当我这样做时,我只是遇到了超时,但我看到页面已加载。 我已经设置好了:

var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var expect = chai.expect;
var should = chai.should;

我不想检查什么,我只想确保页面加载。据我所知,大多数人只是这样做:

browser.get(url);
callback();

并且只在 Gherkins Then 子句中使用 assertexpect,但我想等待页面在 Given 或 When 中加载。

我对你的问题的理解是,你希望 CucumberJS 中的异步 Given, When, Then's 表现为同步执行,这样一旦 browser.get(url) 的步骤完成,那么下一步定义被执行。如果这是您的问题,那么 是的 我们可以做到-

您需要 return 承诺或在步骤定义中使用 done 回调。否则黄瓜不知道您的异步操作何时完成。

当我使用 .then 函数对结果执行一些操作时,我更喜欢 return promises,而当我不这样做时,我更喜欢 return promises,而且你不需要 callbacks 现在 CucumberJS 支持 promises。所以你的步骤文件应该看起来像 -

var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var expect = chai.expect;

module.exports = function () {


this.Given(/^I launch the protractor demo page$/, function () {
   return browser.get('http://juliemr.github.io/protractor-demo/');
    });
});

this.When(/^I check the title of the page$/, function () {
   return browser.getTitle().then(function(text){
       console.log('title is - ' + text);
        expect(text).to.equal('Super Calculator');
    });

});