Как дождаться обещания с помощью транспортира и Чай?

Я пытаюсь дождаться разрешения обещания, используя Cucumber, Chai и Protractor. Есть ли способ с помощью Chai дождаться чего-то (например, загрузки страницы) перед отправкой обратного вызова?

Я хочу что-то вроде:

browser.get(url).then(callback)

который, как я думал, будет в Чай:

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();

и использовать только assert или expect в предложении Gherkins Then, но я хочу дождаться загрузки страницы в задании или времени.


person user3554664    schedule 17.08.2016    source источник


Ответы (1)


Что я понимаю в вашем вопросе, так это то, что вы хотите, чтобы асинхронный Given, When, Then's в CucumberJS вел себя как синхронное выполнение, чтобы после завершения вашего шага с browser.get(url) выполнялось определение следующего шага. Если это то, о чем ваш вопрос, то Да мы можем сделать это-

Вам нужно либо return промис, либо использовать обратный вызов done в определениях шагов. В противном случае огурец не знает, когда ваши асинхронные действия завершены.

Я предпочитаю обещания return, когда я выполняю некоторые действия с результатами с помощью функции .then, и использую функцию обратного вызова .done, когда я этого не делаю. Также вам не нужно 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');
    });

});
person Ram Pasala    schedule 17.08.2016
comment
Когда я пытаюсь использовать функцию возврата, такую ​​​​как return browser.get('http://google.com');, она все еще терпит неудачу с ошибкой тайм-аута. Я также пробовал это с .then, а затем с callback, который также истекает. - person user3554664; 17.08.2016
comment
Хорошо, я думаю, что ваша страница занимает больше, чем время по умолчанию, равное 5000 мс шагов, поэтому вы получаете ошибку тайм-аута. Вы пытались увеличить время по умолчанию? - person Ram Pasala; 17.08.2016
comment
Я пробовал до минуты. Я вижу загрузку страницы, хотя ничего не происходит. - person user3554664; 17.08.2016
comment
вы используете угловое или не угловое приложение? - person Ram Pasala; 17.08.2016
comment
угловое приложение, но я также тестировал его только на google.com - person user3554664; 17.08.2016
comment
Странно, но тем не менее, не могли бы вы сказать мне, какие версии транспортира, угловые вы используете? вам придется использовать browser.ignoreSynchronization с google.com - person Ram Pasala; 17.08.2016
comment
настройка browser.ignoreSynchronization = true; вроде решила проблему - person user3554664; 17.08.2016
comment
рад, что это сработало! вы должны всегда использовать этот параметр для неугловых приложений - person Ram Pasala; 17.08.2016
comment
для угловых приложений, как вы указываете время ожидания для угловой синхронизации? - person user3554664; 17.08.2016
comment
на самом деле вам не нужно ждать, посмотрите, что транспортир делает внутри, когда имеет дело с угловыми приложениями. Если вы все еще явно хотите подождать, вы можете использовать `browser.waitForAngular()` - person Ram Pasala; 17.08.2016
comment
Давайте продолжим обсуждение в чате. - person user3554664; 17.08.2016