Подтвердить что ты не робот

Транспортир: как дождаться завершения страницы после нажатия кнопки?

В тестовой спецификации мне нужно нажать кнопку на веб-странице и дождаться полной загрузки новой страницы.

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');
4b9b3361

Ответ 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 });

чтобы решить обещание.