Подтвердить что ты не робот

Как получить надежные результаты транспортира?

Я использую Protractor (v 1.3.1) для запуска тестов E2E для моего приложения Angular 1.2.26.

Но иногда тесты проходят нормально, иногда нет. Кажется, что иногда проверка выполняется до обновления дисплея (или что-то вроде проблемы с синхронизацией). Я пробую много вариантов:

  • добавить browser.driver.sleep инструкции,
  • отключить эффекты с помощью browser.executeScript('$.fx.off = true')
  • добавить browser.waitForAngular() инструкции

без успеха.

Какая практика дает возможность испытать тесты E2E с транспортиром?

JM.

4b9b3361

Ответ 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;
    }
    
  • как пример пользовательского ожидаемого условия, см. этот ответ

Ответ 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 вам нужно.