2025, Oct 19 20:15

Как настроить WebDriverWait без тайм-аута в Selenium с @timeout

Разбираем, почему WebDriverWait в Selenium не умеет ждать бесконечно, и как обойти это с декоратором @timeout: используем огромный тайм-аут через sys.maxsize.

Когда функция на Python обернута в @timeout(), добавлять внутри нее Selenium WebDriverWait зачастую кажется лишним. Декоратор уже задает общий предел времени, поэтому напрашивается вопрос: можно ли настроить WebDriverWait так, чтобы у него вовсе не было тайм-аута?

Постановка задачи

Представим функцию, для которой действует верхнеуровневый тайм-аут, но внутри все же используется WebDriverWait. Внутреннее ожидание может завершиться раньше, чем сработает декоратор, что сводит на нет идею единой точки управления временем.

from selenium.webdriver.support.wait import WebDriverWait
@timeout()
def run_task(client):
    inner_wait = WebDriverWait(client, timeout=10)
    return inner_wait

Что на самом деле происходит и почему

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

Решение

Обходной путь — передать заведомо большое значение тайм-аута. Применение sys.maxsize — простой способ заставить WebDriverWait вести себя так, словно тайм-аута нет, при этом оставаясь в рамках требований API.

import sys
from selenium.webdriver.support.wait import WebDriverWait
@timeout()
def execute_job(driver_ref):
    long_wait = WebDriverWait(driver_ref, timeout=sys.maxsize)
    return long_wait

Почему это важно

Единая политика тайм-аутов помогает избежать непредсказуемого поведения. Если за предел времени отвечает декоратор @timeout() на уровне функции, преждевременное истечение WebDriverWait может приводить к непонятным сбоям. Один общий тайм-аут упрощает логику и снижает трудозатраты при отладке.

Ключевые выводы

WebDriverWait всегда требует тайм-аут и не умеет ждать бесконечно. Если время выполнения регулируется декоратором @timeout() на уровне функции, задайте для WebDriverWait очень большое значение, например sys.maxsize, чтобы он не истекал самостоятельно. Так стратегия ожидания подчиняется единой точке управления и не сталкивается с конфликтующими ограничениями.

Статья основана на вопросе на StackOverflow от Geoff Alexander и ответе от Corey Goldberg.