2015-01-06 3 views
25

Я предполагаю, что browser.wait должен быть блокирующим вызовом, но он не работает так, как я ожидал. Вот мой пример:Protractor browser.wait на самом деле не ждет

describe("browser.wait", function() { 
    beforeEach(function() { 
     browser.wait(function() { 
      console.log('1 - BeforeEach WAIT'); 
      return true; 
     }); 
    console.log('2 - BeforeEach after wait'); 
}); 

afterEach(function() { 
    browser.wait(function() { 
     console.log('4 - afterEach WAIT'); 
     return true; 
    }); 
    console.log('5 - afterEach after wait'); 
}); 

it('should probably actually wait.', function() { 
    console.log('3 - IT statement'); 
    expect(1).toBe(1);  
}); 

Теперь, потому что я предположил, browser.wait фактически блокирует, я думал, что мои console.log звонки будут выполняться в порядке; 1,2,3,4,5;

Фактический выход я получаю:

2 - BeforeEach after wait 
1 - BeforeEach WAIT 
3 - IT statement 
5 - afterEach after wait 
4 - afterEach WAIT 

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

ответ

35

Все дело в обещаниях (на самом деле каждый вопрос с транспортиром связан с обещаниями).

browser.wait() не блокирующий вызов, он расписания команды ждать условия:

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

Это не вызовет функцию, которую вы передаете немедленно, она будет планировать команду и ждать, пока обещание будет разрешено (если функция внутри возвращает обещание).

Вы можете использовать then() иметь правильный порядок в этом случае:

beforeEach(function() { 
    browser.wait(function() { 
     console.log('1 - BeforeEach WAIT'); 
     return true; 
    }).then(function() { 
     console.log('2 - BeforeEach after wait'); 
    }); 
}); 

См прецеденты здесь:

+5

Прекрасная вещь, связанная с тем, что пример кода в документе показывает это как блокирование ожидания, в то время как раздел «Возвращает» предупреждает вас, что это «обещание». См. Https://angular.github.io/protractor/#/api?view=webdriver.WebDriver.prototype.wait Пример из документа: 'var started = startTestServer(); driver.wait (начато, 5 * 1000, «Сервер должен начинаться в течение 5 секунд»); driver.get (getServerUrl()); ' – atoth

+0

@atoth - соглашайтесь с вашим заявлением.Образец кода, который вы указали, вводит в заблуждение, как это показано в качестве блокировки. то есть функция 'driver.get()' должна фактически завернуться в выполненном обещании. –

1

функция Wait проведет выполнение для этого конкретная функция, но JavaScript работает как асинхронный путь. Поэтому иногда может возникнуть вероятность того, что ваша функция будет выполнена до функции ожидания. Чтобы лучше понять, вам нужно прочитать «Обещания» в угловом/транспортирном устройстве.

Чтобы получить код, вам необходимо .then (function() {}); (запросить функцию 2 дождаться 1-го завершения.

browser.wait(function() { 
    console.log('1 - BeforeEach WAIT'); 
    return true; 
}).then(function() { 
    console.log('2 - BeforeEach after wait'); 
}); 
Смежные вопросы