Controle o Chromium via ChromeDriver no Termux. Alternativa ao Playwright/Selenium que não funcionam em android/aarch64.
Project description
cdriv Documentation
Lib Python para controlar Chromium via ChromeDriver no Termux (Android aarch64). Alternativa direta ao Playwright e Selenium, que não funcionam em Android/aarch64.
Índice
Instalação
pip install cdriv
Pré-requisitos no Termux
pkg update
pkg install chromium-browser chromedriver
Pré-requisitos em outros Linux (Ubuntu/Debian)
sudo apt update
sudo apt install chromium-browser chromium-chromedriver
Uso básico
Context manager (recomendado)
from cdriv import CDriv
with CDriv() as driver:
driver.new_session()
driver.navigate("https://exemplo.com")
html = driver.get_page_source()
print(driver.get_title())
Gerenciamento manual
from cdriv import CDriv
driver = CDriv()
driver.start()
driver.new_session()
driver.navigate("https://exemplo.com")
# ... faz o que precisa ...
driver.close()
driver.stop()
API Completa
Gerenciamento do ChromeDriver
CDriv(port=9515, chromedriver_path=None, chromium_path=None)
Construtor. Inicializa o controlador.
| Parâmetro | Padrão | Descrição |
|---|---|---|
port |
9515 |
Porta HTTP do ChromeDriver |
chromedriver_path |
None (auto-detect) |
Caminho do binário chromedriver |
chromium_path |
None (auto-detect) |
Caminho do binário chromium-browser |
driver = CDriv(port=9515)
driver = CDriv(chromedriver_path="/usr/bin/chromedriver")
start()
Inicia o processo do ChromeDriver. Aguarda até que ele responda na porta configurada.
Retorna self para encadeamento de métodos.
driver.start()
stop()
Para o processo do ChromeDriver. Remove o registro do atexit.
driver.stop()
restart()
Reinicia o ChromeDriver (stop + start).
driver.restart()
Sessão do navegador
new_session()
Abre uma nova janela do Chromium (cria uma sessão WebDriver). Retorna o sessionId.
O navegador inicia em modo headless com as seguintes configurações automáticas:
- Janela 1920x1080
- User-Agent Chrome 146 (Linux x86_64)
- Desabilita detecção de automação
- No-sandbox, disable-dev-shm-usage (necessário para Termux/container)
session_id = driver.new_session()
close()
Fecha a sessão atual (fecha o navegador).
driver.close()
Navegação
| Método | Descrição |
|---|---|
navigate(url) |
Navega para uma URL |
get_current_url() |
Retorna a URL atual |
back() |
Volta para página anterior |
forward() |
Avança para próxima página |
refresh() |
Recarrega a página |
driver.navigate("https://site.com")
print(driver.get_current_url())
driver.back()
driver.forward()
driver.refresh()
Extração de dados
get_page_source()
Retorna o HTML completo da página como string.
html = driver.get_page_source()
get_title()
Retorna o título da página (conteúdo da tag <title>).
titulo = driver.get_title()
Cookies
get_cookies()
Retorna a lista bruta de cookies. Cada cookie é um dicionário com as chaves: name, value, domain, path, secure, httpOnly, etc.
cookies = driver.get_cookies()
for c in cookies:
print(c['name'], c['value'])
get_cookies_dict()
Retorna cookies como dicionário {nome: valor} — ideal para usar com requests.Session().
import requests
session = requests.Session()
session.cookies.update(driver.get_cookies_dict())
resp = session.get("https://site.com/api/dados")
print(resp.json())
add_cookie(name, value, domain=None, path="/")
Adiciona um cookie manualmente à sessão.
driver.add_cookie("token", "abc123", domain=".site.com")
delete_all_cookies()
Remove todos os cookies da sessão.
driver.delete_all_cookies()
JavaScript
execute_script(script, *args)
Executa JavaScript na página e retorna o resultado.
# Ler dados da página
titulo = driver.execute_script("return document.title")
texto = driver.execute_script("return document.querySelector('.x').innerText")
token = driver.execute_script("return localStorage.getItem('token')")
# Manipular a página
driver.execute_script("document.querySelector('#btn').click()")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# Com argumentos
driver.execute_script("arguments[0].scrollIntoView()", elemento)
Interação com elementos
click(selector)
Clica em um elemento via seletor CSS.
driver.click("button#enviar")
driver.click("a.link-login")
driver.click(".btn-primary")
fill(selector, value)
Preenche um campo de input. Dispara eventos input e change.
driver.fill("input#email", "usuario@email.com")
driver.fill("textarea#mensagem", "Olá, mundo!")
get_text(selector)
Retorna o texto visível de um elemento.
nome = driver.get_text("h1.titulo")
preco = driver.get_text(".produto-preco")
get_attribute(selector, attr)
Retorna o valor de um atributo de um elemento.
href = driver.get_attribute("a.link", "href")
src = driver.get_attribute("img#foto", "src")
alt = driver.get_attribute("img", "alt")
get_all_texts(selector)
Retorna uma lista com o texto de todos os elementos que correspondem ao seletor.
itens = driver.get_all_texts("li.item")
# ["Item 1", "Item 2", "Item 3"]
get_all_attributes(selector, attr)
Retorna uma lista com valores de atributos de múltiplos elementos.
links = driver.get_all_attributes("a", "href")
# ["https://...", "https://...", ...]
imgs = driver.get_all_attributes("img", "src")
select_option(selector, value)
Seleciona uma opção em um elemento <select>.
driver.select_option("select#pais", "BR")
driver.select_option("select#categoria", "tecnologia")
Scroll
scroll_to(x=0, y=0)
Rola a página para uma posição específica.
driver.scroll_to(0, 500) # Rola 500px para baixo
scroll_to_bottom()
Rola até o final da página.
driver.scroll_to_bottom()
scroll_to_element(selector)
Rola até que o elemento fique visível (centralizado na tela).
driver.scroll_to_element("#resultados")
Espera (waits)
wait_for_element(selector, timeout=10, interval=0.3)
Aguarda até que um elemento apareça no DOM. Retorna True se encontrou, False se timeout.
if driver.wait_for_element("#carregou", timeout=15):
print("Elemento encontrado!")
else:
print("Timeout — elemento não apareceu")
wait_for_text(text, timeout=10, interval=0.5)
Aguarda até que um texto apareça na página.
if driver.wait_for_text("Pedido confirmado", timeout=20):
print("Pedido confirmado!")
wait_for_navigation(timeout=10)
Aguarda a página terminar de carregar (document.readyState === 'complete').
driver.navigate("https://site.com")
driver.wait_for_navigation(timeout=15)
sleep(seconds)
Pausa por N segundos. Mesmo que time.sleep(), mas mais legível no fluxo.
driver.sleep(2) # Aguarda 2 segundos
Screenshot
screenshot(filepath="screenshot.png")
Tira um screenshot da página e salva em arquivo. Retorna o caminho do arquivo.
driver.screenshot("pagina.png")
driver.screenshot(f"/sdcard/screenshots/{timestamp}.png")
screenshot_as_base64()
Retorna o screenshot como string base64 (sem salvar em arquivo).
img_b64 = driver.screenshot_as_base64()
# útil para enviar para API, exibir em HTML, etc.
Storage (localStorage / sessionStorage)
get_local_storage(key=None)
Retorna valor do localStorage. Se key=None, retorna tudo como string JSON.
driver.get_local_storage("token") # valor específico
driver.get_local_storage() # tudo
set_local_storage(key, value)
Define um valor no localStorage.
driver.set_local_storage("theme", "dark")
driver.set_local_storage("token", "abc123")
get_session_storage(key=None)
Retorna valor do sessionStorage. Se key=None, retorna tudo.
driver.get_session_storage("session_id")
driver.get_session_storage()
Utilitários
get_user_agent()
Retorna o User-Agent do navegador.
ua = driver.get_user_agent()
get_viewport_size()
Retorna o tamanho da viewport como dicionário {width, height}.
size = driver.get_viewport_size()
print(f"{size['width']}x{size['height']}")
Exemplos práticos
1. Login + extrair cookies para API
from cdriv import CDriv
import requests
with CDriv() as driver:
driver.new_session()
driver.navigate("https://site.com/login")
# Preenche formulário
driver.fill("input#username", "meu_login")
driver.fill("input#password", "minha_senha")
driver.click("button[type='submit']")
# Aguarda redirecionamento
driver.wait_for_navigation()
# Pega cookies e faz requisição autenticada
session = requests.Session()
session.cookies.update(driver.get_cookies_dict())
dados = session.get("https://site.com/api/dados").json()
print(dados)
2. Scraping de múltiplas páginas
from cdriv import CDriv
with CDriv() as driver:
driver.new_session()
for url in ["https://site.com/pag1", "https://site.com/pag2", "https://site.com/pag3"]:
driver.navigate(url)
driver.wait_for_element(".conteudo", timeout=10)
titulo = driver.get_text("h1")
texto = driver.get_text(".conteudo")
links = driver.get_all_attributes("a", "href")
print(f"=== {titulo} ===")
print(f"Links: {len(links)} encontrados")
3. Navegação com paginação infinita (scroll)
from cdriv import CDriv
import time
with CDriv() as driver:
driver.new_session()
driver.navigate("https://site.com/feed")
for i in range(5): # 5 scrolls
driver.scroll_to_bottom()
time.sleep(2)
posts = driver.get_all_texts("article.titulo")
print(f"Posts carregados: {len(posts)}")
4. Screenshot para depuração
from cdriv import CDriv
with CDriv() as driver:
driver.new_session()
try:
driver.navigate("https://site.com")
driver.wait_for_element("#erro", timeout=5)
print("Elemento de erro encontrado!")
except:
driver.screenshot("erro.png")
print("Screenshot salvo como erro.png")
Solução de problemas
ChromeDriver não inicia
# Verifique se os binários estão instalados
which chromedriver
which chromium-browser
# Verifique a versão
chromedriver --version
chromium-browser --version
Se não estiverem instalados:
pkg install chromium-browser chromedriver
Sessão não cria / navegador não abre
No Termux, é essencial que os pacotes chromium-browser e chromedriver sejam da mesma versão. Atualize ambos:
pkg upgrade chromium-browser chromedriver
Porta ocupada
Se a porta 9515 estiver ocupada, use uma porta diferente:
driver = CDriv(port=9516)
Erro de permissão (sandbox)
O CDriv já inicia com --no-sandbox por padrão, que é necessário no Termux e em containers. Se ainda assim tiver erro, confirme que o chromium foi instalado corretamente.
Project details
Release history Release notifications | RSS feed
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 cdriv-1.0.2.tar.gz.
File metadata
- Download URL: cdriv-1.0.2.tar.gz
- Upload date:
- Size: 7.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.34.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0507a167c93a20a1210e6bcf3cb76aaa894110367a6db9587e994c46e40e18a
|
|
| MD5 |
785448e5c69c200c6213cdad0cb4aefa
|
|
| BLAKE2b-256 |
e5694ee849c0a2b07b7b310108359364a08540da36178a18aa651f1e6d21836b
|
File details
Details for the file cdriv-1.0.2-py3-none-any.whl.
File metadata
- Download URL: cdriv-1.0.2-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.34.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
624a34625346ec96a3cd847870d9ac8100bee1d2fcd41effa551698f1c5d7f5f
|
|
| MD5 |
7cc86e71915d1ef2a0555006e7c4d7c7
|
|
| BLAKE2b-256 |
62620329a6d0facc11ca9ce536a566eb89d1131a1ae23f6e8b01723d0bd7c1a2
|