selenium phantomjs tutorial
Dans cet article, Selenium Automation avec PhantomJS est expliqué avec des exemples de code:
PhantomJS est un navigateur sans tête qui est principalement utilisé pour l'automatisation sans GUI.
Les performances et l'exécution qui se produisent sur ce navigateur sont plus rapides et sont généralement utilisées dans les scénarios où la surveillance manuelle n'est pas requise et sur les applications qui sont complètement automatisables.
PhantomJS est fortement recommandé en cas d'exécution de script pendant la nuit, où la surveillance humaine n'est pas requise car l'exécution est rapide et rapide. Il fournit également des options pour une capture d'écran automatique pour le suivi manuel du processus d'exécution du script.
Ce que vous apprendrez:
- Utilisation de PhantomJS sur l'automatisation de page Web
- PhantomJS et Selenium pour l'automatisation Web (basique)
- PhantomJS et Selenium pour l'automatisation Web (avancé)
- Capture d'écran et rapport post-exécution
- Recommandation pour utiliser PhantomJS comme navigateur de test
- lecture recommandée
Utilisation de PhantomJS sur l'automatisation de page Web
Dans cet article, nous utiliserons l'outil d'automatisation Selenium pour effectuer une automatisation fonctionnelle sur le navigateur PhantomJS.
PhantomJS instancie en fait un navigateur qui n'a pas d'interface graphique, mais il a tout le standard d'un navigateur avec une interface graphique comme (Firefox, IE, etc.), les scripts DOM standard, les appels Ajax, etc.
Objectif de l'utilisation de PhantomJS avec du sélénium
Il est très important de comprendre l'objectif de l'utilisation de PhantomJS avec Selenium.
Nous savons tous que Selenium est un outil d'automatisation fonctionnelle utilisé pour automatiser diverses fonctionnalités des applications Web.
Désormais, l'objectif de PhantomJS est légèrement différent car il s'agit d'un navigateur sans interface utilisateur graphique et son utilisation principale est d'automatiser les cas de test avec des tests de validation / test de fumée et non une automatisation de test régressif à part entière.
Si nous automatisons à l'aide de Selenium et PhantomJS, il faut faire attention au choix des cas de test. Un autre élément important est le suivi de l'état d'exécution des cas de test car nous ne pouvons pas voir physiquement l'exécution.
PhantomJS et Selenium pour l'automatisation Web (basique)
Comme tous les autres navigateurs avec interface graphique (Firefox, IE, Chrome, etc.), pour PhantomJS également, Selenium dispose d'une API standard pour prendre en charge l'automatisation.
Illustrons la même chose avec un code simple:
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(); } }
L'extrait de code ci-dessus est lancé Site officiel de Selenium sur le navigateur PhantomJS et effectue une opération de clic sur l'onglet de téléchargement. Ensuite, il calcule le nombre d'en-têtes balisés h3 du contenu principal de la page de téléchargement et l'imprime.
comment afficher les fichiers bin sur android
Après l'exécution de chaque opération, il faut une capture d'écran pour un suivi manuel.
comment exécuter le fichier java jar
Nous allons maintenant intégrer la même fonctionnalité de test dans un cadre avec suivi des journaux avec la capture d'écran. Ajoutons également un mailing automatique avec l'intégration du rapport d'étendue pour lui donner une automatisation complète, afin que nous puissions suivre le résultat de l'exécution plus tard.
PhantomJS et Selenium pour l'automatisation Web (avancé)
Image de la structure du cadre
Le cadre est comme l'image le suggère et est composé de:
- Les composants réutilisables qui peuvent être réutilisés par chaque script de test
- Le composant de test qui sera créé avec chaque nouveau scénario de test.
- Les composants de ressources qui sont les entrées du framework comme (localisateurs d'élément Web, URL, etc.)
Ici, le projet est construit sur Maven avec le framework de test TestNG. De plus, nous avons utilisé le rapport d'étendue. Mais je n'entre pas dans les détails d'un projet Maven ou d'un rapport d'étendue, mais je me concentre simplement sur PhantomJS.
Les détails du code pour chacun des composants sont donnés ci-dessous. Ce framework est destiné à se concentrer sur l'implémentation de phantomJS, donc le framework est conçu sur cette base, mais on peut certainement étendre ce framework selon ses propres spécifications métier.
Tout d'abord, nous verrons quelles dépendances nous devons déclarer dans POM.xml afin d'exécuter ce projet
'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
Composants réutilisables
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
Ce morceau de code est associé à l'initiation du navigateur.
Ici, le nom du navigateur est codé en dur. Mais il peut être externalisé (dans les propriétés / feuille Excel). On peut choisir quel navigateur utiliser, et ici nous avons utilisé 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
Ce morceau de code est associé au fichier de propriétés de lecture que nous avons utilisé comme localisateur d'élément Web et conteneur 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
Ce morceau de code traite de diverses fonctions Selenium que nous utilisons régulièrement dans nos scripts, mais nous avons séparé ces fonctions des scripts de test pour réduire les lignes de code dans le framework et augmenter sa convivialité.
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
Ce morceau de code traite de l'envoi d'un courrier automatisé après l'exécution du scénario de test.
Composants de test
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
C'est le cas de test réel où:
- Nous lançons l'URL.
- Nous cliquons sur l'onglet de téléchargement et vérifions que le lien de téléchargement est cliquable ou non.
- Nous lisons tous les en-têtes h3 sur l'onglet de téléchargement de la page.
- Nous validons le décompte des en-têtes h3.
Composants réutilisables
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
Ce sont les intrants qui alimentent ce cadre car le cadre est conçu pour être axé sur les données.
- ScreenShotLoc.java stocke l'emplacement de la capture d'écran dans le lecteur et l'emplacement du pilote du navigateur.
- APPURL.properties stocke l'URL de l'application impliquée dans le test.
- ObjectRepository.properties stocke les localisateurs d'éléments Web.
Capture d'écran et rapport post-exécution
Maintenant, nous allons voir le rapport post-exécution:
quel est le meilleur système d'exploitation Windows
Scénario positif: La capture d'écran ci-dessus est le rapport généré lorsque toutes les étapes de test des cas de test automatisés sont exécutées avec succès.
Scénario négatif: La capture d'écran ci-dessus est le rapport généré lorsque toutes les étapes de test des cas de test automatisés ne sont pas exécutées avec succès.
Capture d'écran du courrier automatisé:
Recommandation pour utiliser PhantomJS comme navigateur de test
Vous trouverez ci-dessous quelques recommandations sur l'utilisation de PhantomJS en tant que navigateur de test.
- L'exécution est rapide avec de bonnes performances.
- Un bon candidat pour l'automatisation si la surveillance manuelle n'est pas requise car le navigateur n'est pas moins GUI.
- Fortement recommandé lorsque les cas de test sont conçus pour effectuer des tests de fumée ou des cas de test où les points de validation ne sont pris en considération que
- Non recommandé pour les tests fonctionnels régressifs.
Lecture suggérée = >> Captures d'écran sur Selenium
Bonne lecture!!
lecture recommandée
- Tutoriel Cucumber Selenium: Intégration Cucumber Java Selenium WebDriver
- 7 facteurs affectant l'estimation des tests du projet d'automatisation du sélénium - Tutoriel Selenium # 32
- Appium Studio pour Eclipse: l'automatisation Appium / Selenium de bout en bout d'Eclipse
- Introduction à Selenium WebDriver - Tutoriel Selenium # 8
- Didacticiel Selenium Grid: configuration et exemple de test de navigateur croisé
- Tutoriel ChromeDriver Selenium: Tests Selenium Webdriver sur Chrome
- Script Selenium efficace et scénarios de dépannage - Tutoriel Selenium # 27
- Débogage de scripts Selenium avec des journaux (Tutoriel Log4j) - Tutoriel Selenium # 26