2014-12-20 3 views
1

У нас есть приложение с сеткой из строк, имеющее Per-page SELECT и Pagination, и хотел бы выполнить тест e2e, который делает навигацию и выбор PP, затем проверяет результаты, отображаемые путем сравнения с результатом из DB (псевдо-код):надлежащим образом транспортир DRY для спецификации

it('should check navigation and pp', function() { 
    for(i=0;i<SELECT.options;i++) { 
    element(by.repeater('SELECTOR HERE(i)')).click(); 
    browser.wait(function which checks URL contains a segment(i)); 
    browser.wait(function which checks if a 'loading div is displayed'); 
    for(j=0;j<PagesForPP(i);j++) { 
     runExpects('for pp=i'); //contains a couple expect(someElement.text).toContain(asynResult()); 
     element(by.css('SELECTOR(j)').click(); 
     browser.wait(function which checks URL contains a segment(j)); 
     browser.wait(function which checks 'loading div is displayed'); 
    }   
    } 
}); 

Где функция (я) является вызовом в зависимости от текущей Perpage и функции (J)

Мой вопрос: как мы можем гнездятся две петли таким образом, что транспортир понимает (возможно, выполняет синхронно), используя protractor.promise.controlFlow() или лучший способ, если он доступен.

В настоящее время функции протранслятора игнорируют функции browser.wait (функция, которая проверяет URL-адрес, содержит сегмент (i)); Который выглядит так:

waitForPageChange: function (urlSegment) { 
    console.log('>> Waiting for URL to contain: ', urlSegment); 
    var currentUrl; 
    return browser.getCurrentUrl().then(function (url) { 
    currentUrl = url; 
    }).then(function() { 
    browser.wait(function() { 
     return browser.getCurrentUrl().then(function (url) { 
     if (urlSegment) { 
      return url.indexOf(urlSegment) >= 0; 
     } 
     return url !== currentUrl; 
     }); 
    }); 
    }); 
} 

И тест e2e завершается до того, как ожидает действительны (например: мы в странице 1, и мы уже приближались проверки 2 и 3 страницы => все тесты терпят неудачу, потому

ответ

1

Ваш waitForPageChange подход должен работать, я думаю. Я считаю, что вам не хватает «возврата» (из браузера.wait), поэтому окончательный then в функции (которая является возвратом значение целой функции) не является правильным обещанием. Попробуйте следующее:

waitForPageChange: function (urlSegment) { 
    console.log('>> Waiting for URL to contain: ', urlSegment); 
    var originalUrl; 
    return browser.getCurrentUrl().then(function (url) { 
    originalUrl = url; // XXX this is racy, the page may have changed already 
    }).then(function() { 
    return browser.wait(function() { // this line was missing a 'return' 
     return browser.getCurrentUrl().then(function (url) { 
     if (urlSegment) { 
      return url.indexOf(urlSegment) >= 0; 
     } 
     return url !== originalUrl; 
     }); 
    }); 
    }); 
} 

Обратите внимание, что код, который return muble.then(...).then(function() {return x; }) заканчивается, возвращает обещание от Последнееthen в цепи.

Кроме того, остерегайтесь случая по умолчанию, когда urlSegment не предоставляется. Вы не можете быть уверены, что «originalUrl» инициализируется достаточно быстро. Возможно, браузер переместился, прежде чем загружать его. Чтобы быть надежным, вам, вероятно, понадобится отдельный «waitForPageToLeave (x)», который ожидает, что URL-адрес изменится вдали от предоставленного, и вы должны ожидать, что вызывающий абонент будет искать этот «оригинальный» URL-адрес, прежде чем вносить какие-либо изменения. (И это будет отдельно от функции waitForPageToGoTo (x), которая ждет, пока URL-адрес станет данным.)

Смежные вопросы