Как неявное ожидание транспортира взаимодействует с явным ожиданием?

недоразумение происходит, когда неявное ожидание менее явные:

var timeOut = 5000;
var search = element(by.xpath(`//*[@name='qwer']`));
browser.manage().timeouts().implicitlyWait(4000);
browser.ignoreSynchronization = true;

describe('Protractor Test', function () {
    beforeEach(function () {
        browser.get('https://www.google.com.ua');
    });
    it('EC', function () {
        console.log('START');
        // browser.sleep(timeOut);
        browser.wait(protractor.ExpectedConditions.presenceOf(search), timeOut);
    });
});

Общее время: 8.613 секунд. Установите implicitlyWait на секунду ниже: 3000 и результат 6.865 секунд. Как это работает под капотом? Большое спасибо заранее!

3 ответов


это хороший вопрос. Многие хорошие ребята из QA automation разбили этим головы.

неявные ожидания

это специальное скрытое автоматическое ожидание, на каждом driver.findElement(...). Исходный webdriver (JS, python, java) вызывает исключение NoSuchElementException, если элемент не может быть найден в структуре DOM страницы. Такого рода ожидание будет сделано перед каждым driver.findElement, независимо от того, какой указатель вы используете. Когда неявные ожидания истекло, NoSuchElementException будет выброшен


это отличный вопрос, и эти непредсказуемые времена ожидания при использовании комбинации неявных и явных ожиданий были предупреждены и заявлены в селен документация. browser.wait() является явным ожиданием, и вы используете это в сочетании с implicit wait - browser.manage().timeouts().implicitlyWait()

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

предупреждение: Не смешивайте неявные и явные ожидания. Это может вызвать непредсказуемое время ожидания. Например, установка неявного ожидания 10 секунды и явное ожидание 15 секунд могут привести к тайм-ауту произойти через 20 секунд.


ответ: оба ожидания ждут параллельно. Неявное ожидание опрашивает 4 секунды и возвращает сбой, после которого явное ожидание ждало только 4 секунды и имеет еще 1 идти. Это переиздает неявное ожидание снова, и он опрашивает еще 4 секунды и снова терпит неудачу. После 8 секунд (2 попытки неявного ожидания) явное ожидание 5 секунд также истекло, и мы, наконец, имеем нашу ошибку после потери 3 неожиданных секунд. Например, в случае неявного набора в 8 и явного набора в 17 мы будем ждать 8*3 = 24 секунды. Обратите внимание, что выполнение скрипта занимает некоторое время, поэтому, если он медленный, следующая итерация может не начаться.