Playwright: Raspagem de Dados e Testes

Mestre a automação do navegador para testes e raspagem

Conteúdo da página

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.

playwright ui

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

  1. Use o Modo Headless em Produção: O navegador headless é mais rápido e usa menos recursos
  2. Implemente Limites de Taxa: Respeite os sites-alvo com atrasos entre as solicitações
  3. Trate Erros de Forma Amigável: Problemas de rede, timeout e mudanças de seletores acontecem
  4. Roteie Agentes de Usuário: Evite a detecção variando as impressões do navegador
  5. Respeite o robots.txt: Verifique e siga as políticas de coleta de dados do site
  6. 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

  1. Use Atributos data-testid: Mais estáveis do que classes CSS que mudam com frequência
  2. Evite Esperas Duras: Use os mecanismos de espera embutidos do Playwright em vez de sleep()
  3. Mantenha os Testes Independentes: Cada teste deve ser capaz de executar isoladamente
  4. Use Fixtures: Compartilhe código de configuração entre testes de forma eficiente
  5. Execute os Testes em Paralelo: Aproveite os threads de trabalhadores do Playwright para velocidade
  6. 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.

Outras Referências