selenium phantomjs tutorial
En aquest article, Selenium Automation with PhantomJS s'explica amb exemples de codi:
PhantomJS és un navegador sense cap que s'utilitza principalment per a l'automatització de la GUI.
El rendiment i l'execució d'aquest navegador són més ràpids i s'utilitzen generalment en els escenaris en què no és necessària la supervisió manual i en aquelles aplicacions completament automatitzables.
PhantomJS és molt recomanable en cas d’execució d’un script durant la nit, on no es requereix un control humà, ja que l’execució és ràpida i ràpida. També proporciona opcions per a una captura de pantalla automàtica per al seguiment manual del procés d'execució de seqüències.
Què aprendreu:
- Utilització de PhantomJS en automatització de pàgines web
- PhantomJS i seleni per a automatització web (bàsic)
- PhantomJS i seleni per a automatització web (avançat)
- Captura de pantalla i informe de postexecució
- Recomanació d'utilitzar PhantomJS com a explorador de proves
- Lectura recomanada
Utilització de PhantomJS en automatització de pàgines web
En aquest article, utilitzarem l’eina d’automatització Selenium per realitzar automatitzacions funcionals al navegador PhantomJS.
PhantomJS realitza una instància d’un navegador que no té una interfície GUI, però té tot l’estàndard d’un navegador amb una interfície GUI com (Firefox, IE, etc.), scripts DOM estàndard, trucades Ajax, etc.
Objectiu d'utilitzar PhantomJS amb seleni
És molt important entendre l’objectiu d’utilitzar PhantomJS amb Selenium.
Tots sabem que Selenium és una eina d’automatització funcional que s’utilitza per automatitzar diverses funcionalitats d’aplicacions web.
Ara l’objectiu de PhantomJS és lleugerament diferent, ja que es tracta d’un navegador amb menys interfície gràfica d’usuari i el seu ús principal és automatitzar els casos de proves amb la categoria de proves de fum / proves de validació i no automatització de proves regressives de ple dret.
Si automatitzem l’ús de Selenium i PhantomJS, hem de tenir cura de triar els casos de prova. Una altra part important és el seguiment de l'estat d'execució dels casos de prova, ja que no podem veure l'execució físicament.
PhantomJS i seleni per a automatització web (bàsic)
Igual que qualsevol altre navegador amb interfície GUI (Firefox, IE, Chrome, etc.), per a PhantomJS també, Selenium té una API estàndard per donar suport a l'automatització.
Il·lustrem el mateix amb un codi senzill:
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(); } }
Es llança el fragment de codi anterior Web oficial de seleni al navegador PhantomJS i realitza l'operació de clic a la pestanya de descàrrega. A continuació, calcula el nombre de capçaleres etiquetades h3 del contingut principal de la pàgina de descàrrega i l’imprimeix.
com obriu un fitxer de dades al Windows
Després de l'execució de cada operació, es necessita una captura de pantalla per al seguiment manual.
el millor programari gratuït de manteniment de Windows 10
Ara integrarem la mateixa funcionalitat de prova en un marc amb el seguiment de registres juntament amb la captura de pantalla. Afegim també el correu automàtic juntament amb la integració de l’informe d’extensió per proporcionar-li una combinació completa d’automatització, de manera que puguem fer un seguiment del resultat de l’execució més endavant.
PhantomJS i seleni per a automatització web (avançat)
Imatge de l'estructura del marc
El marc és tal com suggereix la imatge i està format per:
- Els components reutilitzables que poden ser reutilitzats per tots i cada un dels scripts de prova
- El component de prova que es crearà nou amb cada cas de prova nou.
- Els components de recursos que són les entrades del marc com ara (localitzadors d'elements web, URL, etc.)
Aquí el projecte es basa en Maven juntament amb el marc de proves TestNG. A més, hem utilitzat l’Informe d’extensió. Però no estic entrant en els detalls d’un projecte Maven ni d’un informe d’extensió, sinó que només mantinc el focus en PhantomJS.
A continuació es detallen els detalls del codi de cadascun dels components. Aquest marc està destinat a centrar-se en la implementació de phantomJS, de manera que el marc està dissenyat en funció d’això, però definitivament es pot ampliar aquest marc d’acord amb les seves pròpies especificacions empresarials.
En primer lloc, veurem en quines dependències hem de declarar POM.xml per executar aquest projecte
'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
Components reutilitzables
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
Aquest fragment de codi està associat a la iniciació del navegador.
Aquí el nom del navegador està codificat. Però es pot externalitzar (al full de propietats / excel). Es pot triar quin navegador utilitzar, i aquí hem utilitzat 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
Aquest fragment de codi s’associa al fitxer de propietats de lectura que hem utilitzat com a localitzador d’elements web i contenidor d’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
Aquest fragment de codi tracta de diverses funcions de Selenium que fem servir regularment als nostres scripts, però hem separat aquestes funcions dels scripts de prova per reduir les línies de codi del marc i augmentar-ne la usabilitat.
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
Aquest fragment de codi tracta d'enviar un correu automàtic després de l'execució del cas de prova.
Components de la prova
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
Aquest és el cas real de prova en què:
- Estem llançant l'URL.
- Estem fent clic a la pestanya de baixada i comprovant que l’enllaç de baixada es pugui fer clic o no.
- Estem llegint totes les capçaleres h3 a la pestanya de descàrregues de la pàgina.
- Estem validant el recompte de les capçaleres h3.
Components reutilitzables
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
com afegir un element a una matriu java
Aquestes són les aportacions alimentades a aquest marc, ja que el marc està dissenyat per ser basat en dades.
- ScreenShotLoc.java emmagatzema la ubicació de la captura de pantalla a la unitat i la ubicació del controlador del navegador.
- APPURL.properties emmagatzema l’URL de l’aplicació implicada en la prova.
- ObjectRepository.properties emmagatzema els localitzadors d’elements web.
Captura de pantalla i informe de postexecució
Ara veurem l'informe posterior a l'execució:
Escenari positiu: La captura de pantalla anterior és l'informe generat quan tots els passos de prova dels casos de prova automatitzats s'executen correctament.
Escenari negatiu: La captura de pantalla anterior és l'informe generat quan tots els passos de prova dels casos de prova automatitzats no s'executen correctament.
Captura de pantalla de correu automàtic:
Recomanació d'utilitzar PhantomJS com a explorador de proves
A continuació es presenten algunes recomanacions sobre quan utilitzar PhantomJS com a explorador de proves.
- L'execució és ràpida amb un bon rendiment.
- Un bon candidat per a l'automatització si no es requereix un control manual, ja que el navegador no és menys GUI.
- Molt recomanable quan els casos de prova estan dissenyats per realitzar proves de fum o casos de prova on només es tenen en compte els punts de validació.
- No es recomana per a proves funcionals regressives.
Lectura suggerida = >> Captures de pantalla a Selenium
Bona lectura !!
Lectura recomanada
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- 7 factors que afecten l'estimació de proves del projecte d'automatització de Selenium - Tutorial Selenium # 32
- Appium Studio per a Eclipse: automatització completa de Appium / Selenium des d’Eclipse
- Introducció a Selenium WebDriver - Tutorial Selenium # 8
- Tutorial de la xarxa de seleni: configuració i exemple de proves de navegadors creuats
- Tutorial de ChromeDriver Selenium: proves de Selenium Webdriver a Chrome
- Escenaris de scripts i resolució de problemes de Selenium eficients: tutorial núm. 27 de Selenium
- Depuració d’escriptures de Selenium amb registres (Tutorial Log4j) - Tutorial Selenium núm. 26