Modelo de Objeto de Página e Fábrica em Selenium

⚡ Resumo Inteligente

Modelo de Objeto de Página e Fábrica de Páginas em Selenium Define um padrão de projeto estruturado para a construção de frameworks de automação de testes robustos e de fácil manutenção. Ele enfatiza a criação de classes específicas para cada página que encapsulam WebElements e seus comportamentos, reduzindo assim a duplicação e melhorando a legibilidade e a escalabilidade. Selenium scripts de teste.

  • Conceito Central: Cada página da aplicação corresponde a uma classe de página dedicada que contém tanto os elementos da Web quanto as ações realizadas sobre eles, permitindo uma clara separação entre a estrutura da interface do usuário e a lógica de teste.
  • Foco de implementação: O POM promove o gerenciamento centralizado e reutilizável de elementos — as modificações nos elementos da página exigem atualizações em apenas uma classe, em vez de vários scripts.
  • Vantagem do design: O modelo garante repositórios de objetos mais limpos, modulares e independentes de ferramentas, que podem ser integrados a frameworks como... TestNG, JUnit, Cucumberou JBehave.
  • Convenção de nomes: Os métodos dentro das classes de página devem espelhar as ações reais da interface do usuário (por exemplo, gotoHomePage()), reforçando a clareza semântica nos fluxos de trabalho de automação.
  • Estrutura aprimorada: O Page Factory refina o POM usando @FindBy anotações e PageFactory.initElements() para inicialização automática de WebElements, eliminando tarefas repetitivas. findElement chamadas.
  • Otimização de performance: AjaxElementLocatorFactory Introduz o carregamento lento (lazy loading) — os elementos são localizados somente quando acessados ​​— melhorando a eficiência de execução e lidando de forma elegante com o comportamento dinâmico da página.
  • Resultado: A abordagem unificada resulta em uma arquitetura de automação de testes sustentável, legível e escalável, alinhada com as práticas modernas. Selenium práticas.

Modelo de objeto de página

O que é o Page Object Model? Quais são seus principais componentes?

Modelo de objeto de página (POM) É um padrão de projeto, popularmente usado em automação de testes, que cria um repositório de objetos para elementos da interface do usuário da web. A vantagem desse modelo é que ele reduz a duplicação de código e melhora a manutenção dos testes.

Nesse modelo, para cada página web da aplicação, deve haver uma classe `Page` correspondente. Essa classe `Page` identificará os elementos web da página e também conterá métodos que realizam operações nesses elementos. Os nomes desses métodos devem ser definidos de acordo com a tarefa que executam; por exemplo, se um indicador de carregamento estiver aguardando a exibição da tela de pagamento, o nome do método no POM pode ser `waitForPaymentScreenDisplay()`.

Componentes-chave do modelo de objeto de página

  • Classes de página: Represente cada página da web como uma classe separada.
  • Localizadores: Identifique elementos da web usando IDs, XPath ou seletores CSS.
  • Métodos: Contêm ações ou operações realizadas nos elementos .page.
  • Reutilização: PromoReutilização de código de teste e manutenção mais fácil em todos os testes.
  • Separação de preocupações: Mantém a estrutura da página independente da lógica de teste para melhor organização.

Modelo de objeto de página

Por que modelo de objeto de página?

Iniciando uma automação de interface do usuário em Selenium webdriver Não é uma tarefa difícil. Você só precisa encontrar os elementos e realizar operações com eles.

Considere este script simples para fazer login em um site.

Modelo de objeto de página

Como você pode observar, tudo o que estamos fazendo é encontrar elementos e preencher valores para esses elementos.

Este é um script demorado e propenso a erros. Parece fácil inicialmente, mas à medida que o conjunto de testes se expande, gerenciar as alterações nos elementos se torna difícil. Com o tempo, o conjunto de testes crescerá. Conforme você adiciona mais e mais linhas ao seu código, as coisas ficam complicadas.

O principal problema com a manutenção de scripts é que se 10 scripts diferentes estiverem usando o mesmo elemento de página, com qualquer alteração nesse elemento, você precisará alterar todos os 10 scripts. Isso consome tempo e está sujeito a erros.

Uma abordagem melhor para a manutenção de scripts é criar um arquivo de classe separado que encontre os elementos da web, os preencha ou os verifique. Essa classe pode então ser reutilizada em vários scripts de teste que interagem com o mesmo elemento. No futuro, se houver uma alteração no elemento da web, precisaremos fazer a alteração em apenas um arquivo de classe e não em 10 scripts diferentes.

Esta abordagem é chamada de Modelo de Objeto de Página em SeleniumIsso ajuda a tornar o código mais legível, fácil de manter e reutilizável.

 Modelo de objeto de página

👉 Inscreva-se gratuitamente para a transmissão ao vivo Selenium PROJETO

Vantagens do POM

  1. O Page Object Design Pattern diz que as operações e fluxos na IU devem ser separados da verificação. Este conceito torna nosso código mais limpo e fácil de entender.
  2. O segundo benefício é que o repositório de objetos é independente dos casos de teste, então podemos usar o mesmo repositório de objetos para diferentes finalidades com diferentes ferramentas. Por exemplo, podemos integrar o Page Object Model em Selenium com as TestNG/JUnit para funcional Testes e ao mesmo tempo com JBehave/Cucumber para testes de aceitação.
  3. Code torna-se menor e mais otimizado porque reutiliza métodos de página nas classes POM.
  4. Os métodos recebem nomes mais realistas que podem ser facilmente mapeados para a operação que ocorre na interface do usuário. Por exemplo, se depois de clicar no botão formos para a página inicial, o nome do método será algo como 'gotoHomePage()'.

Como implementar POM em Selenium?

PLog simples na estrutura fundamental de um framework Page Object Model, onde os elementos whereManagereIDElements do AUT e os métodos que operam nesses elementos da Web são mantidos dentro de um arquivo de log. Uma tarefa como a verificação deve ser separada como parte dos métodos de teste.

Implementar POM

Exemplo Completo

Caso de teste: Acesse Guru99 Site de demonstração.

Etapa 1) Vá para Guru99 Site de demonstração

Implementar POM

Passo 2) Na página inicial, verifique se o texto “GuruO "Banco 99" está presente.

Implementar POM

Etapa 3) Faça login no aplicativo

Implementar POM

Etapa 4) Verifique se a página inicial contém texto como “Manger Id: demo”

Implementar POM

Neste exemplo, estamos lidando com duas páginas:

  1. Página de login
  2. Página inicial (mostrada assim que você faz login)

Assim, criamos 2 POM em Selenium aulas

Guru99 Página de login POM

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
    WebDriver driver;
    By user99GuruName = By.name("uid");
    By password99Guru = By.name("password");
    By titleText =By.className("barone");
    By login = By.name("btnLogin");
    public Guru99Login(WebDriver driver){
        this.driver = driver;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 Página Inicial POM em Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 POM simples em Selenium Caso de teste

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

Em que consiste o Page Factory Selenium?

Fábrica de páginas em Selenium é um conceito de estrutura embutido do Page Object Model para Selenium WebDriver que melhora a manutenção reduzindo buscas repetitivas de elementos por meio de anotações, e não pela velocidade de execução. É usado para inicializar objetos Page ou para instanciar o próprio objeto Page. Também é usado para inicializar elementos da classe Page sem usar “FindElement”.

Aqui também seguimos o conceito de separação entre repositório de objetos de página e métodos de teste. Além disso, com a ajuda da classe PageFactory em Selenium, usamos anotações @FindBy Para encontrar o WebElement, usamos o método initElements para inicializar os elementos da web.

Página de fábrica em Selenium

@FindBy pode aceitar tagName, parcialLinkText, nome, linkText, id, css, className, xpath como atributos.

Vejamos o mesmo exemplo acima usando Page Factory

Guru99 Página de login com Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

Guru99 Página Inicial com Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
    WebDriver driver;
    @FindBy(xpath="//table//tr[@class='heading3']")
    WebElement homePageUserName;    
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Guru99 casos de teste com o conceito de Page Factory

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

A estrutura completa do projeto será semelhante ao diagrama:

Fábrica de páginas em Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory é um conceito de carregamento lento do PageFactory em SeleniumÉ utilizado para encontrar os elementos da web somente quando esses elementos são usados ​​em alguma operação. Ele atribui um tempo limite para WebElements à classe de objeto da página. Uma das principais vantagens de usar o padrão PageFactory é... Selenium é a classe AjaxElementLocatorFactory.

Aqui, quando uma operação é realizada em um elemento, a espera por sua visibilidade começa somente a partir desse momento. Se o elemento não for encontrado no intervalo de tempo especificado, Caso de teste a execução lançará a exceção 'NoSuchElementException'.

Fábrica de localizadores AjaxElement

Por exemplo:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

Faça o download do Selenium Arquivos de projeto para demonstração neste tutorial

Perguntas Frequentes

O Page Object Model é um padrão de projeto que abstraitracO TypeScript divide os elementos da página web em classes separadas. Isso simplifica a automação ao separar as interações da interface do usuário da lógica de teste, promovendo clareza, escalabilidade e redução da duplicação de código.

In SeleniumO POM representa cada página web como uma classe dedicada que contém localizadores e ações. Ele encapsula elementos da interface do usuário, permitindo que os scripts de teste permaneçam independentes de alterações na estrutura subjacente da página.

POM não é um framework independente, mas sim um padrão de projeto. Ele pode ser integrado a qualquer framework de automação para estruturar testes de forma eficiente, garantindo melhor organização, reutilização e facilidade de manutenção.

POM é um princípio de design onde cada página web é modelada como uma classe com localizadores e métodos definidos. Ele desacopla a lógica de teste dos elementos da interface do usuário, melhorando a legibilidade, a escalabilidade e a manutenção a longo prazo.

POM define a estrutura de design para abs de páginatracção, enquanto o Page Factory fornece anotações e métodos (@FindBy) para inicializar elementos da web de forma eficiente. O Page Factory é uma implementação aprimorada do POM.

O POM centraliza os localizadores de elementos e as ações da página em classes dedicadas. Qualquer modificação na interface do usuário requer atualizações em apenas um local, minimizando retrabalho, melhorando a reutilização de código e acelerando a manutenção dos testes.

Sim. Os geradores de testes baseados em IA podem criar classes POM automaticamente, analisando hierarquias de interface do usuário, mantendo a separação lógica de responsabilidades e acelerando a criação de testes de ponta a ponta.

O POM promove componentes de teste modulares e reutilizáveis, permitindo a integração com ferramentas de manutenção de testes baseadas em IA que atualizam automaticamente os localizadores, reduzindo a fragilidade dos scripts e a sobrecarga de manutenção.

Resuma esta postagem com: