Padrão Page Object no Playwright com Estrutura Modular

O que é o Padrão Page Object?

O padrão Page Object (PO) é uma abordagem de design utilizada em testes automatizados para representar cada página de uma aplicação web como uma classe independente. Cada classe encapsula os elementos da interface e as ações que podem ser realizadas naquela página, como preencher campos, clicar em botões ou validar conteúdo. Isso promove reutilização de código, melhora a legibilidade e reduz a duplicação, especialmente em projetos com múltiplas páginas e cenários de teste.

Exemplo Prático: Automação da Busca no Google

Vamos implementar esse padrão usando o Playwright para automatizar uma busca no Google. Em vez de escrever todo o código de teste em um único script, vamos dividi-lo em camadas bem definidas.

Estrutura do Projeto


projeto_busca/
│
├── elements/           # Localização dos seletores da página
│   └── google_elements.py
│
├── pages/              # Classes que representam páginas
│   └── google_page.py
│
├── tests/              # Casos de teste
│   └── test_google_search.py
│
├── utils/              # Utilitários compartilhados
│   └── browser_manager.py
│
└── screenshots/        # Armazenamento de imagens capturadas

Camada de Elementos

Nesta camada, armazenamos apenas os seletores CSS ou XPath dos elementos da página. Se o seletor mudar no futuro, basta alterar aqui.

"""
Elementos da página inicial do Google
"""

search_input = "textarea[name='q']"
search_button = "input[name='btnK']"
results_container = "#search"

Camada de Utilitários

Criamos uma classe base para gerenciar o ciclo de vida do navegador e operações comuns, como captura de tela.

"""
Gerenciador de navegador e operações auxiliares
"""
from playwright.sync_api import sync_playwright

class BrowserManager:
    def __init__(self):
        self.playwright = sync_playwright().start()
        self.browser = self.playwright.chromium.launch(headless=False, slow_mo=500)
        self.page = self.browser.new_page()

    def take_screenshot(self, selector, filename):
        try:
            self.page.locator(selector).screenshot(path=f"screenshots/{filename}.png")
        except Exception as e:
            print(f"Erro ao capturar tela: {e}")

    def close(self):
        self.browser.close()
        self.playwright.stop()

Camada de Páginas

Aqui definimos as ações que podem ser executadas na página. A classe herda o gerenciamento do navegador e implementa comportamentos específicos.

"""
Página de busca do Google
"""
from utils.browser_manager import BrowserManager
from elements.google_elements import search_input, search_button, results_container

class GooglePage(BrowserManager):
    def go_to_home(self):
        self.page.goto("https://www.google.com")

    def perform_search(self, term):
        self.page.fill(search_input, term)
        self.page.click(search_button)
        self.page.wait_for_load_state("networkidle")

    def capture_results(self, filename):
        self.take_screenshot(results_container, filename)

Camada de Testes

Os casos de teste são escritos de forma clara e declarativa, sem detalhes técnicos de interação com o DOM.

"""
Caso de teste: Realizar busca no Google
"""
from pages.google_page import GooglePage

def main():
    page = GooglePage()
    try:
        page.go_to_home()
        page.perform_search("Playwright Python")
        page.capture_results("resultado_busca")
    finally:
        page.close()

if __name__ == "__main__":
    main()

Vantagens da Abordagemm

  • Menutenção: Alterações nos seletores ou fluxos são feitas em um único local.
  • Reutilização: Métodos como perform_search podem ser usados em múltiplos testes.
  • Clareza: Os testes ficam focados na lógica de negócio, não na implementação técnica.
  • Escalabilidade: Facilita a adição de novas páginas e funcionalidades.

Tags: Playwright Page Object Python Testes Automatizados Estrutura de Projetos

Publicado em 8-31 22:36