Транспортир: Як дочекатися завершення сторінки після натискання кнопки?


78

У тестовій специфікації мені потрібно натиснути кнопку на веб-сторінці та почекати, поки нова сторінка повністю завантажиться.

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

2
Чи можете ви бути більш конкретними на сторінці, яку чекаєте? Ви просто чекаєте на зміну сторінки або на якесь асинхронне завантаження?
Furzel

Відповіді:


92

Залежно від того, що ви хочете зробити, ви можете спробувати:

browser.waitForAngular();

або

btnLoginEl.click().then(function() {
  // do some stuff 
}); 

вирішити обіцянку. Було б краще, якщо ви зможете це зробити в beforeEach.

Примітка: Я помітив, що очікування () чекає, поки обіцянка всередині (тобто getCurrentUrl) буде вирішена перед порівнянням.


Дякуємо за обмін, допомогли виявити деякі дивні непостійні проблеми.
Hakan Serce

1
У мене все ще є проблема:
Час очікування

3
Це не вирішило мою проблему очікування, поки javascript закінчить редагування сторінки після натискання кнопки. Додавання, browser.driver.sleep(1000)як було запропоновано нижче, зробило фокус.
CGFoX

3
waitForAngular() не слід використовувати . Про click().then()це мені не вдалося. Я міг покластись лише на browser.wait(//use of protractor.ExpectedConditions).
Coli

30

Я щойно подивився джерело - транспортир чекає Angular лише в декількох випадках (наприклад, коли element.all викликається або встановлюється / отримується місце розташування).

Отже, транспортир не буде чекати, поки Angular стабілізується після кожної команди.

Крім того, схоже, що іноді в моїх тестах у мене була гонка між циклом дайджест-дайджесту та подією клацання, тому іноді мені доводиться робити:

elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();

використання режиму сну для очікування виконання, щоб увійти в контекст AngularJS (викликається clickподією).


1
Транспортер не синхронізує .click (), він синхронізував наступну операцію, що включає ElementFinder / ElementArrayFinder.
Макс

З досвіду я знаю, що транспортир буде чекати кута при оцінці сподівань за допомогою expect. В інших випадках я прямо використовую waitForAngular.
jrharshath

1
хоча вашій посаді майже два роки, я вважаю, ви все ще маєте рацію. Наразі мені потрібно додати '.sleep (1000)' після транспортира element(by.css('my-css')).click(). Здається, що .click НЕ чекає, хоча обіцянка повертається.
bob.mazzo

Я завжди користуюся обіцянками. Наприклад:return elm.click().then(function () { return nextAction(); }
Ед Грівз

3
Я не рекомендую використовувати явний режим сну, оскільки ви сплять, навіть якщо ваша програма завантажується швидше, ніж налаштований режим сну.
timbru31

25

Вам не потрібно чекати. Транспортер автоматично чекає готовності кутового, а потім виконує наступний крок у контрольному потоці.


5
теоретично так, оскільки waitForAngular()це називається внутрішньо, але мені довелося зателефонувати і для деяких специфікацій.
glepretre

8
Це автоматично чекає? Дивлячись на щось подібне browser.get, він прямо заявляє, що існує, щоб перезаписати річ, яку він загортає. Якщо для цього немає clickметоду ElementFinder, здається, що він просто делегує до webDriver.WebElement. angular.github.io/protractor/#/api?view=ElementFinder
Снексе

5
@Snekse Protractor синхронізував всі операції над ElementFinder та ElementArrayFinder. Отже, всякий раз, коли ваш тест намагається шукати будь-який елемент, сам пошук буде чекати angular, щоб завершити цикл перетравлення, а потім делегувати виклик webdriver. Те саме відбувається у дзвінку awac ().
Макс

8
Якби нам не потрібно було чекати, тоді цю тему не було б переглянуто 100 000 разів.
Джастін

7

З транспортиром ви можете використовувати наступний підхід

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 готовий. Подальший оператор 'очікувати ()' забезпечить транспортиру очікування, поки DOM стане доступним для тестування.

Довідково: Очікувані умови транспортира


3

У цьому випадку ви можете використовувати:

Об'єкт сторінки:

    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);

2

Зазвичай я просто додаю щось до потоку управління, тобто:

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();
}

1

Використовуйте це, я думаю, що це краще

   *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;
        };

-1

Ви можете зробити щось подібне

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click().then(function(){
browser.wait(5000);
});


browser.wait (5000) повертає «Не присвоюється тип функції», так як browser.wait приймає в> 1 аргументи, першим з яких є умовою, другий час ...
IWI

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.