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_searchpodem 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.