2015-09-29 2 views
3

В предыдущем вопросе у меня есть проблема с нажатием кнопки, пока не будет отключено ответ был:транспортир бесконечный цикл

var nextPage = function() { 
    if (element(by.css('[ng-click="vm.nextPage()"]')).isEnabled()) { 
     element(by.css('[ng-click="vm.nextPage()"]')).click(); 
     nextPage(); // next page 
    } 
    else { 
     return; // the element is not enabled, last page 
    } 
} 

мне пришлось изменить его немного, чтобы мой код теперь выглядит как этот

var nextPage = function() { 
    if (element(by.id('next')).isEnabled()) { 
    element(by.id('next')).click().then(function() { 
     browser.sleep(1000); 
     nextPage(); // next page 
     return; 
    }); 
    } else { 
    return; // the element is not enabled, last page 
    } 
    return; 
} 

, но теперь он перескакивает в бесконечные рекурсивные вызовы, поэтому следующий шаг не может быть выполнен, как я не могу его изменить, без использования функции .then не работает вообще.

ответ

3

Проблема в том, что корпус рекурсии никогда не встречается, и он никогда не существует рекурсии.

Помните, что все в транспортира обещание, isEnabled() в вашем случае является нерешенной обещание, которое всегда «truthy». Вот почему вы всегда переходите к следующему циклу независимо от реального значения isEnabled и в конечном итоге получаете максимальную ошибку глубины рекурсии.

Resolve обещание явно получить реальную isEnabled логическое значение:

element(by.id('next')).isEnabled().then(function (isEnabled) { 
    if (isEnabled) { 
     // ... 
    } else { 
     return; // the element is not enabled, last page 
    } 
}); 

В качестве примечания, бесстыдной продвижение, которые могли бы помочь поймать этот вопрос ранее - eslint-plugin-protractor и it's rule to catch when protractor promises are used inside if conditions directly without being explicitly resolved. Вот что он мог бы вывести, если он был выполнен в отношении кода, опубликованного в вопросе:

$ eslint test.js 
/path/to/test.js 
    2:5 warning Unexpected "isEnabled()" inside if condition protractor/no-promise-in-if 
    4:13 warning Unexpected browser.sleep()     protractor/no-browser-sleep