Транспортир browser.wait не ждет

Я предполагаю, что 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  

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


person Justin    schedule 06.01.2015    source источник


Ответы (3)


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

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

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

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

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

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

См. варианты использования здесь:

person alecxe    schedule 06.01.2015
comment
Прекрасная вещь в том, что пример кода в документе показывает это как блокирующее ожидание, а раздел Returns предупреждает вас, что это Promise. См.: angular.github.io/protractor/#/ Пример из документа: var started = startTestServer(); driver.wait(started, 5 * 1000, 'Server should start within 5 seconds'); driver.get(getServerUrl()); - person atoth; 30.03.2016
comment
@atoth - согласен с вашим утверждением. Указанный вами пример кода вводит в заблуждение, поскольку он показан как блокирующий. то есть функция driver.get() должна быть фактически обернута внутри выполненного обещания. - person bob.mazzo; 25.01.2017

Вам нужно указать транспортиру сделать паузу, пока browser.wait не будет завершено, используя await

it('test case', async () => {
  await browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
  });
  console.log('2 - BeforeEach after wait');
});
person Sergey Pleshakov    schedule 09.02.2021

Функция ожидания будет удерживать выполнение для этой конкретной функции, но JavaScript работает асинхронно. Поэтому иногда может быть шанс, что ваша функция будет выполнена до функции ожидания. Чтобы лучше понять это, вам нужно прочитать Promises в angular/protractor.

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

browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
}).then(function () {
    console.log('2 - BeforeEach after wait');
});
person Yash Jagdale    schedule 02.11.2017