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.