Подтвердить что ты не робот

Транспортировщик 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  

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

4b9b3361

Ответ 1

Это все о promises (на самом деле вопрос каждого транспортира о promises).

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');
    });
});

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

Ответ 2

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

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

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