selenium phantomjs tutorial
In diesem Artikel wird die Selenautomatisierung mit PhantomJS anhand von Codebeispielen erläutert:
PhantomJS ist ein kopfloser Browser, der hauptsächlich für die Automatisierung der Benutzeroberfläche verwendet wird.
Die Leistung und Ausführung in diesem Browser ist schneller und wird im Allgemeinen in Szenarien verwendet, in denen keine manuelle Überwachung erforderlich ist, sowie in Anwendungen, die vollständig automatisierbar sind.
PhantomJS wird dringend empfohlen, wenn Skripts über Nacht ausgeführt werden und keine Überwachung durch den Benutzer erforderlich ist, da die Ausführung schnell und schnell erfolgt. Es bietet auch Optionen für einen automatischen Screenshot zur manuellen Verfolgung des Skriptausführungsprozesses.
Was du lernen wirst:
- PhantomJS-Nutzung zur Webseitenautomatisierung
- PhantomJS und Selen für die Webautomatisierung (Basic)
- PhantomJS und Selen für die Webautomatisierung (erweitert)
- Screenshot und Bericht nach der Ausführung
- Empfehlung zur Verwendung von PhantomJS als Testbrowser
- Literatur-Empfehlungen
PhantomJS-Nutzung zur Webseitenautomatisierung
In diesem Artikel verwenden wir das Selenium-Automatisierungstool, um eine funktionale Automatisierung im PhantomJS-Browser durchzuführen.
PhantomJS instanziiert tatsächlich einen Browser, der keine GUI-Oberfläche hat, aber den gesamten Standard eines Browsers mit einer GUI-Oberfläche wie (Firefox, IE usw.), Standard-DOM-Skripten, Ajax-Aufrufen usw. hat.
Ziel der Verwendung von PhantomJS mit Selen
Es ist sehr wichtig, das Ziel der Verwendung von PhantomJS mit Selen zu verstehen.
Wir alle wissen, dass Selen ein funktionales Automatisierungswerkzeug ist, mit dem verschiedene Funktionen von Webanwendungen automatisiert werden.
Jetzt ist das Ziel von PhantomJS etwas anders, da es sich um einen Browser ohne grafische Benutzeroberfläche handelt und seine Hauptverwendung darin besteht, die Testfälle zu automatisieren, die unter die Kategorie der Rauchtest- / Validierungstests und nicht der vollwertigen regressiven Testautomatisierung fallen.
Wenn wir mit Selenium und PhantomJS automatisieren, müssen wir bei der Auswahl der Testfälle vorsichtig sein. Ein weiterer wichtiger Teil ist die Verfolgung des Ausführungsstatus von Testfällen, da wir die Ausführung nicht physisch sehen können.
PhantomJS und Selen für die Webautomatisierung (Basic)
Wie alle anderen Browser mit GUI-Oberfläche (Firefox, IE, Chrome usw.) verfügt auch Selenium für PhantomJS über eine Standard-API zur Unterstützung der Automatisierung.
Lassen Sie uns dasselbe mit einem einfachen Code veranschaulichen:
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(); } }
Das obige Code-Snippet wird gestartet Offizielle Website von Selen im PhantomJS-Browser und führt die Klickoperation auf der Download-Registerkarte aus. Anschließend wird die Anzahl der mit h3 gekennzeichneten Header des Hauptinhalts auf der Downloadseite berechnet und gedruckt.
Fragen und Antworten zu HTML- und CSS-Interviews
Nach der Ausführung jeder Operation wird ein Screenshot zur manuellen Verfolgung erstellt.
Python vs C ++ Syntax
Jetzt werden wir die gleiche Testfunktionalität in ein Framework mit Protokollverfolgung zusammen mit dem Screenshot integrieren. Fügen wir neben der Integration von Extent-Berichten auch das automatische Mailing hinzu, um einen vollständigen Automatisierungs-Wrap zu erhalten, damit wir das Ausführungsergebnis später verfolgen können.
PhantomJS und Selen für die Webautomatisierung (erweitert)
Bild der Gerüststruktur
Der Rahmen ist wie im Bild dargestellt und besteht aus:
- Die wiederverwendbaren Komponenten, die von jedem Testskript wiederverwendet werden können
- Die Testkomponente, die bei jedem neuen Testfall neu erstellt wird.
- Die Ressourcenkomponenten, die die Eingaben des Frameworks sind, wie (Webelement-Locators, URL usw.)
Hier baut das Projekt zusammen mit dem Testframework TestNG auf Maven auf. Außerdem haben wir den Extent Report verwendet. Aber ich gehe nicht auf die Details eines Maven-Projekts oder eines Umfangsberichts ein, sondern konzentriere mich nur auf PhantomJS.
Codedetails für jede der Komponenten sind unten angegeben. Dieses Framework soll sich auf die Implementierung von phantomJS konzentrieren, daher ist das Framework darauf basierend konzipiert, aber man kann dieses Framework definitiv gemäß der eigenen Geschäftsspezifikation erweitern.
Zuerst werden wir sehen, in welchen Abhängigkeiten wir deklarieren müssen POM.xml um dieses Projekt auszuführen
'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
Wiederverwendbare Komponenten
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
Dieser Code ist mit der Browser-Initiierung verknüpft.
Hier ist der Browsername fest codiert. Es kann jedoch externalisiert werden (in Eigenschaften / Excel-Tabelle). Man kann wählen, welchen Browser man verwenden möchte, und hier haben wir PhantomJS verwendet.
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
Dieser Code ist mit der Leseeigenschaftendatei verknüpft, die wir als Webelement-Locator und URL-Container verwendet haben.
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
Dieser Code befasst sich mit verschiedenen Selenium-Funktionen, die wir regelmäßig in unseren Skripten verwenden. Wir haben diese Funktionen jedoch von Testskripten getrennt, um die Codezeilen im Framework zu reduzieren und die Benutzerfreundlichkeit zu erhöhen.
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
Dieser Code behandelt das Senden einer automatisierten E-Mail nach der Ausführung des Testfalls.
Komponenten testen
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
Dies ist der eigentliche Testfall, bei dem:
- Wir starten die URL.
- Wir klicken auf die Registerkarte 'Download' und überprüfen, ob der Download-Link anklickbar ist oder nicht.
- Wir lesen alle h3-Header auf der Download-Registerkarte der Seite.
- Wir validieren die Anzahl der h3-Header.
Wiederverwendbare Komponenten
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
undefinierter Verweis auf c ++
Dies sind die Eingaben, die diesem Framework zugeführt werden, da das Framework datengesteuert ist.
- ScreenShotLoc.java speichert den Speicherort des Screenshots im Laufwerk und den Treiberspeicherort des Browsers.
- APPURL.properties speichert die am Testen beteiligte Anwendungs-URL.
- ObjectRepository.properties speichert Webelement-Locators.
Screenshot und Bericht nach der Ausführung
Jetzt sehen wir den Bericht nach der Ausführung:
Positives Szenario: Der obige Screenshot ist der Bericht, der generiert wird, wenn alle Testschritte der automatisierten Testfälle erfolgreich ausgeführt wurden.
Negatives Szenario: Der obige Screenshot ist der Bericht, der generiert wird, wenn nicht alle Testschritte der automatisierten Testfälle erfolgreich ausgeführt wurden.
Screenshot für automatisierte E-Mails:
Empfehlung zur Verwendung von PhantomJS als Testbrowser
Im Folgenden finden Sie einige Empfehlungen zur Verwendung von PhantomJS als Testbrowser.
- Die Ausführung ist schnell mit guter Leistung.
- Ein guter Kandidat für die Automatisierung, wenn keine manuelle Überwachung erforderlich ist, da der Browser nicht weniger GUI enthält.
- Sehr zu empfehlen, wenn die Testfälle für die Durchführung von Rauchtests oder Testfällen ausgelegt sind, bei denen Validierungspunkte nur berücksichtigt werden.
- Nicht empfohlen für regressive Funktionstests.
Empfohlene Lektüre = >> Screenshots in Selen
Fröhliches Lesen!!
Literatur-Empfehlungen
- Cucumber Selenium Tutorial: Integration von Cucumber Java Selenium WebDriver
- 7 Faktoren, die die Testschätzung des Selen-Automatisierungsprojekts beeinflussen - Selen-Tutorial Nr. 32
- Appium Studio für Eclipse: End-to-End-Appium / Selen-Automatisierung von Eclipse
- Einführung in Selenium WebDriver - Selenium Tutorial # 8
- Selenium Grid Tutorial: Setup und Beispiel für Cross-Browser-Tests
- ChromeDriver Selenium Tutorial: Selenium Webdriver-Tests auf Chrome
- Effizientes Selenium-Scripting und Fehlerbehebungsszenarien - Selenium-Lernprogramm Nr. 27
- Debuggen von Selenium-Skripten mit Protokollen (Log4j Tutorial) - Selenium Tutorial # 26