Транспортир: как дождаться завершения страницы после нажатия кнопки?
в тестовой спецификации мне нужно нажать кнопку на веб-странице и дождаться полной загрузки новой страницы.
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');
9 ответов:
в зависимости от того, что вы хотите сделать, вы можете попробовать:
browser.waitForAngular();или
btnLoginEl.click().then(function() { // do some stuff });чтобы решить обещание. Будет лучше, если вы можете сделать это
beforeEach.NB: я заметил, что expect() ожидает, что обещание внутри (т. е. getCurrentUrl) будет решено перед сравнением.
вам не нужно ждать. Транспортир автоматически ожидает угловой, чтобы быть готовым, а затем он выполняет следующий шаг в потоке управления.
Я только что посмотрел на источник-транспортир ждет угловой только в нескольких случаях (например, когда
element.allвызывается, или установка / получение местоположения).поэтому транспортир не будет ждать угловой стабилизации после каждой команды.
кроме того, похоже, что иногда в моих тестах у меня была гонка между Angular digest cycle и click event, поэтому иногда мне приходится делать:
elm.click(); browser.driver.sleep(1000); browser.waitForAngular();использование сна для ожидания выполнения для входа в контекст AngularJS (запускается
clickсобытие).
в этом случае, вы можете использовать:
Страница Объекта:
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);
с транспортиром, вы можете использовать следующий подход
var EC = protractor.ExpectedConditions; // Wait for new page url to contain newPageName browser.wait(EC.urlContains('newPageName'), 10000);Так что ваш код будет выглядеть что-то вроде
emailEl.sendKeys('jack'); passwordEl.sendKeys('123pwd'); btnLoginEl.click(); var EC = protractor.ExpectedConditions; // Wait for new page url to contain efg ptor.wait(EC.urlContains('efg'), 10000); expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');Примечание: это может не означать, что новая страница закончила загрузку и DOM готов. Последующий оператор 'expect ()' гарантирует, что транспортир ждет, пока DOM будет доступен для тестирования.
ссылки: Транспортир ExpectedConditions
обычно я просто добавляю что-то в поток управления, т. е.:
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(); }
используйте это я думаю, что это лучше
*isAngularSite(false);* browser.get(crmUrl); login.username.sendKeys(username); login.password.sendKeys(password); login.submit.click(); *isAngularSite(true);*для вас, чтобы использовать эту настройку isAngularSite следует поместить это в ваш транспортир.конф.Яш здесь:
global.isAngularSite = function(flag) { browser.ignoreSynchronization = !flag; };
вы можете сделать что-то подобное
emailEl.sendKeys('jack'); passwordEl.sendKeys('123pwd'); btnLoginEl.click().then(function(){ browser.wait(5000); });
browser.waitForAngular(); btnLoginEl.click().then(function() { Do Something });чтобы решить обещание.
Comments