Ответ 1
Тестирование не angular страниц с помощью Protractor может быть сложным в отношении ожидания материала.
Я предлагаю вам обновить Protractor до последней версии (на данный момент 1.5.0), используйте пользовательскую функцию waitReady(), что browser.wait
для элементов готовы и переписать ваш тест, как показано ниже.
// TODO: use page objects
var loginNameInputElm = $('#login_field'); // or element(by.id('login_field'))
var passwordInputElm = $('#password'); // same as element(by.id('password'))
var loginBtnElm = $('button[type=submit]');
it('non-angular page so ignore sync and active wait to load', function() {
browser.ignoreSynchronization = true;
browser.get(process.env.HOST + '/auth/github');
expect(loginNameInputElm.waitReady()).toBeTruthy();
expect(passwordInputElm.waitReady()).toBeTruthy();
});
it('should fill user and password and logins', function() {
loginNameInputElm.sendKeys(process.env.USERNAME);
passwordInputElm.sendKeys(process.env.PASSWORD);
loginBtnElm.click();
});
it('restores ignore sync when switching back to angular pages', function() {
browser.ignoreSynchronization = false; // restore
browser.get('/some-angular-page');
});
Подробнее о том, почему waitReady
здесь.
Примечание: в прошлом я предлагал установить высокий неявный, например.
browser.manage().timeouts().implicitlyWait(5000);
Этот хак позволяет избежать waitReady
и продолжать использовать стандартный
expect(loginNameInputElm.isPresent()).toBeTruthy();
Но имеет уродливый недостаток при тестировании элементов НЕ, т.е. при тестировании отсутствующих или невидимых элементов, и в этом случае он будет ждать 5 секунд (5000 мс) в флюгере, например. при выполнении
expect(someNonExistingElm.isPresent()).toBeFalsy();