Как получить надежные результаты транспортира?
Я использую Protractor (v 1.3.1) для запуска тестов E2E для моего приложения Angular 1.2.26.
Но иногда тесты проходят нормально, иногда нет. Кажется, что иногда проверка выполняется до обновления дисплея (или что-то вроде проблемы с синхронизацией).
Я пробую много вариантов:
- добавить
browser.driver.sleep
инструкции,
- отключить эффекты с помощью
browser.executeScript('$.fx.off = true')
- добавить
browser.waitForAngular()
инструкции
без успеха.
Какая практика дает возможность испытать тесты E2E с транспортиром?
JM.
Ответы
Ответ 1
Каждый раз, когда у меня возникают подобные проблемы, я использую browser.wait()
с "Ожидаемый Условия" (введенный в транспортиртер 1.7). Существует набор встроенных ожидаемых условий, которых обычно достаточно, но вы можете легко определить свои пользовательские ожидаемые условия.
Например, ожидание появления элемента:
var EC = protractor.ExpectedConditions;
var e = element(by.id('xyz'));
browser.wait(EC.visibilityOf(e), 10000);
expect(e.isDisplayed()).toBeTruthy();
Несколько заметок:
-
вы можете указать собственное сообщение об ошибке в случае, если условия не будут выполнены, и будет выдана ошибка тайм-аута, см. Пользовательское сообщение об ошибке ожидания ожидания
browser.wait(EC.visibilityOf(e), 10000, "Element 'xyz' has not become visible");
-
вы можете установить EC
как глобально доступную переменную, указывающую на protractor.ExpectedConditions
. Добавьте эту строку в onPrepare()
в свой конфиг:
onPrepare: function () {
global.EC = protractor.ExpectedConditions;
}
-
как пример пользовательского ожидаемого условия, см. этот ответ
Ответ 2
Еще один момент, который очень важен для тестирования с помощью Protractor, - это понимание ControlFlow. Вы можете найти объяснение и пример кода здесь: Когда мы должны использовать. Then с Promractor Promise?
Жан-Марк
Ответ 3
Можно рассмотреть две вещи.
Во-первых, вы должны правильно упорядочить все действия транспортира (как также намечено @jmcollin92). Для этого я обычно использую .then
на каждом шаге.
Вторая важная задача - убедиться, что новый тест it(...)
запускается только после завершения предыдущего it(...)
.
Если вы используете последнюю версию Protractor, вы можете использовать Jasmine 2.x и ее поддержку для сигнализации завершения теста:
it('should do something', function(done) {
clicksomething().then(function() {
expect(...);
done();
});
});
Здесь аргумент done
вызывается, чтобы сигнализировать, что тест готов. Без этого, Protractor запланирует команду clicksomething
, а затем сразу же перейдет к следующему тесту, возвращаясь к текущему тесту только один раз clicksomething
.
Поскольку, как правило, оба теста проверяют и, возможно, изменяют один и тот же браузер/страницу, ваши тесты становятся непредсказуемыми, если вы позволяете им проходить одновременно (один тест нажимается на следующую страницу, а другой все еще проверяет предыдущую страницу).
Если вы используете более раннюю версию Protractor (1.3, как вы указали), функции Jasmine 1.3 runs
и waitsFor
могут использоваться для имитации этого поведения.
Обратите внимание, что вся точка использования Protractor заключается в том, что Protractor должен знать, когда закончится Angular. Так что в принципе не должно быть необходимости когда-либо звонить waitForAngular
(мой собственный набор тестов с десятками сценариев не включает в себя одиночное wait/waitForAngular). Чем лучше ваше приложение под контролем придерживается принципов дизайна Angular, тем меньше waitForAngular
вам нужно.
Ответ 4
Я бы добавил, что отключить ngAnimate может быть недостаточно. Вам также может потребоваться отключить всю анимацию перехода, введя CSS (Каков самый чистый способ временно отключить эффекты перехода CSS?).