selenium phantomjs tutorial
I denne artikel forklares selen-automatisering med PhantomJS med kodeeksempler:
PhantomJS er en headless browser, der primært bruges til GUI mindre automatisering.
Ydeevnen og udførelsen sker i denne browser er hurtigere og bruges generelt i de scenarier, hvor manuel overvågning ikke er påkrævet, og på de applikationer, der er fuldstændig automatiserbare.
PhantomJS anbefales stærkt i tilfælde af scriptudførelse natten over, hvor menneskelig overvågning ikke er påkrævet, da udførelsen er hurtig hurtig. Det giver også muligheder for et automatisk skærmbillede til manuel sporing af scriptets eksekveringsproces.
Hvad du vil lære:
- PhantomJS-udnyttelse på automatisering af websider
- PhantomJS og selen til webautomatisering (grundlæggende)
- PhantomJS og selen til webautomatisering (avanceret)
- Skærmbillede og rapport efter udførelse
- Anbefaling om at bruge PhantomJS som testbrowser
- Anbefalet læsning
PhantomJS-udnyttelse på automatisering af websider
I denne artikel bruger vi Selenium-automatiseringsværktøjet til at udføre funktionel automatisering på PhantomJS-browseren.
PhantomJS instantierer faktisk en browser, der ikke har en GUI-grænseflade, men den har al standard for en browser med en GUI-grænseflade som (Firefox, IE osv.), Standard DOM-scripting, Ajax-opkald osv.
Formålet med at bruge PhantomJS med selen
Det er meget vigtigt at forstå formålet med at bruge PhantomJS med selen.
Vi ved alle, at Selen er et funktionelt automatiseringsværktøj, der bruges til at automatisere forskellige funktioner i webapplikationer.
Nu er formålet med PhantomJS lidt anderledes, da det er en GUI-mindre browser, og dets primære anvendelse er at automatisere testsagerne med at falde ind under kategorien røgtest / valideringstest og ikke fuldgyldig regressiv testautomatisering.
Hvis vi automatiserer ved hjælp af Selen og PhantomJS, skal vi være omhyggelige med at vælge testsagerne. En anden vigtig del er sporing af eksekveringsstatus for testsager, da vi ikke fysisk kan se udførelsen.
PhantomJS og selen til webautomatisering (grundlæggende)
Ligesom alle andre browsere med GUI-grænseflade (Firefox, IE, Chrome osv.) Har Selenium også for PhantomJS en standard API til at understøtte automatiseringen.
Lad os illustrere det samme med en simpel kode:
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(); } }
Ovenstående kodestykke starter Selen officielle hjemmeside i PhantomJS-browseren og udfører klikoperation på fanen Download. Derefter beregner det antallet af h3-taggede overskrifter af hovedindholdet på download-siden og udskriver det.
swf-filer, der ikke afspilles i browseren
Efter udførelsen af hver operation tager det et skærmbillede til manuel sporing.
oracle pl sql interview spørgsmål til erfarne
Nu integrerer vi den samme testfunktionalitet inden for en ramme med logsporing sammen med skærmbilledet. Lad os også tilføje automatisk mailing sammen med omfangsrapportintegration for at give den en komplet automatiseringsomslag, så vi kan spore udførelsesresultatet senere.
PhantomJS og selen til webautomatisering (avanceret)
Billede af rammestrukturen
Rammen er som billedet antyder og består af:
- De genanvendelige komponenter, som kan genbruges af hvert testskript
- Testkomponenten, der oprettes ny med hver nye testtilfælde.
- Ressourcekomponenterne, som er input af rammen som (Web Element locators, URL osv.)
Her er projektet bygget på Maven sammen med test framework TestNG. Vi har også brugt omfangsrapport. Men jeg kommer ikke ind i detaljerne i et Maven-projekt eller omfangsrapport, men holder kun fokus på PhantomJS.
Kodedetaljer for hver af komponenterne er angivet nedenfor. Denne ramme er beregnet til at fokusere på implementeringen af phantomJS, så rammen er designet ud fra det, men man kan helt sikkert udvide denne ramme i henhold til ens egen forretningsspecifikation.
Først vil vi se, hvilke afhængigheder vi har brug for at erklære i POM.xml for at køre dette projekt
'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
Genanvendelige komponenter
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
Dette stykke kode er knyttet til browserinitiering.
Her er browsernavnet hårdkodet. Men det kan eksternaliseres (i egenskaber / excel-ark). Man kan vælge, hvilken browser der skal bruges, og her har vi brugt 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
Dette stykke kode er knyttet til læsegenskabsfilen, som vi har brugt som webelementlokator og URL-container.
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); } }
Genanvendelige metoder.java
Dette stykke kode beskæftiger sig med forskellige selenfunktioner, som vi bruger regelmæssigt i vores scripts, men vi har adskilt disse funktioner fra testscripts for at reducere kodelinjerne i rammen og øge dets anvendelighed.
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
Dette stykke kode beskæftiger sig med at sende en automatiseret mail efter udførelsen af testsagen.
Test komponenter
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
Dette er den egentlige testtilfælde, hvor:
- Vi lancerer URL'en.
- Vi klikker på fanen Download og kontrollerer, at downloadlinket kan klikkes eller ej.
- Vi læser alle h3-overskrifterne på downloadfanen på siden.
- Vi validerer antallet af h3-overskrifter.
Genanvendelige komponenter
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. Ejendomme
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
Dette er de input, der tilføres denne ramme, da rammen er designet til at være datadrevet.
- ScreenShotLoc.java gemmer skærmbilledets placering i drevet og browserens driverplacering.
- APPURL.properties gemmer applikations-URL'en, der er involveret i testen.
- ObjectRepository.properties gemmer webelementlokatorer.
Skærmbillede og rapport efter udførelse
Nu skal vi se rapporten efter eksekvering:
Positivt scenarie: Ovenstående skærmbillede er den rapport, der genereres, når alle testtrinene i de automatiske testsager udføres med succes.
cirkulær sammenkædet liste c ++
Negativt scenarie: Ovenstående skærmbillede er den rapport, der genereres, når alle testtrinene i de automatiske testsager ikke udføres med succes.
Skærmbillede af automatiseret mail:
Anbefaling om at bruge PhantomJS som testbrowser
Nedenfor er et par anbefalinger om, hvornår PhantomJS skal bruges som en testbrowser.
- Udførelsen er hurtig med god ydeevne.
- En god kandidat til automatisering, hvis manuel overvågning ikke er påkrævet, da browseren ikke er GUI mindre.
- Stærkt anbefalet, når testcases er designet til at udføre røgtests eller testcases, hvor valideringspunkter kun tages i betragtning.
- Anbefales ikke til regressiv funktionstest.
Foreslået Læs = >> Screenshots i selen
God læselyst!!
Anbefalet læsning
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- 7 faktorer, der påvirker testestimering af selen-automatiseringsprojekt - Selen-tutorial # 32
- Appium Studio for Eclipse: End-to-end Appium / Selenium-automatisering fra Eclipse
- Introduktion til Selen WebDriver - Selen Tutorial # 8
- Selenium Grid Tutorial: Opsætning og eksempel på Cross Browser Testing
- ChromeDriver Selenium-tutorial: Selenium Webdriver-test på Chrome
- Effektiv Selen Scripting og fejlfinding af scenarier - Selen Tutorial # 27
- Fejlfinding af selen-scripts med logfiler (Log4j-tutorial) - Selen-tutorial # 26