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. Следующие задачи ожидали решения
Я погуглил эту проблему и нашел много решений, и ни один из них, кажется, не работает.
Испытанные решения
- добавленной
allScriptsTimeout
,getPageTimeout
в файл конфигурации транспортира. - добавленной
defaultTimeoutInterval
в конфигурационный файл - Нашел следующие вопросы SO link1, link2 и эту проблему с github, перепробовал все три, и, похоже, ни один не работает
- Когда я погуглил с
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
Это способ сказать, что он не смог захватить вашу угловую страницу - или ваша угловая страница никогда не заканчивала загрузку в первую очередь, чтобы продвинуться вперед в выполнении теста. Это происходит, когда вы используете много $timeout
s или чрезмерный опрос на вашей странице. Чтобы устранить эту проблему, запустите тестовый набор с 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
Если вы думаете, что иметь несколько ожиданий - это плохая форма, я подозреваю, что вы могли бы безвредно удалить первое. НТН