Как работает waitForAngularEnabled?

Мне интересно, как работает waitForAngularEnabled()? Однако, хотя это не кажется сложным, я не мог получить удовлетворительных ответов в любом месте. Так что, надеюсь, кто-то поможет мне очиститься.

Моя цель - проверить критерии и приостановить/заблокировать текущий тест до тех пор, пока критерии не будут соответствовать. Вот примеры, например.

а. для приостановки запуска теста и ожидания загрузки страницы.

    ...
    let theElement = ...;
    browser.waitForAngularEnabled(false);
    browser.wait(protractor.ExpectedConditions.presenceOf(theElement));

В. использовать browser.wait(), альтернативный способ для аналогичной цели с A

    browser.wait(() => {
        browser.waitForAngularEnabled(false);
        return browser.isElementPresent(by.id('the-element-id'));
    }, timeout); // timeout may not be given

Итак, вопрос:

  • Что произойдет после вызова waitForAngularEnabled (false)? (после того, как в моем случае будут встречаться критерии или тайм-аут)
  • Должен ли я возвращать waitForAngularEnabled (true) для продолжения нормального тестирования?
  • Если я должен это сделать, куда его поместить?

Надеемся получить четкие ответы с некоторым фоном.

Спасибо!

Ответ 1

1. Что произойдет после вызова waitForAngularEnabled (false)? (после того, как в моем случае будут встречаться критерии или тайм-аут)

Эмпирически я обнаружил, что это, по-видимому, заставляет Protractor вести себя как просто Webdriver. Он не ждет, пока Angular "успокоится" (без ожидающих запросов HTTP или просмотра обновлений), что является поведением для true. Вместо этого, если вы используете параметр false, вам нужно будет использовать ExpectedConditions или аналогичные подходы, чтобы проверить предварительные условия для выполнения тестовых шагов надежно, так же, как и с обычным тестом Webdriver.

2. Должен ли я возвращать waitForAngularEnabled (true), чтобы продолжить нормальное тестирование?

Да. Однако я обнаружил, что в Protractor 5.1.1 и 5.1.2, независимо от того, использует ли поток управления или нет, рассеяние разных значений waitForAngularEnabled во всех ваших тестах в одном и том же исполнении, по-видимому, дает непредсказуемые результаты; то есть включенное состояние не соответствует той же асинхронной семантике других вызовов Protractor/Webdriver. До сих пор я пришел к выводу, что вы не можете надежно смешивать waitForAngularEnabled (false) и waitForAngularEnabled (true) в том же самом исполнении. Я подозреваю, что это ошибка "Протрактор", но я еще не разработал простую и надежную проверку, чтобы доказать ее в поддержку отправки проблемы "Протрактор". Возможно, возникла проблема с здесь, теперь закрыта, но не полностью диагностирована.

3. Если я должен это сделать, куда его поместить?

"Перед" вы вызываете вызовы Protractor/Webdriver, которые требуют восстановления семантики ожидания Angular. Однако, как упоминалось выше, не ясно, что вы можете надежно гарантировать, что такие вызовы действительно будут выполнены в контексте настройки true.

Если у вас есть несколько тестов, которые используют false и другие true, вы можете запускать их в отдельных исполнениях (отдельные процессы, не запускать их с помощью той же команды protractor или ng e2e). Я не сталкивался с проблемами при использовании этого подхода.