selenium phantomjs tutorial
Neste artigo, Automação Selenium com PhantomJS é explicada com exemplos de código:
PhantomJS é um navegador sem interface que é usado principalmente para automação sem interface gráfica do usuário.
O desempenho e a execução que acontecem neste navegador são mais rápidos e geralmente usados em cenários onde o monitoramento manual não é necessário e em aplicativos que são totalmente automatizados.
PhantomJS é altamente recomendado no caso de execução de script durante a noite, onde o monitoramento humano não é necessário porque a execução é rápida. Ele também fornece opções para uma captura de tela automática para rastreamento manual do processo de execução do script.
O que você aprenderá:
- Utilização do PhantomJS na automação da página da web
- PhantomJS e Selenium para automação da Web (básico)
- PhantomJS e Selenium para automação da Web (avançado)
- Captura de tela e relatório pós-execução
- Recomendação para usar o PhantomJS como navegador de teste
- Leitura recomendada
Utilização do PhantomJS na automação da página da web
Neste artigo, usaremos a ferramenta de automação Selenium para realizar a automação funcional no navegador PhantomJS.
O PhantomJS na verdade instancia um navegador que não tem uma interface GUI, mas tem todo o padrão de um navegador com uma interface GUI como (Firefox, IE, etc.), script DOM padrão, chamadas Ajax, etc.
Objetivo de Usar PhantomJS com Selênio
É muito importante entender o objetivo de usar o PhantomJS com Selenium.
Todos sabemos que o Selenium é uma ferramenta de automação funcional que serve para automatizar várias funcionalidades de aplicações web.
Agora, o objetivo do PhantomJS é um pouco diferente, pois é um navegador sem GUI e seu uso principal é automatizar os casos de teste com quedas na categoria de teste de fumaça / testes de validação e não automação de teste regressiva completa.
Se automatizarmos usando Selenium e PhantomJS, devemos ter cuidado ao escolher os casos de teste. Outra parte importante é o rastreamento do status de execução dos casos de teste, pois não podemos ver fisicamente a execução.
PhantomJS e Selenium para automação da Web (básico)
Assim como qualquer outro navegador com interface GUI (Firefox, IE, Chrome, etc.), para o PhantomJS também, o Selenium possui uma API padrão para suportar a automação.
Vamos ilustrar o mesmo com um código simples:
import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.phantomjs.PhantomJSDriver; import org.openqa.selenium.phantomjs.PhantomJSDriverService; import org.openqa.selenium.remote.DesiredCapabilities; public class PhantomJSTest { public void phantomJS() throws InterruptedException, IOException { DesiredCapabilities caps = new DesiredCapabilities(); caps.setJavascriptEnabled(true); caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, 'D:\chromedriver\phantomjs-2.1.1-windows\bin\phantomjs.exe'); caps.setCapability('takesScreenshot', true); PhantomJSDriver driver = new PhantomJSDriver(caps); String baseUrl = 'http://www.google.com'; driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.get(baseUrl + '/'); File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(scrFile, new File('d:\PhantomJSSample\screenshotAfterLaunchingGoogle.jpeg'),true); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.navigate().to('https://selenium.dev//');//Launch URL File scrFile1 = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(scrFile1, new File('d:\PhantomJSSample\screenshotAfterLaunchingURL.jpeg'),true); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.findElement(By.linkText('Download')).click();//Click on the Link driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); File scrFile2 = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(scrFile2, new File('d:\PhantomJSSample\screenshotAfterClickingDownload.jpeg'),true); Thread.sleep(2000); int header_size =driver.findElements(By.xpath('(//div(@id='mainContent')//h3(1))')).size();//Get the total count of h3 headers in the page for(int i=1; i?=header_size; i++) { String suggestion_name_xp = '('+'//div(@id='mainContent')//h3(1)'+')'+'('+i+')'; String header =driver.findElement(By.xpath(suggestion_name_xp)).getText(); System.out.println(header); //Print the name of headers } Thread.sleep(2000); } public static void main(String() args) throws InterruptedException, IOException { PhantomJSTest pj =new PhantomJSTest(); pj.phantomJS(); } } O snippet de código acima é iniciado Site oficial do Selenium no navegador PhantomJS e executa a operação de clique na guia de download. Em seguida, ele calcula o número de cabeçalhos marcados com h3 do conteúdo principal na página de download e os imprime.
onde você pode assistir anime online de graça
Após a execução de cada operação, é feita uma captura de tela para rastreamento manual.
encontre o comando no Unix com exemplos
Agora vamos integrar a mesma funcionalidade de teste em uma estrutura com rastreamento de log junto com a captura de tela. Vamos também adicionar a correspondência automática junto com a integração do relatório de extensão para fornecer um wrap de automação completo, para que possamos rastrear o resultado da execução mais tarde.
PhantomJS e Selenium para automação da Web (avançado)
Imagem da estrutura do framework

A estrutura é como a imagem sugere e é composta por:
- Os componentes reutilizáveis que podem ser reutilizados por cada um dos scripts de teste
- O Componente de Teste que será criado novo a cada novo caso de teste.
- Os componentes de recursos que são as entradas da estrutura, como (localizadores de elementos da web, URL, etc.)
Aqui, o projeto é construído no Maven junto com a estrutura de teste TestNG. Além disso, usamos o Extent Report. Mas não estou entrando nos detalhes de um projeto Maven ou relatório de extensão, mas apenas mantendo o foco no PhantomJS.
Os detalhes do código para cada um dos componentes são fornecidos abaixo. Esta estrutura se destina a se concentrar na implementação do phantomJS, então a estrutura é projetada com base nisso, mas pode-se definitivamente estender essa estrutura de acordo com as próprias especificações de negócios.
Primeiro, veremos quais dependências precisamos declarar em POM.xml a fim de executar este projeto
'http://maven.apache.org/POM/4.0.0' xmlns:xsi= 'http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation= 'http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd' > 4.0.0 com.phantom.com com.phantomjs.com 0.0.1-SNAPSHOT org.apache.maven.plugins maven-resources-plugin 3.0.2 maven-plugin org.seleniumhq.selenium selenium-java 3.11.0 org.testng testng 6.8 test com.github.detro.ghostdriver phantomjsdriver 1.0.1 javax.mail mail 1.4 com.relevantcodes extentreports 2.40.2 POM.xml
Componentes Reutilizáveis
package ReusableElements; import java.io.File; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.phantomjs.PhantomJSDriver; import org.openqa.selenium.phantomjs.PhantomJSDriverService; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.BeforeClass; import com.relevantcodes.extentreports.ExtentReports; import com.relevantcodes.extentreports.ExtentTest; import com.relevantcodes.extentreports.LogStatus; import ScreenShotLoc.ScreenShotLocations; public class InitiateBrowser { public static WebDriver driver = null; public ExtentReports extent; public ExtentTest logger; String workingDir = ScreenShotLocations.extentReportLoc; PropertyReader pr = new PropertyReader(); @BeforeClass public void InitBrowser() { extent = new ExtentReports(workingDir+'\ExtentReports\PhantomJSExectionResults.html', true); logger=extent.startTest('PhantomJS Implementation'); String BrowserName = 'PhantomJS'; if(BrowserName.equalsIgnoreCase('PhantomJS')) { DesiredCapabilities caps = new DesiredCapabilities(); caps.setJavascriptEnabled(true); caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, ScreenShotLocations.PhantomJSdriverLoc); caps.setCapability('takesScreenshot', true); driver = new PhantomJSDriver(caps); List baseUrls = pr.URLReader(); String baseUrl= baseUrls.get(0); String altUrl= baseUrls.get(1); driver.get(baseUrl); logger.log(LogStatus.PASS, 'Browser Initiated'); driver.navigate().to(altUrl); logger.log(LogStatus.PASS, 'Navigated to target browser'); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } else if(BrowserName.equalsIgnoreCase('Chrome')) { System.setProperty('webdriver.chrome.driver',ScreenShotLocations.ChromedriverLoc); driver = new ChromeDriver(); List baseUrls = pr.URLReader(); String baseUrl= baseUrls.get(0); driver.get(baseUrl); logger.log(LogStatus.PASS, 'Browser Initiated'); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } } } InitiateBrowser.java
Este trecho de código está associado à iniciação do navegador.
Aqui, o nome do navegador está codificado. Mas pode ser externalizado (em propriedades / planilha do excel). Pode-se escolher qual navegador usar, e aqui usamos o PhantomJS.
package ReusableElements; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class PropertyReader { Listvals = new ArrayList(); public List PropReader(){ Properties prop = new Properties(); try { prop.load(PropertyReader.class.getClassLoader().getResourceAsStream('ObjectRepository.properties')); vals.add(prop.getProperty('Download_Tab')); vals.add(prop.getProperty('H3_Headerlist')); } catch (IOException ex) { ex.printStackTrace(); } return vals; } public List URLReader() { Properties prp = new Properties(); try { prp.load(PropertyReader.class.getClassLoader().getResourceAsStream('APPURL.properties')); vals.add(prp.getProperty('APPURL')); vals.add(prp.getProperty('ALTERNATE_APPURL')); }catch (IOException ex) { ex.printStackTrace(); } return vals; } } PropertyReader.java
Este trecho de código está associado ao arquivo de propriedades de leitura que usamos como um localizador de elemento da web e um contêiner de URL.
package ReusableElements; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; public class ReuseableMethods extends InitiateBrowser { public void LinktextClick(String loc) { driver.findElement(By.linkText(loc)).click();//Click on the Link } public String GetText(String loc) { String text= driver.findElement(By.xpath(loc)).getText(); return text; } public void takeScreenShot(String loc) throws IOException { File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(scrFile, new File(loc),true); } } ReuseableMethods.java
Este trecho de código lida com várias funções Selenium que usamos regularmente em nossos scripts, mas separamos essas funções dos scripts de teste para reduzir as linhas de código no framework e aumentar sua usabilidade.
package ReusableElements; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class SendMail { public void SendAutomatedMail() { final String from='XXXX';//change accordingly final String user='XXXX';//change accordingly final String password='XXXX';//change accordingly final String to='XXXX';//change accordingly //Creating the object for the session Properties props = new Properties(); props.put('mail.smtp.auth', 'true'); props.put('mail.smtp.starttls.enable', 'true'); props.put('mail.smtp.host','smtp.gmail.com'); props.put('mail.smtp.port', '587'); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject('TestExecution completed!! Please find the report'); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText('Hi All'); messageBodyPart.setText('please find the attachment'); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); messageBodyPart = new MimeBodyPart(); String filename = 'D:/PhantomJSSample/ExtentReports/PhantomJSExectionResults.html'; DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); message.setContent(multipart); Transport.send(message); System.out.println('message sent successfully...'); } catch (MessagingException e) {e.printStackTrace();} } } SendMail.java
Este trecho de código trata do envio de um e-mail automatizado após a execução do Caso de Teste.
Componentes de Teste
package com.phantomjs.com; import java.util.ArrayList; import java.util.List; import java.io.IOException; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.testng.annotations.Test; import com.relevantcodes.extentreports.LogStatus; import ReusableElements.InitiateBrowser; import ReusableElements.PropertyReader; import ReusableElements.ReuseableMethods; import ReusableElements.SendMail; import ScreenShotLoc.ScreenShotLocations; public class TestScripts extends InitiateBrowser { @Test public void TestScript() throws IOException, InterruptedException { ReuseableMethods rm =new ReuseableMethods(); PropertyReader prop =new PropertyReader(); SendMail sm = new SendMail(); String download,h3_header; rm.takeScreenShot(ScreenShotLocations.screenshotAfterLaunchingURL); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); List propvals = prop.PropReader(); download= propvals.get(0); h3_header= propvals.get(1); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); try{ rm.LinktextClick(download);//Click on the Link logger.log(LogStatus.PASS, 'Validate if download Tab is clickable'); } catch(NoSuchElementException e) { logger.log(LogStatus.FAIL, 'Error while clicking on download Tab'); } driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); rm.takeScreenShot(ScreenShotLocations.screenshotAfterClickingDownload); Thread.sleep(2000); try{ int header_size =driver.findElements(By.xpath(h3_header)).size();//Get the total count of h3 headers in the page List headersh3 = new ArrayList(); for(int i=1; i?header_size; i++) { String suggestion_name_xp = '('+h3_header+')'+'('+i+')'; String header =rm.GetText(suggestion_name_xp); System.out.println(header); //Print the name of headers headersh3.add(header); //storing h3 main content headers to the list } logger.log(LogStatus.PASS, 'All main content h3 headers list printed on console'); int headers_count = headersh3.size(); if(headers_count==4) { logger.log(LogStatus.PASS, 'Validate if the main content h3 header count is as per business specification'); } Thread.sleep(2000); } catch(NoSuchElementException e) { logger.log(LogStatus.FAIL, 'Error while printing h3 headers list on console'); } extent.endTest(logger); extent.flush(); sm.SendAutomatedMail(); } } TestScripts.java
Este é o caso de teste real onde:
- Estamos lançando o URL.
- Estamos clicando na guia de download e verificando se o link de download é clicável ou não.
- Estamos lendo todos os cabeçalhos h3 na guia de download da página.
- Estamos validando a contagem dos cabeçalhos h3.
Componentes Reutilizáveis
package ScreenShotLoc; public interface ScreenShotLocations { String screenshotAfterLaunchingURL= 'd:\PhantomJSSample\screenshotAfterLaunchingURL.jpeg'; String screenshotAfterClickingDownload= 'd:\PhantomJSSample\screenshotAfterClickingDownload.jpeg'; String extentReportLoc= 'd:\PhantomJSSample\'; String ChromedriverLoc= 'D:\chromedriver\chromedriver.exe'; String PhantomJSdriverLoc= 'D:\phantomjs-2.1.1-windows\bin\phantomjs.exe'; } ScreenShotLocations.java
APPURL = https://www.google.com ALTERNATE_APPURL = https://selenium.dev/ APPURL.properties
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1)) ObjectRepository.properties
Essas são as entradas fornecidas a esta estrutura, pois ela foi projetada para ser orientada por dados.
- ScreenShotLoc.java armazena a localização da captura de tela na unidade e a localização do driver do navegador.
- APPURL.properties armazena a URL do aplicativo envolvida no teste.
- ObjectRepository.properties armazena localizadores de elementos da web.
Captura de tela e relatório pós-execução
Agora vamos ver o relatório de pós-execução:

Cenário Positivo: A captura de tela acima é o relatório gerado quando todas as etapas de teste dos casos de teste automatizados são executados com sucesso.
melhor ripper de dvd para windows 10

Cenário Negativo: A captura de tela acima é o relatório gerado quando todas as etapas de teste dos casos de teste automatizados não são executados com sucesso.
Captura de tela do correio automatizado:

Recomendação para usar o PhantomJS como navegador de teste
Abaixo estão algumas recomendações sobre quando usar o PhantomJS como um navegador de teste.
- A execução é rápida com bom desempenho.
- Um bom candidato para automação se o monitoramento manual não for necessário, pois o navegador não é menos GUI.
- Altamente recomendado quando os casos de teste são projetados para realizar testes de fumaça ou casos de teste onde os pontos de validação são apenas levados em consideração.
- Não recomendado para testes funcionais regressivos.
Leitura sugerida = >> Capturas de tela no Selenium
Leitura feliz!!
Leitura recomendada
- Tutorial Cucumber Selenium: Cucumber Java Selenium WebDriver Integration
- 7 fatores que afetam a estimativa de teste do projeto de automação do Selenium - Tutorial do Selenium # 32
- Appium Studio for Eclipse: Automação Appium / Selenium de ponta a ponta a partir do Eclipse
- Introdução ao Selenium WebDriver - Selenium Tutorial # 8
- Tutorial do Selenium Grid: configuração e exemplo de teste entre navegadores
- Tutorial do ChromeDriver Selenium: testes do Selenium Webdriver no Chrome
- Scripts Eficientes do Selenium e Cenários de Solução de Problemas - Tutorial # 27 do Selenium
- Depurando Scripts Selenium com Logs (Tutorial Log4j) - Tutorial Selenium # 26