2016-02-15 2 views
1

Я пытаюсь понять, как работает The WebDriver Control Flow.Нужен ли огурец с транспортиром обратный вызов?

Согласно связанной документации (https://github.com/angular/protractor/blob/master/docs/control-flow.md) нет обратного вызова метода/вызова не требуется в жасмин:

Protractor adapts Jasmine so that each spec automatically waits until the control flow is empty before exiting.

Однако, я должен использовать огурец. Я использую библиотеку protractor-cucumber-framework, как описано здесь: https://github.com/angular/protractor/blob/master/docs/frameworks.md#using-cucumber

Это работает хорошо, но по какой-то причине оно работает лучше, когда я пропускаю переменную обратного вызова, а затем, когда я пытаюсь ее использовать. Например, этот код не:

this.Given(/^the login page is active$/, function (callback) { 
    browser.get('/').then(callback); 
}); 

С ошибкой ...

TypeError: text.split is not a function

[launcher] Process exited with error code 1

С другой стороны, эти коды работает, как я хочу, чтобы работать и огурец/транспортир, кажется, не будет ждать, пока страница загружается, перед выполнением дальнейших функций:

me.Given(/^the login page is active$/, function() { 
    browser.get('/'); 
}); 

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

В настоящее время страница, которую я пытался испытание не использовать Угловой и поэтому у меня есть следующий код в моем файле конфигурации:

onPrepare: function() { 
    browser.ignoreSynchronization = true; 
} 

ответ

2

Транспортира использует WebDriverJS внизу. И WebDriverJS использует менеджер обещаний, где он ставит в очередь свои команды. Вот некоторые выдержки из их вики-страницы here

Internally, the promise manager maintains a call stack. Upon each turn of the manager's execution loop, it will pull a task to execute from the queue of the top-most frame. Any commands scheduled within the callback of a previous command will be scheduled in a new frame, ensuring they run before any tasks previously scheduled. The end result is that if your test is written-in line, with all callbacks defined by function literals, commands should execute in the order they are read vertically on the screen. For example, consider the following WebDriverJS test case:

driver.get(MY_APP_URL); 
driver.getTitle().then(function(title) { 
    if (title === 'Login page') { 
    driver.findElement(webdriver.By.id('user')).sendKeys('bugs'); 
    driver.findElement(webdriver.By.id('pw')).sendKeys('bunny'); 
    driver.findElement(webdriver.By.id('login')).click(); 
    } 
}); 
driver.findElement(webdriver.By.id('userPreferences')).click(); 

Этот тест может быть переписан с использованием Java API WebDriver, как показано ниже:

driver.get(MY_APP_URL); 
if ("Login Page".equals(driver.getTitle())) { 
    driver.findElement(By.id("user")).sendKeys("bugs"); 
    driver.findElement(By.id("pw")).sendKeys("bunny"); 
    driver.findElement(By.id("login")).click(); 
} 
driver.findElement(By.id("userPreferences")).click(); 

Теперь возвращаясь к вашему вопросу, так как вы опуская callback с ваших шагов, огурец обрабатывает ваш тестовый код синхронно. См. Документацию here. И поскольку способ транспортир/WebdriverJS обрабатывает менеджер обещаний так, как описано выше, все работает так, как ожидалось для вас.

Что касается ошибки, которую вы получаете при использовании callback, я не уверен. Я делаю это точно так же, как вы делаете. См. here. Я использую огурец ^0.9.2. Возможно, у вашей версии огурца есть проблемы.

На боковой ноте я обнаружил, что вы можете вернуть обещания вместо использования обратных вызовов, чтобы огурец знал, что вы закончили выполнение. Так что это работает так же (при условии, что вы используете ^0.9.2). Я тестировал его,

me.Given(/^the login page is active$/, function() { 
    return browser.get('/'); 
}); 
+0

Очень подробный обзор, замечательная работа! – alecxe

+0

Спасибо @alecxe – nilesh

+0

Thx, у меня есть версия '^ 0.9.4' - я только что настроил систему вчера, чтобы она была последней. Сегодня я напишу больше тестов и попробую вернуть обещания - thx – peter

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