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



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



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');
537   9  

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

    Ничего не найдено.