Playwright: Raspagem de Dados e Testes
Mestre a automação do navegador para testes e raspagem
Playwright é um poderoso framework moderno de automação de navegador que revoluciona a coleta de dados da web e os testes de ponta a ponta.
Desenvolvido pela Microsoft, ele fornece uma API unificada para automatizar os navegadores Chromium, Firefox e WebKit com uma confiabilidade e velocidade inigualáveis.

O que é o Playwright?
O Playwright é um framework de automação de navegador de código aberto que permite aos desenvolvedores escrever testes de ponta a ponta confiáveis e construir soluções avançadas de coleta de dados da web. Ao contrário das ferramentas de automação tradicionais, o Playwright foi construído do zero para lidar com aplicações web modernas com conteúdo dinâmico, aplicações de página única (SPAs) e frameworks complexos de JavaScript.
O framework resolve o problema central que afligiu as ferramentas de automação anteriores: instabilidade. O Playwright introduz mecanismos de espera automática que esperam automaticamente por elementos para serem ações antes de executar operações, eliminando a necessidade de timeouts arbitrários e instruções de sleep que tornavam os testes instáveis.
Funcionalidades Principais
Suporte a Navegadores Cruzados: O Playwright suporta todos os principais motores de navegador - Chromium (incluindo Chrome e Edge), Firefox e WebKit (Safari). Isso significa que você pode escrever seu script de automação uma vez e executá-lo em diferentes navegadores sem modificação, garantindo que suas aplicações web funcionem consistentemente em todos os lugares.
Espera Automática: Uma das funcionalidades mais poderosas do Playwright é seu mecanismo de espera automática embutido. Antes de executar qualquer ação, o Playwright espera automaticamente por elementos para estarem visíveis, habilitados, estáveis e não obscurecidos. Isso elimina condições de corrida e torna os testes drasticamente mais confiáveis em comparação com ferramentas como o Selenium, onde as esperas explícitas são frequentemente necessárias.
Interceptação de Rede: O Playwright permite interceptar, modificar e simular solicitações e respostas de rede. Isso é inestimável para testar casos extremos, simular redes lentas, bloquear recursos desnecessários durante a coleta de dados ou simular respostas de API sem precisar de um backend.
Emulação de Dispositivos Móveis: Teste aplicações web móveis emulando diversos dispositivos móveis com tamanhos específicos de viewport, agentes de usuário e eventos de toque. O Playwright inclui descritores de dispositivos para telefones e tablets populares.
Seletores Poderosos: Além de seletores CSS e XPath, o Playwright suporta seletores de texto, seletores baseados em papéis para testes de acessibilidade e até seletores experimentais para frameworks baseados em componentes como React e Vue.
Instalação e Configuração
Configurar o Playwright é direto em diferentes linguagens de programação.
Instalação em Python
Para projetos Python, o Playwright pode ser instalado via pip e inclui tanto APIs síncronas quanto assíncronas. Se você estiver procurando um gerenciador de pacotes, projetos e ambientes Python mais rápido e moderno, consulte nosso guia sobre uv - Gerenciador de Pacotes, Projetos e Ambientes Python:
# Instale o pacote Playwright
pip install playwright
# Instale navegadores (Chromium, Firefox, WebKit)
playwright install
# Para navegador específico
playwright install chromium
Para uma referência abrangente da sintaxe Python e comandos comumente usados ao trabalhar com o Playwright, consulte nossa Folha de Dicas do Python.
Instalação em JavaScript/TypeScript
Para projetos Node.js, instale o Playwright via npm ou yarn:
# Usando npm
npm init playwright@latest
# Usando yarn
yarn create playwright
# Instalação manual
npm install -D @playwright/test
npx playwright install
O comando npm init playwright fornece uma configuração interativa que configura seu projeto com testes de exemplo, arquivos de configuração e fluxo de trabalho do GitHub Actions.
Configuração Básica
Crie um arquivo playwright.config.ts (TypeScript) ou playwright.config.js (JavaScript):
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
timeout: 30000,
retries: 2,
workers: 4,
use: {
headless: true,
viewport: { width: 1280, height: 720 },
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],
});
Coleta de Dados com o Playwright
O Playwright destaca-se na coleta de dados da web, especialmente para sites modernos com conteúdo dinâmico com os quais as bibliotecas tradicionais de coleta de dados têm dificuldade.
Exemplo Básico de Coleta de Dados
Aqui está um exemplo abrangente em Python demonstrando conceitos fundamentais de coleta de dados:
from playwright.sync_api import sync_playwright
import json
def scrape_website():
with sync_playwright() as p:
# Inicie o navegador
browser = p.chromium.launch(headless=True)
# Crie um contexto para isolamento
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
)
# Abra uma nova página
page = context.new_page()
# Navegue para URL
page.goto('https://example.com/products')
# Espere pelo conteúdo para carregar
page.wait_for_selector('.product-item')
# Extraia dados
products = page.query_selector_all('.product-item')
data = []
for product in products:
title = product.query_selector('h2').inner_text()
price = product.query_selector('.price').inner_text()
url = product.query_selector('a').get_attribute('href')
data.append({
'title': title,
'price': price,
'url': url
})
# Limpeza
browser.close()
return data
# Execute o coletor
results = scrape_website()
print(json.dumps(results, indent=2))
Lidando com Conteúdo Dinâmico
Sites modernos frequentemente carregam conteúdo dinamicamente via JavaScript. O Playwright lida com isso de forma suave:
async def scrape_dynamic_content():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto('https://example.com/infinite-scroll')
# Role para carregar mais conteúdo
for _ in range(5):
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(2000)
# Espere pela rede para ficar ociosa
await page.wait_for_load_state('networkidle')
# Extraia todos os itens carregados
items = await page.query_selector_all('.item')
await browser.close()
Convertendo Conteúdo Coletado para Markdown
Após extrair conteúdo HTML com o Playwright, você frequentemente precisa convertê-lo para um formato mais utilizável. Para guias abrangentes sobre a conversão de HTML para Markdown, consulte nossos artigos sobre Conversão de HTML para Markdown com Python: Um Guia Abrangente que compara 6 diferentes bibliotecas Python, e Converta conteúdo HTML para Markdown usando LLM e Ollama para conversão com IA. Se você estiver trabalhando com documentos Word em vez disso, consulte nosso guia sobre Conversão de Documentos Word para Markdown.
Autenticação e Gerenciamento de Sessão
Quando a coleta de dados requer autenticação, o Playwright torna fácil salvar e reutilizar o estado do navegador:
def login_and_save_session():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
# Faça login
page.goto('https://example.com/login')
page.fill('input[name="username"]', 'your_username')
page.fill('input[name="password"]', 'your_password')
page.click('button[type="submit"]')
# Espere pela navegação após o login
page.wait_for_url('**/dashboard')
# Salve o estado autenticado
context.storage_state(path='auth_state.json')
browser.close()
def scrape_with_saved_session():
with sync_playwright() as p:
browser = p.chromium.launch()
# Reutilize o estado de autenticação salvo
context = browser.new_context(storage_state='auth_state.json')
page = context.new_page()
# Já autenticado!
page.goto('https://example.com/protected-data')
# ... colete conteúdo protegido
browser.close()
Este abordagem é particularmente útil ao trabalhar com APIs ou ao construir servidores MCP para integrações com IA. Para um guia completo sobre a implementação de coleta de dados na integração com ferramentas de IA, veja nosso artigo sobre Construindo Servidores MCP em Python: WebSearch & Scrape.
Testes de Ponta a Ponta
O uso principal do Playwright é escrever testes robustos de ponta a ponta para aplicações web.
Escrevendo Seu Primeiro Teste
Aqui está um exemplo completo de teste em TypeScript:
import { test, expect } from '@playwright/test';
test('usuário pode adicionar item ao carrinho', async ({ page }) => {
// Navegue para a página inicial
await page.goto('https://example-shop.com');
// Pesquise por produto
await page.fill('[data-testid="search-input"]', 'laptop');
await page.press('[data-testid="search-input"]', 'Enter');
// Espere pelos resultados da pesquisa
await expect(page.locator('.product-card')).toBeVisible();
// Clique no primeiro produto
await page.locator('.product-card').first().click();
// Verifique se a página do produto foi carregada
await expect(page).toHaveURL(/\/product\/.+/);
// Adicione ao carrinho
await page.click('[data-testid="add-to-cart"]');
// Verifique se o carrinho foi atualizado
const cartCount = page.locator('[data-testid="cart-count"]');
await expect(cartCount).toHaveText('1');
});
Modelo de Página
Para suites de testes maiores, use o padrão Modelo de Página para melhorar a manutenibilidade:
// pages/LoginPage.ts
export class LoginPage {
constructor(private page: Page) {}
async navigate() {
await this.page.goto('/login');
}
async login(username: string, password: string) {
await this.page.fill('[name="username"]', username);
await this.page.fill('[name="password"]', password);
await this.page.click('button[type="submit"]');
}
async getErrorMessage() {
return await this.page.locator('.error-message').textContent();
}
}
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
test('login com credenciais inválidas mostra erro', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.navigate();
await loginPage.login('invalid@email.com', 'wrongpass');
const error = await loginPage.getErrorMessage();
expect(error).toContain('Credenciais inválidas');
});
Funcionalidades Avançadas
Codegen - Geração Automática de Testes
A ferramenta Codegen do Playwright gera testes registrando suas interações com uma página da web:
# Abra o Codegen
playwright codegen example.com
# Com navegador específico
playwright codegen --browser firefox example.com
# Com estado de autenticação salvo
playwright codegen --load-storage=auth.json example.com
Enquanto você interage com a página, o Codegen gera código em tempo real. Isso é incrivelmente útil para prototipar testes rapidamente ou aprender a sintaxe de seletores do Playwright.
Visualizador de Rastreamento para Depuração
Quando os testes falham, entender o porquê pode ser desafiador. O Visualizador de Rastreamento do Playwright fornece uma visão de cronograma da execução do seu teste:
// Ative o rastreamento na configuração
use: {
trace: 'on-first-retry',
}
Após um teste falhar e reintentar, visualize o rastreamento:
playwright show-trace trace.zip
O Visualizador de Rastreamento mostra capturas de tela em cada ação, atividade de rede, logs do console e capturas de DOM, tornando a depuração direta.
Interceptação e Simulação de Rede
Intercepte e modifique o tráfego de rede para testar casos extremos:
def test_with_mocked_api():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# Simule resposta da API
def handle_route(route):
if 'api/products' in route.request.url:
route.fulfill(
status=200,
body=json.dumps({
'products': [
{'id': 1, 'name': 'Produto de Teste', 'price': 99.99}
]
})
)
else:
route.continue_()
page.route('**/*', handle_route)
page.goto('https://example.com')
# A página agora usa dados simulados
browser.close()
Teste em Dispositivos Móveis
Teste seus designs responsivos em diversos dispositivos:
from playwright.sync_api import sync_playwright
def test_mobile():
with sync_playwright() as p:
# Use o descritor de dispositivo
iphone_13 = p.devices['iPhone 13']
browser = p.webkit.launch()
context = browser.new_context(**iphone_13)
page = context.new_page()
page.goto('https://example.com')
# Interaja como um usuário móvel
page.locator('#mobile-menu-button').click()
browser.close()
Boas Práticas
Para Coleta de Dados
- Use o Modo Headless em Produção: O navegador headless é mais rápido e usa menos recursos
- Implemente Limites de Taxa: Respeite os sites-alvo com atrasos entre as solicitações
- Trate Erros de Forma Amigável: Problemas de rede, timeout e mudanças de seletores acontecem
- Roteie Agentes de Usuário: Evite a detecção variando as impressões do navegador
- Respeite o robots.txt: Verifique e siga as políticas de coleta de dados do site
- Use Isolamento de Contexto: Crie contextos de navegador separados para coleta paralela
Ao converter conteúdo coletado para formato markdown, considere aproveitar ferramentas baseadas em LLM ou bibliotecas Python especializadas na conversão de HTML para Markdown para saída mais limpa.
Para Testes
- Use Atributos data-testid: Mais estáveis do que classes CSS que mudam com frequência
- Evite Esperas Duras: Use os mecanismos de espera embutidos do Playwright em vez de
sleep() - Mantenha os Testes Independentes: Cada teste deve ser capaz de executar isoladamente
- Use Fixtures: Compartilhe código de configuração entre testes de forma eficiente
- Execute os Testes em Paralelo: Aproveite os threads de trabalhadores do Playwright para velocidade
- Registre Rastreamentos em Falhas: Ative o registro de rastreamento para depuração mais fácil
Otimização de Desempenho
# Desative recursos desnecessários
def fast_scraping():
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
# Bloqueie imagens e folhas de estilo para acelerar a coleta de dados
async def block_resources(route):
if route.request.resource_type in ['image', 'stylesheet', 'font']:
await route.abort()
else:
await route.continue_()
page.route('**/*', block_resources)
page.goto('https://example.com')
browser.close()
Comparando o Playwright com Alternativas
Playwright vs Selenium
Vantagens do Playwright:
- Espera automática embutida elimina testes instáveis
- Execução mais rápida devido à arquitetura moderna
- Melhor interceptação e simulação de rede
- Ferramentas de depuração superiores (Visualizador de Rastreamento)
- API mais simples com menos boilerplate
- Suporte a múltiplos navegadores com uma única instalação
Vantagens do Selenium:
- Ecossistema mais maduro com comunidade extensa
- Suporte a mais linguagens de programação
- Maior compatibilidade com navegadores, incluindo versões antigas
Playwright vs Puppeteer
Vantagens do Playwright:
- Suporte verdadeiro a navegadores cruzados (Firefox, WebKit, Chromium)
- Melhor design de API baseado nas lições de Puppeteer
- Ferramentas de depuração mais poderosas
- Apoio da Microsoft e desenvolvimento ativo
Vantagens do Puppeteer:
- Peso ligeiramente menor
- Expertise no Protocolo de Ferramentas de Desenvolvedor do Chrome
Para a maioria dos novos projetos, o Playwright é a escolha recomendada devido à sua arquitetura moderna e conjunto abrangente de funcionalidades. Se você estiver trabalhando com Go em vez de Python ou JavaScript e precisar de capacidades de coleta de dados, consulte nosso guia sobre Alternativas ao Beautiful Soup para Go para ferramentas de coleta de dados comparáveis no ecossistema Go.
Casos de Uso Comuns
Extração de Dados para Aplicações de IA/LLM
O Playwright é excelente para coletar dados de treinamento ou criar capacidades de busca na web para modelos de IA. Ao construir servidores MCP (Model Context Protocol), o Playwright pode lidar com a componente de coleta de dados da web enquanto os LLMs processam o conteúdo extraído.
Testes Automatizados em CI/CD
Integre testes do Playwright em sua pipeline de integração contínua:
# .github/workflows/playwright.yml
name: Testes do Playwright
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- name: Instale dependências
run: npm ci
- name: Instale Navegadores do Playwright
run: npx playwright install --with-deps
- name: Execute testes do Playwright
run: npx playwright test
- uses: actions/upload-artifact@v3
if: always()
with:
name: relatório do playwright
path: relatório do playwright/
retention-days: 30
Monitoramento de Sites
Monitore seus sites de produção para disponibilidade e funcionalidade:
import schedule
import time
def monitor_website():
with sync_playwright() as p:
try:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://seu-site.com', timeout=30000)
# Verifique elementos críticos
assert page.is_visible('.header')
assert page.is_visible('#main-content')
print("✓ O site está saudável")
except Exception as e:
print(f"✗ Problema detectado no site: {e}")
# Envie um alerta
finally:
browser.close()
# Execute a cada 5 minutos
schedule.every(5).minutes.do(monitor_website)
while True:
schedule.run_pending()
time.sleep(1)
Solução de Problemas Comuns
Problemas de Instalação de Navegadores
Se os navegadores falharem ao baixar:
# Defina um local de download personalizado
PLAYWRIGHT_BROWSERS_PATH=/caminho/pessoal playwright install
# Limpe o cache e reinstale
playwright uninstall
playwright install
Erros de Timeout
Aumente os tempos limite para redes lentas ou páginas complexas:
page.goto('https://site-lento.com', timeout=60000) # 60 segundos
page.wait_for_selector('.elemento', timeout=30000) # 30 segundos
Seletor Não Encontrado
Use o Inspecteur do Playwright para identificar os seletores corretos:
PWDEBUG=1 pytest test_file.py
Isso abre o inspetor onde você pode passar o mouse sobre elementos para ver seus seletores.
Conclusão
O Playwright representa a ponta do iceberg da tecnologia de automação de navegador, combinando funcionalidades poderosas com excelente experiência do desenvolvedor. Seja você construindo uma pipeline de coleta de dados, implementando uma cobertura de testes abrangente ou criando fluxos de trabalho automatizados, o Playwright fornece as ferramentas e confiabilidade que você precisa.
Seus mecanismos de espera automática eliminam testes instáveis, o suporte a navegadores cruzados garante que suas aplicações funcionem em todos os lugares, e as poderosas ferramentas de depuração tornam a solução de problemas direta. À medida que as aplicações web continuam a crescer em complexidade, a arquitetura moderna do Playwright e seu desenvolvimento ativo tornam-no uma excelente escolha para quaisquer necessidades de automação de navegador.
Para desenvolvedores Python trabalhando em pipelines de dados ou projetos de coleta de dados, o Playwright se integra de forma sem problemas com gerenciadores de pacotes modernos e funciona excelente ao lado de pandas, requests e outras ferramentas de ciência de dados. A capacidade de extrair dados estruturados de sites modernos complexos torna-o inestimável para aplicações de IA, projetos de pesquisa e inteligência de negócios. Quando combinado com ferramentas de conversão de HTML para Markdown e processamento adequado de conteúdo, o Playwright se torna uma solução completa para extrair, transformar e utilizar dados da web em escala.
Links Úteis
- Folha de Dicas do Python
- uv - Gerenciador de Pacotes, Projetos e Ambientes Python
- Converta conteúdo HTML para Markdown usando LLM e Ollama
- Conversão de Documentos Word para Markdown: Um Guia Completo
- Conversão de HTML para Markdown com Python: Um Guia Abrangente
- Construindo Servidores MCP em Python: WebSearch & Scrape
- Alternativas ao Beautiful Soup para Go