Protractor browser.getCurrentUrl() не работает при изменении маршрута

Я только начал использовать транспортир для e2e-тестирования одностраничного приложения Angular. Я начал тестирование со страницы входа в систему. Этот тест я написал для провального случая

Tesr Case 1

  it('Login with wrong email', function() {
    loginPage.get();
    loginPage.setEmail('xxxxx@xxxx.com');
    loginPage.setPassword('12345678');
    loginPage.submit()

    expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/login')
  })

Приведенный выше код работает отлично. Я проверяю ошибку входа в систему с помощью URL-адреса, если URL-адрес не изменился, считайте его неудачным. Q1) Это правильный подход? я должен проверить сообщение об ошибке, я видел такой пример, поэтому тестирование неудачного входа в систему с помощью URL.

Тестовый пример 2

Здесь я получаю сообщение об ошибке, чтобы проверить успешный вход в систему.

it('Login with correct email', function() {
  loginPage.get();
  loginPage.setEmail('YYYY@YYYY.YY');
  loginPage.setPassword('12345678');
  loginPage.submit()
  expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/home')
})

Приведенный выше тестовый пример также отлично работает, если я не использую browser.getCurrentUrl()Я получаю следующую ошибку при использовании getCurrentUrl, этот loginPage.submit() является успешной попыткой входа в систему и перенаправляет на другой маршрут.

Превышено время ожидания синхронизации транспортира с страницей через 11 секунд. Пожалуйста, смотрите https://github.com/angular/protractor/blob/master/docs/faq.md. Следующие задачи ожидали решения

Я погуглил эту проблему и нашел много решений, и ни один из них, кажется, не работает.

Испытанные решения

  1. добавленной allScriptsTimeout, getPageTimeout в файл конфигурации транспортира.
  2. добавленной defaultTimeoutInterval в конфигурационный файл
  3. Нашел следующие вопросы SO link1, link2 и эту проблему с github, перепробовал все три, и, похоже, ни один не работает
  4. Когда я погуглил с timeout сообщение об ошибке, я нашел это так вопросы link1, link2, я пробовал все, что не работает

В основном все решения говорят об использовании wait, sleep, waitForAngular, Я попробовал все в thenable мода, так как все возвращается обещание. Я нашел эту проблему из-за использования browser.getCurrentUrl, Дайте мне знать, где я делаю что-то не так, и хотели бы глубоко узнать о тестировании e2e с помощью транспортира.

Я хотел бы знать основы транспортира, как он работает при изменении маршрута и как асинхронные действия пользователя, такие как $http обрабатывается транспортиром. Должен ли я явно использовать обещания и т. Д.

Любая помощь с благодарностью.

3 ответа

Решение

В идеальном мире вы не должны добавлять какие-либо ожидания и Protractor Естественно, следует дождаться, когда Angular будет готов и в целом работать синхронно с ним.

К сожалению, в реальном мире часто возникает необходимость добавить ожидания. Тем не менее, предпочитайте явное ожидание с конкретными условиями жестко закодированным browser.sleep() звонки, которых обычно следует избегать. В этом случае мы можем добавить ожидание для ожидания определенного URL, см. Этот ответ.

Проблема здесь не в browser.getCurrentUrl()Эта часть работает нормально, как вы упомянули в тесте, который работает правильно.

Транспортир дает вам большой совет, когда говорит вам Timed out waiting for Protractor to synchronize with the page after 11 secondsЭто способ сказать, что он не смог захватить вашу угловую страницу - или ваша угловая страница никогда не заканчивала загрузку в первую очередь, чтобы продвинуться вперед в выполнении теста. Это происходит, когда вы используете много $timeouts или чрезмерный опрос на вашей странице. Чтобы устранить эту проблему, запустите тестовый набор с jasmine-spec-reporter и он сообщит вам, какую функцию ожидает страница (которая блокирует синхронизацию)

[Я видел это в отношении других вопросов где-то еще, я думаю, на Stackru. Это не оригинал.] То, что я делал, это:

var EC, elm;//I have these as globals, because the issue arises a lot

EC = protractor.ExpectedConditions;

//after your click

elm = element(by.linkText('Logout'));//on menu at top, helps timing, 
//your next page may vary, but we have Logout only after you log in

browser.wait(EC.presenceOf(elm), 20000);
expect(e2.isPresent()).toBeTruthy();
expect(browser.getCurrentUrl()).toContain("data_entry");//where I say 
//data_entry you would say 
//home

Если вы думаете, что иметь несколько ожиданий - это плохая форма, я подозреваю, что вы могли бы безвредно удалить первое. НТН

Другие вопросы по тегам