Adaptive, resilient waits for Selenium powered by nano-wait
Project description
selenium-nanowait
Sincronização adaptativa baseada em estado para Selenium — alimentada pelo motor NanoWait.
🚀 O que é o selenium-nanowait?
O selenium-nanowait é uma biblioteca de suporte para Selenium que elimina esperas frágeis baseadas em tempo, sincronizando as ações do navegador com o estado real da página, e não com timeouts arbitrários.
Em vez de adivinhar quanto tempo esperar (time.sleep(5) ou WebDriverWait(10)), o selenium-nanowait aguarda o que realmente importa:
- Visibilidade do elemento
- Estabilidade do layout (posição e tamanho constantes)
- Prontidão do DOM (
document.readyState === "complete")
Não é um substituto para o Selenium, mas sim uma melhoria direta que funciona lado a lado com seu código existente. Você continua usando o Selenium como sempre fez — o selenium-nanowait apenas torna a espera determinística, adaptativa e confiável.
🧠 Filosofia de Design
O selenium-nanowait segue três regras estritas:
- Complementar, nunca substituir o Selenium.
- Esperar por estados, não por tempo.
- Manter-se explícito e opcional (opt-in).
Não há monkey-patching, globais ocultos ou drivers customizados.
🛠️ Instalação
pip install selenium-nanowait
Requisitos
- Python ≥ 3.8
- Selenium ≥ 4.x
- NanoWait ≥ 4.0.0 (motor adaptativo core)
💡 Início Rápido: A Função wait_for
A função wait_for é o novo ponto de entrada da biblioteca. Ela encapsula toda a lógica de sincronização adaptativa e retorna um elemento pronto para interação.
Antes (Frágil, Baseado em Tempo)
import time
from selenium.webdriver.common.by import By
# Você está adivinhando quanto tempo o elemento levará para aparecer
time.sleep(3)
driver.find_element(By.ID, "submit").click()
Depois (Consciente de Estado, Determinístico)
from selenium_nanowait import wait_for
# O clique só ocorre quando o elemento está realmente pronto
wait_for(driver, "#submit").click()
⚙️ API Principal
wait_for()
wait_for(
driver,
selector: str,
*,
timeout: float | None = None,
**nano_kwargs
)
Esta função retorna um AdaptiveElement, um wrapper leve que estende o comportamento do Selenium sem substituí-lo.
Métodos do AdaptiveElement
| Método | Descrição | Exemplo |
|---|---|---|
.click() |
Aguarda a estabilidade e clica quando o elemento está pronto. | wait_for(driver, "#login").click() |
.type(text, clear=True) |
Aguarda prontidão e digita o texto. | wait_for(driver, "#email").type("user@email.com") |
.raw() |
Retorna o WebElement nativo do Selenium, intocado. |
el = wait_for(driver, "#submit").raw() |
Verificação de Estabilidade Visual
O elemento só é considerado pronto quando:
- Está visível (
is_displayed). - O DOM está carregado (
document.readyState === "complete"). - Estabilidade de Layout: Sua posição e tamanho permanecem constantes entre verificações consecutivas.
🧠 Por que o selenium-nanowait é diferente?
| Característica | ❌ Waits Tradicionais do Selenium | ✅ selenium-nanowait |
|---|---|---|
| Base | Baseado em tempo/condição isolada | Baseado em estado real e visual |
| Escopo | Global ou Condicional | Escopo de elemento adaptativo |
| Espera | Baseada em estimativa | Backoff adaptativo (NanoWait) |
| Instabilidade | Frágil sob carga do sistema | Consciente de layout e performance |
| Debug | Erros genéricos de Timeout | Diagnósticos determinísticos |
⏱️ Espera Adaptativa (via NanoWait)
Internamente, a biblioteca delega as decisões de tempo ao NanoWait, que:
- Adapta a frequência de polling.
- Evita busy-waiting.
- Ajusta o tempo de espera de forma inteligente com base no desempenho do sistema.
🔬 Diagnósticos de Falha
Em vez de erros genéricos como TimeoutException, o selenium-nanowait levanta erros descritivos:
"Element '#submit' was found but never became stable. Observed multiple layout shifts before timeout."
🧑💻 Exemplos Avançados
Digitando com parâmetros customizados
wait_for(
driver,
"#email",
timeout=5,
smart=True,
speed="fast"
).type("usuario@email.com")
Uso em Páginas Dinâmicas (SPA)
Mesmo em aplicações React, Vue ou Next.js, o clique só ocorre quando o layout está estável, reduzindo falhas intermitentes em transições de página.
wait_for(driver, "button.submit", verbose=True).click()
📦 Metadados do Projeto
- Licença: MIT
- Autor: Luiz Filipe Seabra de Marco
- Status: Pronto para produção (v0.1)
Resumo: selenium-nanowait faz o Selenium esperar pela realidade, não pelo relógio.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file selenium_nanowait-0.2.0.tar.gz.
File metadata
- Download URL: selenium_nanowait-0.2.0.tar.gz
- Upload date:
- Size: 5.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c4ac01c39c8c1a4024d79b1b23ae95d2f06c6e75734283051097a442c226d8c
|
|
| MD5 |
18f3c7d817e4fbe10e5af715d5417488
|
|
| BLAKE2b-256 |
1fc6afdbebea626593d04cf80d4bb7c7df512deb2917e02638e4449137bec62d
|
File details
Details for the file selenium_nanowait-0.2.0-py3-none-any.whl.
File metadata
- Download URL: selenium_nanowait-0.2.0-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5f523d2f50bb6df28e641972454a5e4e9f2ca6e06efb0a2686abe160abfd541
|
|
| MD5 |
57b9c8f079b2f699ba85bb0493cc0acb
|
|
| BLAKE2b-256 |
f9b57b1e8d2c652e0f4ac2bb2408d669ddb415ecb8db41b83363f94d7ce0e833
|