Selenium Estrutura: baseada em dados, palavras-chave e híbridos
O que é o Selenium Estrutura?
A Selenium estrutura de automação é uma estrutura de código que torna a manutenção do código fácil e eficiente. Sem estruturas, os usuários podem colocar o “código” e os “dados” no mesmo local, o que não é reutilizável nem legível. As estruturas produzem resultados benéficos, como maior reutilização de código, maior portabilidade, custo reduzido de manutenção de script, melhor legibilidade de código, etc.
Tipos de Selenium Quadro
Existem principalmente três tipo de estruturas criado por Selenium WebDriver para automatizar casos de teste manuais
- Estrutura orientada a dados
- Estrutura baseada em palavras-chave
- Estrutura orientada para híbrido
Estrutura baseada em dados em Selenium
Estrutura baseada em dados em Selenium é um método de separar conjuntos de dados do caso de teste. Depois que os conjuntos de dados são separados do caso de teste, eles podem ser facilmente modificados para uma funcionalidade específica sem alterar o código. É usado para buscar casos de teste e suítes de arquivos externos como Excel, .csv, .xml ou algumas tabelas de banco de dados.
Para ler ou escrever um Excel, o Apache fornece uma biblioteca POI muito famosa. Esta biblioteca é capaz o suficiente para ler e escrever ambos XLS e XLSX formato de arquivo do Excel.
Ler XLS arquivos, um HSSF a implementação é fornecida pela biblioteca POI.
Ler XLSX, XSSFGenericName implementação de POI biblioteca será a escolha. Vamos estudar essas implementações em detalhes.
Já aprendemos sobre Data Driven Testing em nosso tutorial anterior
Estrutura baseada em palavras-chave em Selenium
Estrutura baseada em palavras-chave em Selenium é um método usado para acelerar testes automatizados, separando palavras-chave para conjuntos comuns de funções e instruções. Todas as operações e instruções a serem executadas são escritas em algum arquivo externo como uma planilha Excel. Os usuários podem controlar e especificar facilmente as funcionalidades que desejam testar.
Esta é a aparência da estrutura completa
Como você pode ver, é uma estrutura de 5 etapas. Vamos estudá-lo passo a passo em detalhes
Passo 1)
- O script do driver Execute.java chamará ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java possui script POI para ler dados de um Excel
Passo 2)
- ReadGuru99ExcelFile.java lerá dados de TestCase.xlsx
- Esta é a aparência da folha-
- De acordo com as palavras-chave escritas no arquivo Excel, o framework realizará a operação na UI.
- Por exemplo, precisamos clicar no botão ‘Login’. Da mesma forma, nosso Excel terá a palavra-chave ‘Clique’. Agora o AUT pode ter centenas de botões em uma página, para identificar um botão de Login, no Excel inseriremos o Nome do Objeto como loginButton e o tipo de objeto como um nome (veja a linha destacada na imagem acima). O tipo de objeto pode ser XPath, nome CSS ou qualquer outro valor
Passo 3) ReadGuru99ExcelFile.java passará esses dados para o script do driver Execute.java
Passo 4)
- Para todos os nossos elementos web de UI, precisamos criar um repositório de objetos onde colocaremos seu localizador de elemento (como Xpath, nome, caminho CSS, nome de classe etc.)
- Execute.java (nosso script de driver) lerá todo o repositório de objetos e o armazenará em uma variável
- Para ler este repositório de objetos, precisamos de uma classe ReadObject que possua um método getObjectRepository para lê-lo.
OBSERVAÇÃO: Você pode pensar por que precisamos criar um repositório de objetos. A resposta ajuda na manutenção do código. Por exemplo, estamos usando o botão com name = btnlogin em 10 casos de teste diferentes. No futuro, o desenvolvedor decidirá mudar o nome de btnlogin para submit. Você terá que fazer uma alteração em todos os 10 casos de teste. No caso de um repositório de objetos, você fará a alteração apenas uma vez no repositório.
Passo 5)
- O driver passará os dados do Excel e do repositório de objetos para a interface do usuárioOperaaula de ção
- UIOperaA classe tion possui funções para realizar ações correspondentes a palavras-chave como CLICK, SETTEXT etc… mencionadas no excel
- UIOperaaula de ção é uma Java classe que possui a implementação real do código para realizar operações em elementos da web
O projeto completo será parecido com-
Vejamos um exemplo:
Cenário de teste: Estamos executando 2 casos de teste
- Caso de teste 1:
- Vamos para
http://demo.guru99.com/V4/
- Insira o ID do usuário
- Digite a senha
- Clique em Redefinir
- Caso de teste 2:
- Vamos para
http://demo.guru99.com/V4/
- Insira o ID do usuário
- Digite a senha
- Clique em Login
objeto.propriedades
url=http://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
ReadGuru99ExcelFile.java
package excelExportAndFileIO; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadGuru99ExcelFile { public Sheet readExcel(String filePath,String fileName,String sheetName) throws IOException{ //Create a object of File class to open xlsx file File file = new File(filePath+"\\"+fileName); //Create an object of FileInputStream class to read excel file FileInputStream inputStream = new FileInputStream(file); Workbook guru99Workbook = null; //Find the file extension by spliting file name in substing and getting only extension name String fileExtensionName = fileName.substring(fileName.indexOf(".")); //Check condition if the file is xlsx file if(fileExtensionName.equals(".xlsx")){ //If it is xlsx file then create object of XSSFWorkbook class guru99Workbook = new XSSFWorkbook(inputStream); } //Check condition if the file is xls file else if(fileExtensionName.equals(".xls")){ //If it is xls file then create object of XSSFWorkbook class guru99Workbook = new HSSFWorkbook(inputStream); } //Read sheet inside the workbook by its name Sheet guru99Sheet = guru99Workbook.getSheet(sheetName); return guru99Sheet; } }
ReadObject.java
package operation; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReadObject { Properties p = new Properties(); public Properties getObjectRepository() throws IOException{ //Read object repository file InputStream stream = new FileInputStream(new File(System.getProperty("user.dir")+"\\src\\objects\\object.properties")); //load all objects p.load(stream); return p; } }
UIOperação.java
package operation; import java.util.Properties; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class UIOperation { WebDriver driver; public UIOperation(WebDriver driver){ this.driver = driver; } public void perform(Properties p,String operation,String objectName,String objectType,String value) throws Exception{ System.out.println(""); switch (operation.toUpperCase()) { case "CLICK": //Perform click driver.findElement(this.getObject(p,objectName,objectType)).click(); break; case "SETTEXT": //Set text on control driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value); break; case "GOTOURL": //Get url of application driver.get(p.getProperty(value)); break; case "GETTEXT": //Get text of an element driver.findElement(this.getObject(p,objectName,objectType)).getText(); break; default: break; } } /** * Find element BY using object type and value * @param p * @param objectName * @param objectType * @return * @throws Exception */ private By getObject(Properties p,String objectName,String objectType) throws Exception{ //Find by xpath if(objectType.equalsIgnoreCase("XPATH")){ return By.xpath(p.getProperty(objectName)); } //find by class else if(objectType.equalsIgnoreCase("CLASSNAME")){ return By.className(p.getProperty(objectName)); } //find by name else if(objectType.equalsIgnoreCase("NAME")){ return By.name(p.getProperty(objectName)); } //Find by css else if(objectType.equalsIgnoreCase("CSS")){ return By.cssSelector(p.getProperty(objectName)); } //find by link else if(objectType.equalsIgnoreCase("LINK")){ return By.linkText(p.getProperty(objectName)); } //find by partial link else if(objectType.equalsIgnoreCase("PARTIALLINK")){ return By.partialLinkText(p.getProperty(objectName)); }else { throw new Exception("Wrong object type"); } } }
ExecuteTest.java
package testCases; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class ExecuteTest { @Test public void testLogin() throws Exception { // TODO Auto-generated method stub WebDriver webdriver = new FirefoxDriver(); ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); //Create a loop over all the rows of excel file to read it for (int i = 1; i < rowCount+1; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i); //Check if the first cell contain a value, if yes, That means it is the new testcase name if(row.getCell(0).toString().length()==0){ //Print testcase detail on console System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+ row.getCell(3).toString()+"----"+ row.getCell(4).toString()); //Call perform function to perform operation on UI operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString()); } else{ //Print the new testcase name when it started System.out.println("New Testcase->"+row.getCell(0).toString() +" Started"); } } } }
Após a execução, a saída será semelhante a –
Faça o download do Selenium Arquivos de projeto para demonstração neste tutorial
Estrutura orientada para híbrido
Estrutura orientada para híbrido in Selenium é um conceito em que usamos a vantagem tanto da estrutura orientada por palavras-chave quanto da estrutura orientada por dados. É uma estrutura fácil de usar que permite que testadores manuais criem casos de teste apenas observando as palavras-chave, os dados de teste e o repositório de objetos sem codificação na estrutura.
Aqui para palavras-chave, usaremos arquivos Excel para manter casos de teste, e para dados de teste, podemos usar dados, provedor de Teste estrutura.
Aqui em nossa estrutura híbrida, não precisamos alterar nada na estrutura orientada por palavras-chave, aqui só precisamos substituir o arquivo ExecuteTest.java pelo arquivo HybridExecuteTest.java.
Este arquivo HybridExecuteTest possui todo o código para palavras-chave orientadas com o conceito de provedor de dados.
A representação pictórica completa da estrutura híbrida será semelhante a
HybridExecuteTest.java
package testCases; import java.io.IOException; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class HybridExecuteTest { WebDriver webdriver = null; @Test(dataProvider="hybridData") public void testLogin(String testcaseName,String keyword,String objectName,String objectType,String value) throws Exception { // TODO Auto-generated method stub if(testcaseName!=null&&testcaseName.length()!=0){ webdriver=new FirefoxDriver(); } ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Call perform function to perform operation on UI operation.perform(allObjects, keyword, objectName, objectType, value); } @DataProvider(name="hybridData") public Object[][] getDataFromDataprovider() throws IOException{ Object[][] object = null; ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); object = new Object[rowCount][5]; for (int i = 0; i < rowCount; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i+1); //Create a loop to print cell values in a row for (int j = 0; j < row.getLastCellNum(); j++) { //Print excel data in console object[i][j] = row.getCell(j).toString(); } } System.out.println(""); return object; } }
Resumo
- Podemos criar três tipos de estrutura de teste usando Selenium WebDriver.
- A Selenium estrutura de automação que pode ser classificada em estruturas orientadas a dados, orientadas por palavras-chave e híbridas.
- Podemos alcançar uma estrutura baseada em dados usando TestNGprovedor de dados.
- Na estrutura orientada por palavras-chave, as palavras-chave são escritas em alguns arquivos externos, como arquivo Excel, e o código Java chamará esse arquivo e executará casos de teste.
- A estrutura híbrida é uma mistura de estrutura orientada por palavras-chave e orientada por dados.
Faça o download do Selenium Arquivos de projeto para demonstração neste tutorial