Обещайте транспортир, пока условие не будет выполнено - PullRequest
0 голосов
/ 25 октября 2018

Я пишу тесты транспортира для AngularJS с жасмином.Я отслеживаю строку в таблице, которая переместится из таблицы In Progress в таблицу Completed.Это может занять от 30 секунд до 20 минут.Мне нужно заставить Protractor ждать появления строки в таблице «Завершено».

Я использую 2 элемента в строке, чтобы идентифицировать ее как уникальную строку, которую я отслеживаю.Функция поиска для этой строки представляет собой сложную цепочку селекторов элементов и проверок, которая возвращает Promise, который разрешается в объект, содержащий элемент строки.Приблизительно упрощенно:

searchForElement = function() {
  var response = element.all(by.repeater(...))
                 .then(...)
                 .then(...)
                 .filter(...)
                 .then(... 
                     //if found, response.value = element object 
                     //if not found, response.value = false
                  );
  return response;
};

Я пытался вызвать поиск из browser.wait (), но даже когда строка найдена, она остается застрявшей в browser.wait () и время ожидания jasmine.Я попытался изменить jasmine.DEFAULT_TIMEOUT_INTERVAL на 1500000, а также на 0, и он все еще истекает.

browser.wait( function() {
  searchForElement().then( function (result) {
    // if result.value is an object, return true
  });
}, timeout).then( function() {
  // assertions
});

После поиска в Интернете я попытался использовать $ интервал, но я получил ошибки о том, что $ интервал не определен,Очевидно, он не предназначен для тестирования.

Как я могу опрашивать функцию поиска (которая возвращает обещание) с интервалом, таким образом, чтобы он прекращал опрос, когда строка найдена в таблице «Завершено», и время ожиданиячерез 25 минут, если строка не найдена?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

решено: у меня было 2 ошибки.

Во-первых, я не возвращал true из цикла browser.wait.Таким образом, функция поиска нашла элемент, но он застрял в цикле ожидания.Вот мое решение:

var visible = false;
browser.wait( function() {
  searchForElement().then( function (result) {
    // if result.value is an object, set visible to true
    visible = true;
  });
  return visible;
}, timeout).then( function() {
  // assertions
});

Во-вторых, если тайм-аут на browser.wait был больше, чем jasmine.DEFAULT_TIMEOUT_INTERVAL, то код мог успешно выйти из browser.wait, а затем немедленно сообщить о тайм-ауте жасмина, потому чтоБлок it не был завершен в течение времени ожидания jasmine.

Я также пришел к выводу, что нет необходимости использовать интервал для опроса функции поиска, потому что поиск возвращает Promise.Цикл browser.wait просто продолжает вызывать функцию поиска, пока не получит желаемый ответ.

0 голосов
/ 26 октября 2018

Попробуйте это

var elementWeWaitFor = element(by.id('element1'));    
var EC = protractor.ExpectedConditions;
    browser.wait(EC.presenceOf(elementWeWaitFor), 20000).then(function() {
        elementWeWaitFor.click(); //or do whatever with the element
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...