2015-04-30 5 views
11

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

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

На сайте я тестирование является чисто AngularJS приложение, которое, в моих глазах, следует сделать browser.sleep() устаревший метод, так как существует browser.waitForAngular() метод, который точно ждет, пока страница полностью загружена по сравнению с browser.sleep(), который ждет определенное количество времени и если ваш сайт не загружен в течение этого времени (это случается), у вас будет непоследовательный тест (никто не любит несогласованность).

Исследования привели меня к мысли, что browser.waitForAngular() не учитывает анимацию и связанные с ней трудоемкие функции, поскольку они не связаны с AngularJS, но это не реализовано на нашем веб-сайте. Также waitForAngular() в основном ждет $digest, $http, и $timeout.

То, что я прошу, это что-то, что считается приемлемой потерей, поскольку Транспортер велик в целом или есть что-то, что я здесь не замечаю?

TL; Есть ли решения, позволяющие нам не устанавливать на browser.sleep()?

Источники: Protractor Timeout Docs, Timeout-spec.js (protractor docs), Issue909, Issue279, Issue92, StackQuestion1

+1

У меня возникали те же прерывистые таймауты, которые виноваты в FAQ по использованию $ timeout для опроса. Я блуждаю, если его неудача также в случае его не опроса. Для моей команды это больше освещает, поскольку мы полагаемся на компоненты Angular Material. Они сильно влияют на анимационные взаимодействия с интенсивным использованием $ timeout (func, 0). –

ответ

11

Если вы можете придумать какой-то тест, чтобы определить, является ли то, что вы ждете завершения, вы можете использовать browser.wait. Принимая идеи из http://docsplendid.com/archives/209, вы можете передать функцию, которая возвращает обещание, устраняющие к true или false, такой, как тот, который использует isPresent

browser.wait(function() { 
    return element(by.id('some-element')).isPresent(); 
}, 1000); 

или если у вас есть какое-то более сложное условие, которое вы можете использовать обещание цепочку:

browser.wait(function() { 
    return element(by.id('some-element')).isPresent().then(function(isPresent) { 
    return !isPresent; 
    }); 
}, 1000); 

и поток команд будет ждать, неоднократно вызывая функцию передается wait, пока обещание возвращается не решает true.

+1

Вы также можете использовать ExpectedConditions, чтобы дождаться таких вещей, как элемент, доступен клик, содержит текст и т. Д. Cf http://www.protractortest.org/#/api?view=ProtractorExpectedConditions – floribon

0

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

element(by.id).isPresent().then(function(result) { 
      if (result) { 
       nextButton.click(); 
      } 
      else{ 
       browser.wait(function() { 
        return browser.isElementPresent(element(by.id)); 
       },50000); 
      } 
     }).then(function() { 
      nextButton.click(); 
     }); 

    },