selenium phantomjs tutorial
În acest articol, automatizarea seleniului cu PhantomJS este explicată cu exemple de cod:
PhantomJS este un browser fără cap care este utilizat în principal pentru automatizarea GUI mai puțin.
Performanța și executarea acestui browser sunt mai rapide și sunt utilizate în general în scenariile în care monitorizarea manuală nu este necesară și în acele aplicații care sunt complet automatizabile.
PhantomJS este foarte recomandat în cazul executării peste noapte a scriptului, unde monitorizarea umană nu este necesară, deoarece execuția este rapidă. De asemenea, oferă opțiuni pentru o captură de ecran automată pentru urmărirea manuală a procesului de execuție a scriptului.
Ce veți învăța:
- Utilizarea PhantomJS pe automatizarea paginilor web
- PhantomJS și seleniu pentru automatizarea web (de bază)
- PhantomJS și seleniu pentru automatizarea web (avansat)
- Captură de ecran și raportare post-execuție
- Recomandare de a utiliza PhantomJS ca browser de testare
- Lectură recomandată
Utilizarea PhantomJS pe automatizarea paginilor web
În acest articol, vom folosi instrumentul de automatizare Selenium pentru a efectua automatizarea funcțională pe browserul PhantomJS.
PhantomJS instanțiază de fapt un browser care nu are o interfață GUI, dar are toate standardele unui browser cu o interfață GUI precum (Firefox, IE etc.), scripturi standard DOM, apeluri Ajax etc.
Obiectivul utilizării PhantomJS cu seleniu
Este foarte important să înțelegem obiectivul utilizării PhantomJS cu Selenium.
Știm cu toții că Selenium este un instrument funcțional de automatizare care este utilizat pentru automatizarea diferitelor funcționalități ale aplicațiilor web.
Acum, obiectivul PhantomJS este ușor diferit, deoarece este un browser mai puțin GUI, iar utilizarea sa principală este de a automatiza cazurile de testare care se încadrează în categoria testelor de testare a fumului / testelor de validare și nu automatizarea testelor regresive.
Dacă automatizăm folosind Selenium și PhantomJS, trebuie să fim atenți la alegerea cazurilor de testare. O altă parte importantă este urmărirea stării de execuție a cazurilor de test, deoarece nu putem vedea fizic execuția.
PhantomJS și seleniu pentru automatizarea web (de bază)
La fel ca orice alte browsere cu interfață GUI (Firefox, IE, Chrome etc.), și pentru PhantomJS, Selenium are un API standard pentru a sprijini automatizarea.
Să ilustrăm același lucru cu un cod simplu:
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(); } }
Se lansează fragmentul de cod de mai sus Site-ul oficial al seleniului pe browserul PhantomJS și efectuează operația de clic pe fila de descărcare. Apoi calculează numărul de antete etichetate h3 ale conținutului principal din pagina de descărcare și îl imprimă.
întrebări de bază pentru interviu html și css
După executarea fiecărei operațiuni, este nevoie de o captură de ecran pentru urmărirea manuală.
declanșarea portului vs. redirecționarea portului
Acum vom integra aceeași funcționalitate de testare într-un cadru cu urmărirea jurnalului împreună cu captura de ecran. Să adăugăm, de asemenea, corespondență automată, împreună cu integrarea raportului de extindere, pentru a-i oferi o completare completă a automatizării, astfel încât să putem urmări rezultatul executării mai târziu.
PhantomJS și seleniu pentru automatizarea web (avansat)
Imaginea structurii cadru
Cadrul este așa cum sugerează imaginea și este alcătuit din:
- Componentele reutilizabile care pot fi reutilizate de fiecare script de testare
- Componenta de testare care va fi creată nouă cu fiecare caz de testare nou.
- Componentele resurselor care sunt intrările cadrului precum (localizatoare de elemente web, URL etc.)
Aici proiectul este construit pe Maven împreună cu cadrul de testare TestNG. De asemenea, am folosit Raport de extindere. Dar nu intru în detaliile unui proiect Maven sau al unui raport de extindere, ci doar să mă concentrez pe PhantomJS.
Detaliile codului pentru fiecare dintre componente sunt prezentate mai jos. Acest cadru este destinat să se concentreze pe implementarea phantomJS, astfel încât cadrul este conceput pe baza acestui lucru, dar cu siguranță se poate extinde acest cadru în conformitate cu specificațiile proprii de afaceri.
În primul rând, vom vedea în ce dependențe trebuie să declarăm POM.xml pentru a rula acest proiect
'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
Componente reutilizabile
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
Această bucată de cod este asociată cu inițierea browserului.
Aici numele browserului este codat pe hard. Dar poate fi externalizat (în foaia de proprietăți / excel). Poți alege ce browser să folosești și aici am folosit 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
Această bucată de cod este asociată cu fișierul cu proprietăți de citire pe care l-am folosit ca localizator de elemente web și container 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
Această bucată de cod tratează diverse funcții Selenium pe care le folosim în mod regulat în scripturile noastre, dar am separat aceste funcții de scripturile de testare pentru a reduce liniile de cod din cadrul și pentru a crește gradul de utilizare a acestuia.
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
Această bucată de cod se referă la trimiterea unui e-mail automat după executarea cazului de testare.
Componente de testare
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
Acesta este cazul testului efectiv în care:
- Lansăm adresa URL.
- Facem clic pe fila de descărcare și verificăm dacă linkul de descărcare este sau nu clicabil.
- Citim toate anteturile h3 din fila de descărcare a paginii.
- Validăm numărul antetelor h3.
Componente reutilizabile
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/
Proprietăți APPURL.
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
Acestea sunt datele introduse în acest cadru, deoarece cadrul este conceput pentru a fi bazat pe date.
- ScreenShotLoc.java stochează locația capturilor de ecran în unitate și locația driverului browserului.
- APPURL.properties stochează adresa URL a aplicației implicată în testare.
- ObjectRepository.properties stochează localizatori de elemente web.
Captură de ecran și raportare post-execuție
Acum vom vedea raportul post-execuție:
Scenariu pozitiv: Captura de ecran de mai sus este raportul generat la executarea cu succes a tuturor etapelor de testare a cazurilor de test automatizate.
ce este un fișier eps?
Scenariu negativ: Captura de ecran de mai sus este raportul generat atunci când toți pașii de testare a cazurilor de test automat nu sunt executate cu succes.
Captură de ecran cu poștă automată:
Recomandare de a utiliza PhantomJS ca browser de testare
Mai jos sunt prezentate câteva recomandări cu privire la momentul utilizării PhantomJS ca browser de testare.
- Execuția este rapidă, cu performanțe bune.
- Un bun candidat pentru automatizare dacă nu este necesară monitorizarea manuală, deoarece browserul nu este mai puțin GUI.
- Foarte recomandat atunci când cazurile de testare sunt concepute pentru a efectua teste de fum sau cazurile de testare în care sunt luate în considerare doar punctele de validare.
- Nu este recomandat pentru testarea funcțională regresivă.
Citire sugerată = >> Capturi de ecran în Selenium
Lectura placuta!!
Lectură recomandată
- Tutorial Castravete Seleniu: Integrare Castravete Java Seleniu WebDriver
- 7 factori care afectează estimarea testului proiectului de automatizare Selenium - Tutorial Selenium # 32
- Appium Studio pentru Eclipse: automatizarea end-to-end Appium / Selenium de la Eclipse
- Introducere în Selenium WebDriver - Tutorial Selenium # 8
- Selenium Grid Tutorial: Configurare și exemplu de testare a browserului încrucișat
- Tutorial ChromeDriver Selenium: Teste Selenium Webdriver pe Chrome
- Scenarii eficiente cu scripturi și depanare Selenium - Tutorial Selenium # 27
- Depanarea scripturilor Selenium cu jurnale (Tutorial Log4j) - Tutorial Selenium # 26