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.

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.
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.
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.
👉 Inscreva-se gratuitamente para a transmissão ao vivo Selenium PROJETO
Vantagens do POM
- 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.
- 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.
- Code torna-se menor e mais otimizado porque reutiliza métodos de página nas classes POM.
- 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.
Exemplo Completo
Caso de teste: Acesse Guru99 Site de demonstração.
Etapa 1) Vá para Guru99 Site de demonstração
Passo 2) Na página inicial, verifique se o texto “GuruO "Banco 99" está presente.
Etapa 3) Faça login no aplicativo
Etapa 4) Verifique se a página inicial contém texto como “Manger Id: demo”
Neste exemplo, estamos lidando com duas páginas:
- Página de login
- 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.
@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:
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'.
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











