selenium phantomjs tutorial
I den här artikeln förklaras Selen Automation With PhantomJS med kodexempel:
PhantomJS är en huvudlös webbläsare som främst används för GUI mindre automatisering.
Prestandan och utförandet i denna webbläsare är snabbare och används vanligtvis i scenarier där manuell övervakning inte krävs och i de applikationer som är helt automatiska.
PhantomJS rekommenderas starkt vid skriptkörning över natten, där mänsklig övervakning inte krävs eftersom körningen går snabbt. Det ger också alternativ för en automatisk skärmdump för manuell spårning av skriptkörningsprocessen.
Vad du kommer att lära dig:
- PhantomJS-användning på automatiserad webbsida
- PhantomJS och selen för webbautomation (grundläggande)
- PhantomJS och selen för webbautomation (avancerad)
- Skärmdump och rapport efter genomförande
- Rekommendation att använda PhantomJS som testwebbläsare
- Rekommenderad läsning
PhantomJS-användning på automatiserad webbsida
I den här artikeln kommer vi att använda Selenium-automatiseringsverktyget för att utföra funktionell automatisering i PhantomJS-webbläsaren.
PhantomJS startar faktiskt en webbläsare som inte har ett GUI-gränssnitt, men den har all standard för en webbläsare med ett GUI-gränssnitt som (Firefox, IE, etc.), standard DOM-skript, Ajax-samtal etc.
Målet med att använda PhantomJS med selen
Det är mycket viktigt att förstå målet att använda PhantomJS med Selen.
Vi vet alla att Selen är ett funktionellt automatiseringsverktyg som används för att automatisera olika funktioner i webbapplikationer.
Nu är målet för PhantomJS något annorlunda eftersom det är en webbläsare med mindre användargränssnitt och dess primära användning är att automatisera testfallet med att falla under kategorin rökprov / valideringstest och inte fullfjädrad regressiv testautomation.
Om vi automatiserar med Selen och PhantomJS måste vi vara försiktiga med att välja testfall. En annan viktig del är spårning av utförandestatus för testfall eftersom vi inte fysiskt kan se utförandet.
PhantomJS och selen för webbautomation (grundläggande)
Precis som alla andra webbläsare med GUI-gränssnitt (Firefox, IE, Chrome, etc.), för PhantomJS också, har Selenium ett standard-API för att stödja automatiseringen.
Låt oss illustrera detsamma med en enkel kod:
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(); } }
Ovanstående kodavsnitt startar Selen officiella webbplats i webbläsaren PhantomJS och utför klickåtgärder på nedladdningsfliken. Sedan beräknar det antalet h3-taggade rubriker för huvudinnehållet på nedladdningssidan och skriver ut det.
bästa gratis pc-inställningsprogram
Efter genomförandet av varje operation tar det en skärmdump för manuell spårning.
vad är säkerhetsnyckel för trådlöst nätverk
Nu integrerar vi samma testfunktionalitet inom ett ramverk med loggspårning tillsammans med skärmdumpen. Låt oss också lägga till automatisk utskick tillsammans med omfattningsrapportintegration för att ge den en fullständig automatiseringsomslag så att vi kan spåra körningsresultatet senare.
PhantomJS och selen för webbautomation (avancerad)
Bild av ramstrukturen
Ramverket är som bilden antyder och består av:
- De återanvändbara komponenterna som kan återanvändas av varje testmanus
- Testkomponenten som kommer att skapas ny med varje nytt testfall.
- Resurskomponenterna som är ingångarna för ramverket som (Web Element locators, URL, etc.)
Här bygger projektet på Maven tillsammans med testram TestNG. Vi har också använt Extent Report. Men jag går inte in på detaljerna i ett Maven-projekt eller omfattningsrapport utan håller bara fokus på PhantomJS.
Kodinformation för var och en av komponenterna ges nedan. Detta ramverk är avsett att fokusera på implementeringen av phantomJS, så ramverket är utformat utifrån det, men man kan definitivt utöka detta ramverk enligt sin egen affärsspecifikation.
Först får vi se vilka beroenden vi behöver förklara POM.xml för att driva detta 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
Återanvändbara 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
Denna kod är associerad med webbläsarinitiering.
Här är webbläsarens namn hårt kodat. Men det kan externiseras (i egenskaper / excel-ark). Man kan välja vilken webbläsare som ska användas, och här har vi använt 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
Denna kod är associerad med läsegenskapsfilen som vi har använt som en webbelementlokator och URL-behållare.
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
Denna kod behandlar olika selenfunktioner som vi använder regelbundet i våra skript, men vi har separerat dessa funktioner från testskript för att minska kodraderna i ramverket och öka dess användbarhet.
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
Denna kod avser att skicka ett automatiskt e-postmeddelande efter genomförandet av testfallet.
Testa 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
Detta är själva testfallet där:
- Vi lanserar webbadressen.
- Vi klickar på nedladdningsfliken och verifierar att nedladdningslänken är klickbar eller inte.
- Vi läser alla h3-rubriker på nedladdningsfliken på sidan.
- Vi validerar antalet h3-rubriker.
Återanvändbara 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
var du hittar nätverkssäkerhetsnyckeln på routern
APPURL = https://www.google.com ALTERNATE_APPURL = https://selenium.dev/
APPURL. Egenskaper
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
Det här är ingångarna som matas till detta ramverk eftersom ramverket är utformat för att vara datadrivet.
- ScreenShotLoc.java lagrar skärmdumpens plats i enheten och webbläsarens förarplats.
- APPURL.properties lagrar applikations-URL: en som är involverad i testningen.
- ObjectRepository.properties lagrar webbelementlokaler.
Skärmdump och rapport efter genomförande
Nu ska vi se rapporten efter genomförandet:
Positivt scenario: Ovanstående skärmdump är den rapport som genereras när alla teststegen i de automatiska testfallet har utförts.
Negativt scenario: Ovanstående skärmdump är den rapport som genereras när alla teststegen i de automatiska testfallet inte utförs.
Skärmdump för automatiserad e-post:
Rekommendation att använda PhantomJS som testwebbläsare
Nedan följer några rekommendationer om när du ska använda PhantomJS som testwebbläsare.
- Utförandet är snabbt med bra prestanda.
- En bra kandidat för automatisering om manuell övervakning inte krävs eftersom webbläsaren inte är GUI mindre.
- Rekommenderas starkt när testfallet är utformat för att utföra rökprov eller testfall där valideringspunkter endast beaktas.
- Rekommenderas inte för regressiv funktionstestning.
Föreslagen läsning = >> Skärmdumpar i selen
Glad läsning!!
Rekommenderad läsning
- Gurka Selen Tutorial: Gurka Java Selen WebDriver Integration
- 7 faktorer som påverkar testuppskattning av Selen Automation Project - Selen Tutorial # 32
- Appium Studio for Eclipse: End-to-end Appium / Selenium Automation From Eclipse
- Introduktion till Selen WebDriver - Selen Tutorial # 8
- Selenium Grid Tutorial: Installation och exempel på testning av webbläsare
- ChromeDriver Selen Tutorial: Selen Webdriver Tests på Chrome
- Effektiv skriptning av selen och felsökning av scenarier - Selen-handledning # 27
- Felsökning av selenskript med loggar (Log4j-handledning) - Selen-handledning # 26