🏛️ 5.4 Page Objects: Arquitetura de Manutenibilidade

Escrever seletores By.id(...) diretamente nos métodos de teste cria um acoplamento perigoso. Se o HTML mudar, você terá que editar dez arquivos diferentes. O padrão Page Objects encapsula a complexidade da UI, expondo apenas a “intenção” para o teste.

🏗️ O Objeto de Página

Uma classe Page Object representa uma página ou componente. Ela conhece os seletores, mas não possui lógica de asserção (Assert).

📄 src/test/java/…/pages/UsuariosPage.java

public class UsuariosPage {
    private final WebDriver driver;
 
    public UsuariosPage(WebDriver driver) {
        this.driver = driver;
    }
 
    public void visita() {
        driver.get("http://localhost:8080/usuarios");
    }
 
    public NovoUsuarioPage novo() {
        driver.findElement(By.linkText("Novo Usuário")).click();
        return new NovoUsuarioPage(driver); // ⛓️ Method Chaining
    }
 
    public boolean existeNaListagem(String nome, String email) {
        return driver.getPageSource().contains(nome) && 
               driver.getPageSource().contains(email);
    }
}

🧪 Teste de Elite (Declarativo)

Com Page Objects, seu teste torna-se uma especificação legível:

@Test
@DisplayName("Deve permitir o cadastro de um novo usuário via interface")
void deveCadastrarUsuarioProfissional() {
    var usuarios = new UsuariosPage(driver);
    usuarios.visita();
 
    usuarios.novo()
        .comNome("Ronaldo Luiz")
        .comEmail("ronaldo@empresa.com")
        .salva();
 
    assertThat(usuarios.existeNaListagem("Ronaldo Luiz", "ronaldo@empresa.com"))
        .isTrue();
}

📊 Benefícios Arquiteturais

graph TD
    A[Teste JUnit] --> B[UsuariosPage]
    A --> C[NovoUsuarioPage]
    B -- Estrutura HTML --> D[Selenium Driver]
    C -- Estrutura HTML --> D
    style B fill:#e3f2fd,stroke:#1e88e5
    style C fill:#fff3e0,stroke:#fb8c00

A Lei da Mudança Única 🛡️

Se um campo de texto mudar de nome no HTML, você altera apenas uma linha no Page Object correspondente. Seus testes permanecem intocados e resilientes. 🏁


Dica de Ouro ⚡

No Selenium 4, prefira o uso do By.cssSelector() ou By.id(). Eles são muito mais performáticos que o By.xpath(), que exige uma varredura completa na árvore do DOM. 🚀


⬅️ Capítulo Anterior | Próximo Capítulo ➡️