🏛️ 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()ouBy.id(). Eles são muito mais performáticos que oBy.xpath(), que exige uma varredura completa na árvore do DOM. 🚀