selenium phantomjs tutorial
W tym artykule omówiono automatyzację Selenium z PhantomJS za pomocą przykładów kodu:
PhantomJS to bezgłowa przeglądarka używana głównie do automatyzacji bez graficznego interfejsu użytkownika.
Wydajność i wykonywanie w tej przeglądarce jest szybsze i jest zwykle używane w scenariuszach, w których ręczne monitorowanie nie jest wymagane, oraz w aplikacjach, które można całkowicie zautomatyzować.
PhantomJS jest wysoce zalecany w przypadku wykonywania skryptów z dnia na dzień, gdzie monitorowanie przez człowieka nie jest wymagane, ponieważ wykonanie jest szybkie i szybkie. Udostępnia również opcje automatycznego zrzutu ekranu do ręcznego śledzenia procesu wykonywania skryptu.
Czego się nauczysz:
- Wykorzystanie PhantomJS w automatyzacji stron internetowych
- PhantomJS i Selenium do automatyzacji sieci (podstawowa)
- PhantomJS i Selenium do automatyzacji sieci (zaawansowane)
- Zrzut ekranu i raport po wykonaniu
- Zalecenie użycia PhantomJS jako przeglądarki testowej
- rekomendowane lektury
Wykorzystanie PhantomJS w automatyzacji stron internetowych
W tym artykule będziemy używać narzędzia automatyzacji Selenium do wykonywania automatyzacji funkcjonalnej w przeglądarce PhantomJS.
PhantomJS faktycznie tworzy instancję przeglądarki, która nie ma interfejsu GUI, ale ma wszystkie standardy przeglądarki z interfejsem GUI, takim jak (Firefox, IE itp.), Standardowe skrypty DOM, wywołania Ajax itp.
Cel stosowania PhantomJS z selenem
Bardzo ważne jest, aby zrozumieć cel używania PhantomJS z Selenium.
Wszyscy wiemy, że Selenium to funkcjonalne narzędzie do automatyzacji, które służy do automatyzacji różnych funkcjonalności aplikacji internetowych.
Teraz cel PhantomJS jest nieco inny, ponieważ jest to przeglądarka bez graficznego interfejsu użytkownika, a jej głównym zastosowaniem jest automatyzacja przypadków testowych, które należą do kategorii testów dymnych / testów walidacyjnych, a nie w pełni automatycznej automatyzacji testów regresywnych.
Jeśli automatyzujemy przy użyciu Selenium i PhantomJS, musimy uważać przy wyborze przypadków testowych. Inną ważną częścią jest śledzenie statusu wykonania przypadków testowych, ponieważ nie możemy fizycznie zobaczyć wykonania.
PhantomJS i Selenium do automatyzacji sieci (podstawowa)
Podobnie jak inne przeglądarki z interfejsem GUI (Firefox, IE, Chrome itp.), Również dla PhantomJS, Selenium posiada standardowe API do obsługi automatyzacji.
Zilustrujmy to samo prostym kodem:
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(); } }
Uruchamia się powyższy fragment kodu Oficjalna strona Selenium w przeglądarce PhantomJS i wykonuje operację kliknięcia na karcie pobierania. Następnie oblicza liczbę oznaczonych h3 nagłówków głównej zawartości strony pobierania i drukuje ją.
niezdefiniowane odwołanie do main C ++
Po wykonaniu każdej operacji wykonuje zrzut ekranu do ręcznego śledzenia.
nazywane są metody Pythona używane do dodawania elementów do listy lub usuwania ich z listy
Teraz zintegrujemy tę samą funkcjonalność testową w ramach ze śledzeniem dziennika wraz ze zrzutem ekranu. Dodajmy również automatyczną wysyłkę pocztową wraz z integracją raportów o zakresie, aby uzyskać pełną automatyzację, abyśmy mogli później śledzić wyniki wykonania.
PhantomJS i Selenium do automatyzacji sieci (zaawansowane)
Obraz struktury szkieletu
Ramy są takie, jak sugeruje obraz i składają się z:
- Komponenty wielokrotnego użytku, które mogą być ponownie użyte przez każdy skrypt testowy
- Komponent testowy, który będzie tworzony jako nowy z każdym nowym przypadkiem testowym.
- Komponenty zasobów, które są danymi wejściowymi struktury, takie jak (lokalizatory elementów sieci Web, adresy URL itp.)
Tutaj projekt jest zbudowany na Maven wraz z platformą testową TestNG. Wykorzystaliśmy również raport z zakresu. Ale nie wchodzę w szczegóły projektu Maven lub raportu dotyczącego zakresu, ale po prostu skupiam się na PhantomJS.
Szczegóły kodu dla każdego z komponentów podano poniżej. Ten framework ma skupić się na implementacji phantomJS, więc framework jest zaprojektowany na tej podstawie, ale zdecydowanie można go rozszerzyć zgodnie z własną specyfikacją biznesową.
Najpierw zobaczymy, w jakich zależnościach musimy zadeklarować POM.xml w celu uruchomienia tego projektu
'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
Komponenty wielokrotnego użytku
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); } } }
ZainicjujBrowser.java
Ten fragment kodu jest powiązany z inicjacją przeglądarki.
Tutaj nazwa przeglądarki jest zakodowana na stałe. Ale można to uzewnętrznić (we właściwościach / arkuszu Excela). Można wybrać, której przeglądarki użyć, a tutaj użyliśmy 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
Ten fragment kodu jest powiązany z plikiem właściwości odczytu, którego użyliśmy jako lokalizatora elementów sieci i kontenera adresu 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
Ten fragment kodu dotyczy różnych funkcji Selenium, których regularnie używamy w naszych skryptach, ale oddzieliliśmy te funkcje od skryptów testowych, aby zredukować linie kodu we frameworku i zwiększyć jego użyteczność.
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
Ten fragment kodu dotyczy wysyłania zautomatyzowanej poczty po wykonaniu Przypadku Testowego.
Komponenty testowe
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
To jest rzeczywisty przypadek testowy, w którym:
- Uruchamiamy adres URL.
- Klikamy kartę pobierania i sprawdzamy, czy link do pobrania jest klikalny, czy nie.
- Czytamy wszystkie nagłówki h3 na karcie pobierania strony.
- Sprawdzamy liczbę nagłówków h3.
Komponenty wielokrotnego użytku
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
mysql pytania do wywiadu i odpowiedzi dla doświadczonych
Są to dane wejściowe wprowadzane do tej struktury, ponieważ struktura została zaprojektowana tak, aby była oparta na danych.
- ScreenShotLoc.java przechowuje lokalizację zrzutu ekranu na dysku oraz lokalizację sterownika przeglądarki.
- APPURL.properties przechowuje adres URL aplikacji biorącej udział w testowaniu.
- ObjectRepository.properties przechowuje lokalizatory elementów WWW.
Zrzut ekranu i raport po wykonaniu
Teraz zobaczymy raport porealizacyjny:
Scenariusz pozytywny: Powyższy zrzut ekranu to raport generowany po pomyślnym wykonaniu wszystkich etapów testów automatycznych przypadków testowych.
Scenariusz negatywny: Powyższy zrzut ekranu to raport generowany, gdy wszystkie etapy testów automatycznych przypadków testowych nie zostały pomyślnie wykonane.
Zrzut ekranu automatycznej poczty:
Zalecenie użycia PhantomJS jako przeglądarki testowej
Poniżej podano kilka zaleceń, kiedy używać PhantomJS jako przeglądarki testowej.
- Wykonanie jest szybkie z dobrą wydajnością.
- Dobry kandydat do automatyzacji, jeśli ręczne monitorowanie nie jest wymagane, ponieważ przeglądarka nie jest pozbawiona GUI.
- Bardzo zalecane, gdy przypadki testowe są zaprojektowane do wykonywania testów dymnych lub przypadków testowych, w których brane są pod uwagę tylko punkty walidacyjne.
- Niezalecane do regresywnych testów funkcjonalnych.
Sugerowany odczyt = >> Zrzuty ekranu w Selenium
Miłego czytania !!
rekomendowane lektury
- Cucumber Selenium Tutorial: Cucumber Java Selenium Integracja WebDriver
- 7 Czynników wpływających na estymację testową projektu Selenium Automation - Samouczek Selenium # 32
- Appium Studio for Eclipse: End-to-end Appium / Selenium Automation From Eclipse
- Wprowadzenie do Selenium WebDriver - samouczek Selenium # 8
- Samouczek Selenium Grid: Konfiguracja i przykład testowania w różnych przeglądarkach
- Samouczek Selenium ChromeDriver: Testy Selenium Webdriver w przeglądarce Chrome
- Efektywne skrypty Selenium i scenariusze rozwiązywania problemów - samouczek Selenium nr 27
- Debugowanie skryptów Selenium za pomocą dzienników (samouczek Log4j) - samouczek Selenium # 26