Почему мне нужно использовать waitForAngular (false) & browser.sleep (3000)? - PullRequest
0 голосов
/ 27 сентября 2019

У нас есть веб-сайт, который построен на 100% из Angular, и меня попросили использовать Protractor для написания сквозного тестирования.Теперь столкнулся с проблемой, что если я не использую waitForAngular(false) и browser.sleep(3000), то мой тест не пройден, даже если я использовал ExpectedCondition.

Так вот мой сценарий:

В логинестранице, я могу найти все элементы, отправить ключи в поле ввода и войти.Но после входа в систему это не удается.Он не может найти какой-либо элемент, нажмите на любой элемент вообще.

Мой код выглядит следующим образом.

describe("/profile", () => {
  let page: Profile;

  beforeAll(async () => {
    page = await login(Profile, user, login);
    await browser.wait(ExpectedConditions.presenceOf(page.element));
    await navigate(path.profile)
  })

  afterAll(async () => {
    logout();
  })

  it("should have navigate to the page", async () => {
    expect(await browser.getCurrentUrl()).toContain("/profile");
  });

  it("should have correct page markup", async () => { 
// this test fails without waitForAngular(false)
// or browser.sleep(3000) in the navigation or OnPrepare in the config
    expect(await page.headerTitle.isDisplayed()).toBe(true);
    expect(await page.headerTitle.getText()).toContain("Profile")
  })
})

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Прежде всего, browser.wait() принимает три параметра - состояние функции, время ожидания, сообщение о сбое.Только последний не является обязательным.Вы забыли указать время ожидания в миллисекундах, вероятно, это вызывает вашу проблему

Во-вторых, waitForAngular принимает необязательную строку в качестве описания.ИДК, почему вы передаете false ему

0 голосов
/ 27 сентября 2019

Как я понял из комментариев, в вашем приложении (которое должно быть протестировано с транспортиром) у вас есть setInterval, setTimeout или длительно выполняемые и многократно выполняемые асинхронные операции.

Перед выполнением ProtractorВ любой спецификации теста он пытается подождать, пока приложение Angular 2 «синхронизируется», то есть завершит все ожидающие операции.По умолчанию Protractor определяет 11-секундный тайм-аут, чтобы это произошло.

Поскольку у вас есть некоторые «бесконечные» операции - сбой синхронизации и выполнение транспортира прекращается с ошибкой тайм-аута.

Вы можете использовать Zone.js , чтобы избежать этого:

ngZone.runOutsideAngular(() => {
    setInterval(() => {
        ngZone.run(() => {
            // async operation
        });
    }, 2500);

Исследуйте это вместе с вашими разработчиками.

Источник: https://christianliebel.com/2016/11/angular-2-protractor-timeout-heres-fix/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...