Playwright: Web Scraping e Testes
Domine a automação de navegadores para testes e raspagem de dados
Playwright é um framework moderno e poderoso de automação de navegadores que revoluciona a raspagem de dados da web e os testes de ponta a ponta.
Desenvolvido pela Microsoft, ele oferece uma API unificada para automatizar os navegadores Chromium, Firefox e WebKit com confiabilidade e velocidade sem precedentes.

O que é o Playwright?
O Playwright é um framework de automação de navegadores de código aberto que permite aos desenvolvedores escrever testes de ponta a ponta confiáveis e construir soluções sofisticadas de raspagem de dados. Diferente das ferramentas de automação tradicionais, o Playwright foi construído do zero para lidar com aplicações web modernas que possuem conteúdo dinâmico, aplicações de página única (SPAs) e frameworks JavaScript complexos.
O framework aborda o problema central que assolava as ferramentas de automação anteriores: a instabilidade. O Playwright introduz mecanismos de espera automática que aguardam automaticamente até que os elementos estejam prontos para ação antes de executar operações, eliminando a necessidade de timeouts arbitrários e instruções de espera que tornavam os testes pouco confiáveis.
Principais Características
Suporte Multi-Navegador: O Playwright suporta todos os motores de navegadores principais - 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ções, garantindo que suas aplicações web funcionem consistentemente em todos os lugares.
Espera Automática (Auto-Waiting): Uma das características mais poderosas do Playwright é seu mecanismo de espera automática integrado. Antes de executar qualquer ação, o Playwright aguarda automaticamente até que os elementos estejam visíveis, habilitados, estáveis e não obscurecidos. Isso elimina condições de corrida e torna os testes dramaticamente mais confiáveis em comparação com ferramentas como o Selenium, onde esperas explícitas são frequentemente necessárias.
Interceptação de Rede: O Playwright permite interceptar, modificar e criar mocks para solicitações e respostas de rede. Isso é inestimável para testar casos de borda, simular redes lentas, bloquear recursos desnecessários durante a raspagem ou simular respostas de API sem precisar de um backend.
Emulação de Dispositivos Móveis: Teste aplicações web móveis emulando vários dispositivos móveis com tamanhos de viewport específicos, agentes de usuário e eventos de toque. O Playwright inclui descritores de dispositivo para telefones e tablets populares.
Seletores Poderosos: Além dos seletores CSS e XPath, o Playwright suporta seletores de texto, seletores baseados em função para testes de acessibilidade e até seletores experimentais do React e Vue para frameworks baseados em componentes.
Instalação e Configuração
Configurar o Playwright é direto em diferentes linguagens de programação.
Instalação do Python
Para projetos em Python, o Playwright pode ser instalado via pip e inclui APIs síncronas e assíncronas. Se você procura por um gerenciador de pacotes Python mais rápido e moderno, confira nosso guia sobre uv - Gerenciador de Pacotes, Projetos e Ambientes Python:
# Instalar o pacote Playwright
pip install playwright
# Instalar navegadores (Chromium, Firefox, WebKit)
playwright install
# Para um navegador específico
playwright install chromium
Para uma referência abrangente de sintaxe Python e comandos comumente usados ao trabalhar com o Playwright, consulte nossa Lista de Comandos Python.
Instalação 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'] },
},
],
});
Raspagem de Dados com Playwright
O Playwright brilha na raspagem de dados, especialmente para sites modernos com conteúdo dinâmico com o qual as bibliotecas tradicionais de raspagem lutam.
Exemplo Básico de Raspagem
Aqui está um exemplo abrangente em Python que demonstra conceitos centrais de raspagem:
from playwright.sync_api import sync_playwright
import json
def scrape_website():
with sync_playwright() as p:
# Iniciar navegador
browser = p.chromium.launch(headless=True)
# Criar contexto para isolamento
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
)
# Abrir nova página
page = context.new_page()
# Navegar para URL
page.goto('https://example.com/products')
# Esperar o conteúdo carregar
page.wait_for_selector('.product-item')
# Extrair 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
})
# Limpar
browser.close()
return data
# Executar raspador
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 transparente:
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')
# Rolar para carregar mais conteúdo
for _ in range(5):
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(2000)
# Esperar a rede ficar ociosa
await page.wait_for_load_state('networkidle')
# Extrair todos os itens carregados
items = await page.query_selector_all('.item')
await browser.close()
Convertendo Conteúdo Raspado para Markdown
Após extrair o conteúdo HTML com o Playwright, você frequentemente precisa convertê-lo para um formato mais utilizável. Para guias abrangentes sobre conversão de HTML para Markdown, veja nossos artigos sobre Converter HTML para Markdown com Python: Um Guia Abrangente, que compara 6 bibliotecas Python diferentes, e Converter conteúdo HTML para Markdown usando LLM e Ollama para conversão impulsionada por IA. Se você estiver trabalhando com documentos Word em vez disso, confira nosso guia sobre Converter Documentos Word para Markdown.
Autenticação e Gerenciamento de Sessão
Quando a raspagem requer autenticação, o Playwright facilita 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()
# 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"]')
# Esperar a navegação após o login
page.wait_for_url('**/dashboard')
# Salvar 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()
# Reutilizar 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')
# ... raspar conteúdo protegido
browser.close()
Esta abordagem é particularmente útil ao trabalhar com APIs ou construir servidores MCP para integrações de IA. Para um guia completo sobre implementação de raspagem de dados em integração de ferramentas de IA, veja nosso artigo sobre Construindo Servidores MCP em Python: WebSearch & Scrape.
Testes de Ponta a Ponta
O caso de uso principal do Playwright é escrever testes robustos de ponta a ponta para aplicações web.
Escrevendo Seu Primeiro Teste
Aqui está um exemplo de teste completo em TypeScript:
import { test, expect } from '@playwright/test';
test('user can add item to cart', async ({ page }) => {
// Navegar para a página inicial
await page.goto('https://example-shop.com');
// Procurar por produto
await page.fill('[data-testid="search-input"]', 'laptop');
await page.press('[data-testid="search-input"]', 'Enter');
// Esperar pelos resultados da pesquisa
await expect(page.locator('.product-card')).toBeVisible();
// Clicar no primeiro produto
await page.locator('.product-card').first().click();
// Verificar se a página do produto carregou
await expect(page).toHaveURL(/\/product\/.+/);
// Adicionar ao carrinho
await page.click('[data-testid="add-to-cart"]');
// Verificar se o carrinho atualizou
const cartCount = page.locator('[data-testid="cart-count"]');
await expect(cartCount).toHaveText('1');
});
Modelo de Objeto de Página (Page Object Model)
Para suítes de testes maiores, use o padrão Page Object Model 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 with invalid credentials shows error', 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('Invalid credentials');
});
Funcionalidades Avançadas
Codegen - Geração Automática de Testes
A ferramenta Codegen do Playwright gera testes gravando suas interações com uma página web:
# Abrir 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
À medida que 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 Rastros (Trace Viewer) para Depuração
Quando os testes falham, entender o porquê pode ser desafiador. O Visualizador de Rastros do Playwright fornece uma visão cronológica da execução do seu teste:
// Habilitar rastreamento na configuração
use: {
trace: 'on-first-retry',
}
Após um teste falhar e ser refeito, visualize o rastreamento:
playwright show-trace trace.zip
O Trace Viewer mostra capturas de tela em cada ação, atividade de rede, logs de console e instantâneos do DOM, tornando a depuração direta.
Interceptação e Mocking de Rede
Intercepte e modifique o tráfego de rede para testar casos de borda:
def test_with_mocked_api():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# Mock de resposta de API
def handle_route(route):
if 'api/products' in route.request.url:
route.fulfill(
status=200,
body=json.dumps({
'products': [
{'id': 1, 'name': 'Test Product', 'price': 99.99}
]
})
)
else:
route.continue_()
page.route('**/*', handle_route)
page.goto('https://example.com')
# A página agora usa dados mockados
browser.close()
Testes Móveis
Teste seus designs responsivos em vários dispositivos:
from playwright.sync_api import sync_playwright
def test_mobile():
with sync_playwright() as p:
# Usar 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')
# Interagir como usuário móvel
page.locator('#mobile-menu-button').click()
browser.close()
Melhores Práticas
Para Raspagem de Dados
- Use o Modo Headless em Produção: Navegação headless é mais rápida e usa menos recursos
- Implemente Limitação de Taxa: Respeite os sites de destino com atrasos entre solicitações
- Lide com Erros com Elegância: Problemas de rede, timeouts e mudanças de seletores acontecem
- Rodeie Agentes de Usuário: Evite detecção variando as impressões digitais do navegador
- Respeite robots.txt: Verifique e siga as políticas de raspagem do site
- Use Isolamento de Contexto: Crie contextos de navegador separados para raspagem paralela
Ao converter conteúdo raspado para formato markdown, considere alavancar ferramentas de conversão baseadas em LLM ou bibliotecas Python especializadas em conversão HTML-para-Markdown para uma saída mais limpa.
Para Testes
- Use Atributos Data-testid: Mais estáveis do que classes CSS que mudam frequentemente
- Evite Esperas Duras: Use os mecanismos de espera integrados do Playwright em vez de
sleep() - Mantenha os Testes Independentes: Cada teste deve poder ser executado isoladamente
- Use Fixtures: Compartilhe código de configuração entre testes de forma eficiente
- Execute Testes em Paralelo: Aproveite as threads de trabalho do Playwright para velocidade
- Grave Rastros em Caso de Falha: Habilite a gravação de rastros para depuração mais fácil
Otimização de Desempenho
# Desativar recursos desnecessários
def fast_scraping():
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
# Bloquear imagens e folhas de estilo para acelerar a raspagem
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 Playwright com Alternativas
Playwright vs Selenium
Vantagens do Playwright:
- Espera automática integrada elimina testes instáveis
- Execução mais rápida devido à arquitetura moderna
- Melhor interceptação e mocking de rede
- Ferramentas de depuração superiores (Trace Viewer)
- API mais simples com menos boilerplate
- Múltiplos navegadores com instalação única
Vantagens do Selenium:
- Ecossistema mais maduro com comunidade extensa
- Suporta mais linguagens de programação
- Compatibilidade com navegadores mais ampla, incluindo versões antigas
Playwright vs Puppeteer
Vantagens do Playwright:
- Suporte real multi-navegador (Firefox, WebKit, Chromium)
- Melhor design de API baseado nas lições do Puppeteer
- Ferramentas de depuração mais poderosas
- Backing da Microsoft e desenvolvimento ativo
Vantagens do Puppeteer:
- Pegada ligeiramente menor
- Especialização no Protocolo Chrome DevTools
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 raspagem, confira nosso guia sobre Alternativas ao Beautiful Soup para Go para ferramentas de raspagem comparáveis no ecossistema Go.
Casos de Uso Comuns
Extração de Dados para Aplicações de IA/LLM
O Playwright é excelente para reunir dados de treinamento ou criar capacidades de pesquisa web para modelos de IA. Ao construir servidores MCP (Model Context Protocol), o Playwright pode lidar com o componente de raspagem de dados enquanto os LLMs processam o conteúdo extraído.
Testes Automatizados em CI/CD
Integre testes do Playwright em seu pipeline de integração contínua:
# .github/workflows/playwright.yml
name: Playwright Tests
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: Install dependencies
run: npm ci
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test
- uses: actions/upload-artifact@v3
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
Monitoramento de Sites
Monitore seus sites de produção para tempo de atividade 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://your-site.com', timeout=30000)
# Verificar elementos críticos
assert page.is_visible('.header')
assert page.is_visible('#main-content')
print("✓ Website está saudável")
except Exception as e:
print(f"✗ Problema no website detectado: {e}")
# Enviar alerta
finally:
browser.close()
# Executar 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 do Navegador
Se os navegadores falharem ao baixar:
# Definir local de download personalizado
PLAYWRIGHT_BROWSERS_PATH=/custom/path playwright install
# Limpar cache e reinstalar
playwright uninstall
playwright install
Erros de Timeout
Aumente os timeouts para redes lentas ou páginas complexas:
page.goto('https://slow-site.com', timeout=60000) # 60 segundos
page.wait_for_selector('.element', timeout=30000) # 30 segundos
Seletor Não Encontrado
Use o Inspetor do Playwright para identificar 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 fronteira da tecnologia de automação de navegadores, combinando funcionalidades poderosas com excelente experiência de desenvolvedor. Seja você construindo um pipeline de raspagem de dados, implementando cobertura de testes abrangente ou criando fluxos de trabalho automatizados, o Playwright fornece as ferramentas e a confiabilidade de que você precisa.
Seus mecanismos de espera automática eliminam testes instáveis, o suporte multi-navegador garante que suas aplicações funcionem em todos os lugares e ferramentas de depuração poderosas 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 o tornam uma excelente escolha para qualquer necessidade de automação de navegador.
Para desenvolvedores Python trabalhando em pipelines de dados ou projetos de raspagem, o Playwright integra-se perfeitamente com gerenciadores de pacotes modernos e funciona excelentemente ao lado do pandas, requests e outras ferramentas de ciência de dados. A capacidade de extrair dados estruturados de sites modernos complexos o torna inestimável para aplicações de IA, projetos de pesquisa e inteligência de negócios. Quando combinado com ferramentas de conversão HTML-para-Markdown e processamento de conteúdo adequado, o Playwright torna-se uma solução completa para extrair, transformar e utilizar dados da web em escala.
Links Úteis
- Lista de Comandos Python
- uv - Gerenciador de Pacotes, Projetos e Ambientes Python
- Converter conteúdo HTML para Markdown usando LLM e Ollama
- Converter Documentos Word para Markdown: Um Guia Completo
- Converter HTML para Markdown com Python: Um Guia Abrangente
- Construindo Servidores MCP em Python: WebSearch & Scrape
- Alternativas ao Beautiful Soup para Go