Транспортир: как дождаться завершения страницы после нажатия кнопки?
В тестовой спецификации мне нужно нажать кнопку на веб-странице и дождаться полной загрузки новой страницы.
emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');
btnLoginEl.click();
// ...Here need to wait for page complete... How?
ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
Ответы
Ответ 1
В зависимости от того, что вы хотите сделать, вы можете попробовать:
browser.waitForAngular();
или
btnLoginEl.click().then(function() {
// do some stuff
});
чтобы решить обещание. Было бы лучше, если вы можете сделать это в beforeEach
.
NB: я заметил, что функция ожидания() ожидает, что обещание внутри (т.е. getCurrentUrl) должно быть решено перед сравнением.
Ответ 2
Вам не нужно ждать. Транспортир автоматически ждет, пока angular будет готов, а затем выполнит следующий шаг в потоке управления.
Ответ 3
Я просто посмотрел на источник. Транспортир ждет Angular только в нескольких случаях (например, при вызове element.all
или настройке/получении местоположения).
Поэтому Protractor не будет ждать, пока Angular стабилизируется после каждой команды.
Кроме того, похоже, что иногда в моих тестах у меня была гонка между циклами Angular digest и событием click, поэтому иногда мне приходится делать:
elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
используя сон, чтобы ждать выполнения для входа в контекст AngularJS (вызванный событием click
).
Ответ 4
Обычно я просто добавляю что-то к потоку управления, то есть:
it('should navigate to the logfile page when attempting ' +
'to access the user login page, after logging in', function() {
userLoginPage.login(true);
userLoginPage.get();
logfilePage.expectLogfilePage();
});
logfilePage:
function login() {
element(by.buttonText('Login')).click();
// Adding this to the control flow will ensure the resulting page is loaded before moving on
browser.getLocationAbsUrl();
}
Ответ 5
В этом случае вы можете использовать:
Объект страницы:
waitForURLContain(urlExpected: string, timeout: number) {
try {
const condition = browser.ExpectedConditions;
browser.wait(condition.urlContains(urlExpected), timeout);
} catch (e) {
console.error('URL not contain text.', e);
};
}
Проверка страницы:
page.waitForURLContain('abc#/efg', 30000);
Ответ 6
Используйте это, я думаю, лучше
*isAngularSite(false);*
browser.get(crmUrl);
login.username.sendKeys(username);
login.password.sendKeys(password);
login.submit.click();
*isAngularSite(true);*
Для использования этой настройки isAngularSite следует поместить это в ваш protractor.conf.js здесь:
global.isAngularSite = function(flag) {
browser.ignoreSynchronization = !flag;
};
Ответ 7
browser.waitForAngular();
btnLoginEl.click().then(function() { Do Something });
чтобы решить обещание.