2015-11-09 2 views
2

Я перехожу от Protractor к Nightwatch.js, и я сталкиваюсь с некоторыми трудностями с тем, как Nightwatch выполняет обещания.Как выполнить обещание с помощью Nightwatch

Чтобы привести пример, я пытаюсь подсчитать количество элементов, удовлетворяющих заданному критерию. Функция подсчета в объект страницы, так отделено от самого теста:

Команда страница объекта:

countToDoList: function(browser) { 
     browser.elements('css selector', "input[ng-model='todo.done']", function(result){ 
      return result.value.length; 
     }); 
    } 

и вызов в тесте:

'Angular - 1' : function(browser) { 
    var angular = browser.page.angularPO(); 
    var mainPage = angular.section.main; 

    angular.openMainPage(browser); 
    var countToDoBoxes = 0; 

    countToDoBoxes = mainPage.countToDoList(browser); 
    console.log("countToDoBoxes = " + countToDoBoxes); 

    browser.end(); 
} 

Это возвращает «countToDoBoxes = undefined ". И, основываясь на моем (коротком) опыте с Транспортером, я предполагаю, что это связано с тем, что функция не выполняет обещание, когда она передается в «countToDoBoxes».

Есть ли способ сделать эту работу?

+1

Если вы ожидаете 'browser.elements' вернуть обещание, то вы, вероятно, следует использовать' .then() 'вместо передачи обратного вызова непосредственно. Кроме того, вам, очевидно, придется «возвращать» метод 'countToDoList'. – Bergi

+0

Только для моих собственных интересов, почему вы переключаетесь? – SuperUberDuper

+0

@SuperUberDuper: Я работаю над другим проектом, и этот новый работает с Nightwatch.js (не мой выбор и не может его изменить) – Majuj

ответ

5

Я не мог найти описание API для elements, но вот ваш код, измененный для возврата обещания Bluebird. (Вы могли бы сделать что-то подобное с библиотекой Promise вашего выбора.)

countToDoList: function(browser) { 
    return new Promise(function(resolve, reject) { 
     browser.elements('css selector', "input[ng-model='todo.done']", function(result){ 
      resolve(result.value.length); 
     }); 

    }); 
} 
+1

Это комментарий, а не ответ. Вы можете сделать это в одном, показывая пример того, как этот код будет работать, используя обещание. –

+1

@StefanHanke Просмотрите мой (теперь измененный) ответ на вопрос OP и убедитесь, что он соответствует вашим ожиданиям. Спасибо за ответ. –

+0

Теперь все выглядит хорошо. Благодаря! См. [Здесь] (http://nightwatchjs.org/api#elements) для вызова элементов API NightwatchJS (к сожалению, документы ... не очень полезны на самом деле). [JWP] (https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/elements) более полезен. –

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