Учитывая ваше добавленное сообщение об ошибке (см. Комментарий), причиной кажется непрерывный опрос $timeout
, который позволяет обещанию не выполняться в течение неопределенного времени и, следовательно, приводит к асинхронному таймауту транспортира (подробности здесь).
решение
Правильное решение - избегать использования $timeout
и использовать вместо него $interval
. Таким образом, транспортир может оставаться ответственным за ControlFlow, управляя вашими асинхронными задачами. Так что это своего рода программная ошибка, а не ошибка транспортира.
ваше сообщение об ошибке:
Failed: Timed out waiting for asynchronous Angular tasks to finish after 20 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular While waiting for element with locator - Locator: By(css selector, md-raised md-primary md-button md-ink-ripple).
*The following tasks were pending: - $timeout: function (){return _this.getVersion()}*
Временное решение
Не очень приятный обходной путь - отключить часть waitForAngular в Protractor, установив browser.waitForAngularEnabled(false);
(либо в beforeEach, либо непосредственно в spec.
Однако это также означает, что нужно вручную позаботиться о controlFlow в рамках самих тестовых спецификаций. Это требует использования большого количества .then()
и ExpectedConditions
, теряя одно из основных преимуществ транспортира.
Возможности отладки
Проверьте описания здесь для потенциальных причины и обходные пути. В частности, попробуйте также browser.waitForAngularEnabled(false);
исключить проблемы с угловым транспортиром.
Если вы не можете найти причину, это может быть проблема со сроками (маловероятно, но на этом этапе стоит изучить).
Вы можете попробовать добавить сообщения журнала, чтобы сузить эффективный порядок выполнения:
describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url').then(function(){
console.log("Page is fully loaded");
});
});
it('Clicks the proceed button',function() {
console.log("Start 2nd Test");
const proceedButton = element(by.id('auth-login-page-button'));
proceedButton.click();
});
});
Или вы помещаете действия в один и тот же тестовый пример, используя then()
для их синхронного выполнения:
describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url').then(function(){
const proceedButton = element(by.id('auth-login-page-button'));
proceedButton.click();
});
});
Открыть главную страницу в onPrepare
Одно приятное замечание: если вы всегда сначала загружаете домашнюю страницу, просто поместите ее в onPrepare-часть вашего conf.js, и она всегда будет выполняться один раз перед запуском ваших тестов:
onPrepare: function () {
browser.driver.manage().window().maximize();
browser.get('url');
},
person
Ernst Zwingli
schedule
02.10.2017