O que é o modelo de objeto de página?
O Modelo de Objeto de Página (POM) é um padrão de design, popularmente usado em automação de teste que cria o Repositório de Objetos para elementos de IU da web. A vantagem do modelo é que ele reduz a duplicação de código e melhora a manutenção do teste.
Sob esse modelo, para cada página da web no aplicativo, deve haver uma Classe de página correspondente. Esta classe Page identificará os WebElements dessa página da web e também contém métodos de Página que realizam operações nesses WebElements. O nome desses métodos deve ser dado de acordo com a tarefa que estão realizando, ou seja, se um carregador está aguardando o aparecimento do portal de pagamento, o nome do método POM pode ser waitForPaymentScreenDisplay ().
Neste tutorial, você aprenderá-
- Por que modelo de objeto de página?
- Vantagens do POM
- Como implementar o POM?
- O que é Page Factory?
- Guru99 TestCase com conceito Page Factory
- AjaxElementLocatorFactory
Por que modelo de objeto de página?
Iniciar uma UI Automation no Selenium WebDriver NÃO é uma tarefa difícil. Você só precisa encontrar elementos, realizar operações sobre 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 pequeno script. A manutenção do script parece fácil. Mas com o tempo a suíte de testes crescerá. Conforme você adiciona mais e mais linhas ao seu código, as coisas ficam difíceis.
O principal problema com a manutenção de script é 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 do script é criar um arquivo de classe separado que localizaria os elementos da web, os preencheria ou verificaria. Essa classe pode ser reutilizada em todos os scripts que usam esse elemento. No futuro, se houver uma mudança no elemento web, precisaremos fazer a mudança em apenas 1 arquivo de classe e não em 10 scripts diferentes.
Essa abordagem é chamada de Modelo de Objeto de Página no Selenium. Isso ajuda a tornar o código mais legível, sustentável e reutilizável.
Vantagens do POM
- O padrão de design do objeto de página 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, portanto, podemos usar o mesmo repositório de objetos para uma finalidade diferente com ferramentas diferentes. Por exemplo, podemos integrar o Modelo de Objeto de Página no Selenium com TestNG / JUnit para testes funcionais e, ao mesmo tempo, com JBehave / Cucumber para testes de aceitação.
- O código se torna menos e otimizado por causa dos métodos de página reutilizáveis nas classes POM.
- Os métodos obtêm nomes mais realistas que podem ser facilmente mapeados com a operação que ocorre na IU. ou seja, se após clicarmos no botão chegarmos à página inicial, o nome do método será como 'gotoHomePage ()'.
Como implementar o POM?
POM simples:
É a estrutura básica da estrutura do modelo de objeto da Página em que todos os Elementos da Web do AUT e o método que opera nesses Elementos da Web são mantidos dentro de um arquivo de classe. Uma tarefa como a verificação deve ser separada como parte dos métodos de Teste.
Exemplo Completo
TestCase: Vá para o site de demonstração Guru99.
Etapa 1) Vá para o site de demonstração Guru99 | |
Etapa 2) Na página inicial, verifique se o texto "Banco Guru99" está presente | |
Etapa 3) Faça login no aplicativo | |
Etapa 4) Verifique se a página inicial contém o texto "ID do gerenciador: demo" |
Aqui estamos, estamos lidando com 2 páginas
- Página de login
- Página inicial (mostrada quando você faz login)
Assim, criamos 2 POM em classes Selenium
POM da página de login do Guru99
páginas do pacote;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99Login {Driver WebDriver;Por user99GuruName = By.name ("uid");Por password99Guru = By.name ("senha");Por titleText = By.className ("barone");Por login = By.name ("btnLogin");public Guru99Login (driver WebDriver) {this.driver = driver;}// Definir o nome do usuário na caixa de textopublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Definir a senha na caixa de texto da senhapublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Clique no botão de loginpublic void clickLogin () {driver.findElement (login) .click ();}// Obtenha o título da página de loginpublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Este método POM será exposto em caso de teste para login no aplicativo* @param strUserName* @param strPasword* @Retorna* /public void loginToGuru99 (String strUserName, String strPasword) {// Preencha o nome do usuáriothis.setUserName (strUserName);// Preencha a senhathis.setPassword (strPasword);// Clique no botão Loginthis.clickLogin ();}}
Página inicial do Guru99 POM em selênio
páginas do pacote;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99HomePage {Driver WebDriver;Por homePageUserName = By.xpath ("// tabela // tr [@ class = 'header3']");public Guru99HomePage (driver WebDriver) {this.driver = driver;}// Obtenha o nome de usuário da página inicialpublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}
Guru99 POM simples em caso de teste de selênio
teste de pacote;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";Driver WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Este caso de teste fará login em http://demo.guru99.com/V4/* Verifique o título da página de login como banco guru99* Faça login no aplicativo* Verifique a página inicial usando a mensagem do painel* /@Test (prioridade = 0)public void test_Home_Page_Appear_Correct () {// Criar objeto de página de loginobjLogin = novo Guru99Login (driver);// Verifique o título da página de loginString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("banco guru99"));// faça login no aplicativoobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// vá para a próxima páginaobjHomePage = novo Guru99HomePage (driver);// Verifique a página inicialAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("id de manjedoura: mgr123"));}
O que é Page Factory no Selenium?
O Page Factory no Selenium é um conceito de estrutura de modelo de objeto de página integrado para o Selenium WebDriver, mas é muito otimizado. É usado para inicialização de objetos Página ou para instanciar o próprio objeto Página. Ele também é usado para inicializar os elementos da classe Page sem usar "FindElement / s."
Aqui também, seguimos o conceito de separação de Repositório de Objetos de Página e Métodos de Teste. Além disso, com a ajuda da classe PageFactory no Selenium, usamos as anotações @FindBy para encontrar WebElement. Usamos o método initElements para inicializar os elementos da web
@FindBy pode aceitar tagName, partialLinkText, name, linkText, id, css, className, xpath como atributos.
Vejamos o mesmo exemplo acima usando o Page Factory
Página de login do Guru99 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 {/ *** Todos os WebElements são identificados pela anotação @FindBy* /Driver WebDriver;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (nome = "senha")WebElement password99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")Login do WebElement;public Guru99Login (driver WebDriver) {this.driver = driver;// Este método initElements criará todos os WebElementsPageFactory.initElements (driver, este);}// Definir o nome do usuário na caixa de textopublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Definir a senha na caixa de texto da senhapublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Clique no botão de loginpublic void clickLogin () {login.click ();}// Obtenha o título da página de loginpublic String getLoginTitle () {return titleText.getText ();}/ *** Este método POM será exposto em caso de teste para login no aplicativo* @param strUserName* @param strPasword* @Retorna* /public void loginToGuru99 (String strUserName, String strPasword) {// Preencha o nome do usuáriothis.setUserName (strUserName);// Preencha a senhathis.setPassword (strPasword);// Clique no botão Loginthis.clickLogin ();}}
Página inicial do Guru99 com fábrica de páginas
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 {Driver WebDriver;@FindBy (xpath = "// tabela // tr [@ class = 'header3']")WebElement homePageUserName;public Guru99HomePage (driver WebDriver) {this.driver = driver;// Este método initElements criará todos os WebElementsPageFactory.initElements (driver, este);}// Obtenha o nome de usuário da página inicialpublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}
Guru99 TestCase com conceito Page Factory
teste de pacote;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";Driver WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Este teste vai para http://demo.guru99.com/V4/* Verifique o título da página de login como banco guru99* Faça login no aplicativo* Verifique a página inicial usando a mensagem do painel* /@Test (prioridade = 0)public void test_Home_Page_Appear_Correct () {// Criar objeto de página de loginobjLogin = novo Guru99Login (driver);// Verifique o título da página de loginString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("banco guru99"));// faça login no aplicativoobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// vá para a próxima páginaobjHomePage = novo Guru99HomePage (driver);// Verifique a página inicialAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("id de manjedoura: mgr123"));}}
A Estrutura do Projeto Completa será semelhante ao diagrama:
AjaxElementLocatorFactory
AjaxElementLocatorFactory é um conceito de carregamento lento de PageFactory no Selenium. É usado para localizar os elementos da web apenas quando os elementos são usados em qualquer operação. Ele atribui um tempo limite para WebElements à classe de página de objeto. Uma das principais vantagens de usar o padrão PageFactory no Selenium é a classe AjaxElementLocatorFactory.
Aqui, quando uma operação é realizada em um elemento, a espera por sua visibilidade começa apenas a partir desse momento. Se o elemento não for encontrado no intervalo de tempo determinado, a execução do Caso de Teste lançará a exceção 'NoSuchElementException'.
Resumo
- O Modelo de Objeto de Página no Selenium Websdriver é um padrão de design do Repositório de Objetos.
- O modelo de objeto da página Selenium cria nosso código de teste sustentável e reutilizável.
- O Page Factory é uma maneira otimizada de criar um repositório de objetos no conceito de estrutura do Page Object Model.
- AjaxElementLocatorFactory é um conceito de carregamento lento no Page Factory - padrão de design de objeto de página para identificar WebElements apenas quando são usados em qualquer operação.
Baixe os arquivos do projeto Selenium para a demonstração neste Tutorial