selenium phantomjs tutorial
У цій статті автоматизація селену за допомогою PhantomJS пояснюється прикладами коду:
PhantomJS - це безголовий браузер, який в основному використовується для автоматизації графічного інтерфейсу.
Продуктивність і виконання, що відбуваються в цьому браузері, відбувається швидше і зазвичай використовується в сценаріях, коли не потрібен ручний моніторинг, і в тих програмах, які повністю автоматизовані.
PhantomJS настійно рекомендується у випадку нічного виконання сценарію, коли моніторинг людини не потрібен, оскільки виконання відбувається швидко. Він також надає параметри автоматичного знімка екрана для ручного відстеження процесу виконання сценарію.
Що ви дізнаєтесь:
- Використання PhantomJS для автоматизації веб-сторінок
- PhantomJS та селен для веб-автоматизації (базовий)
- PhantomJS та селен для веб-автоматизації (додатково)
- Знімок екрана та звіт після виконання
- Рекомендація використовувати PhantomJS як тестовий браузер
- Рекомендована література
Використання PhantomJS для автоматизації веб-сторінок
У цій статті ми будемо використовувати інструмент автоматизації Selenium для виконання функціональної автоматизації у браузері PhantomJS.
PhantomJS насправді створює браузер, який не має графічного інтерфейсу, але він має всі стандартні браузери з графічним інтерфейсом, такі як (Firefox, IE тощо), стандартні сценарії DOM, дзвінки Ajax тощо.
Мета використання PhantomJS із селеном
Дуже важливо зрозуміти мету використання PhantomJS із селеном.
Ми всі знаємо, що Selenium - це функціональний інструмент автоматизації, який використовується для автоматизації різних функціональних можливостей веб-додатків.
Зараз мета PhantomJS дещо інша, оскільки це браузер без графічного інтерфейсу, і основним його використанням є автоматизація тестових випадків, що підпадають під категорію тестів димних / валідаційних тестів, а не повноцінна регресивна автоматизація тестів.
Якщо ми автоматизуємо використання Selenium та PhantomJS, ми повинні бути обережними при виборі тестових кейсів. Іншою важливою частиною є відстеження стану виконання тестових справ, оскільки ми фізично не можемо бачити виконання.
PhantomJS та селен для веб-автоматизації (базовий)
Як і будь-які інші браузери з графічним інтерфейсом (Firefox, IE, Chrome тощо), для PhantomJS також Selenium має стандартний API для підтримки автоматизації.
Проілюструємо те саме простим кодом:
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(); } }
Запускається наведений вище фрагмент коду Офіційний веб-сайт селену у браузері PhantomJS та виконує операцію клацання на вкладці завантаження. Потім він обчислює кількість h3 тегів заголовків основного вмісту на сторінці завантаження та друкує його.
що таке тестування прийнятності користувачами при тестуванні програмного забезпечення
Після виконання кожної операції робиться скріншот для ручного відстеження.
Запитання та відповіді для інтерв’ю у форматі sql pdf
Тепер ми інтегруємо ту саму тестову функціональність у фреймворк із відстеженням журналу разом із скріншотом. Давайте також додамо автоматичну розсилку разом із інтеграцією звітів про ступінь, щоб отримати повне завершення автоматизації, щоб ми могли відстежувати результат виконання пізніше.
PhantomJS та селен для веб-автоматизації (додатково)
Зображення фреймворкової структури
Структура така, як пропонується зображенням, і складається з:
- Багаторазові компоненти, які можуть бути використані кожним сценарієм тесту
- Тестовий компонент, який буде створюватися новим з кожним новим тестовим прикладом.
- Компоненти ресурсу, які є вхідними даними фреймворку, наприклад (локатори веб-елементів, URL-адреса тощо)
Тут проект побудований на Maven разом із тестовою структурою TestNG. Крім того, ми використовували Звіт про обсяги. Але я не вдаюся в подробиці проекту Maven або звіту про ступінь, а лише зосереджую увагу на PhantomJS.
Деталі коду для кожного з компонентів наведені нижче. Цей фреймворк призначений для зосередження на впровадженні phantomJS, тому фреймворк розроблений на основі цього, але безперечно можна розширити цей фреймворк відповідно до власної специфікації бізнесу.
По-перше, ми побачимо, в яких залежностях нам потрібно заявити POM.xml для запуску цього проекту
'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
Багаторазові компоненти
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
Цей фрагмент коду пов’язаний із ініціацією браузера.
Тут назва браузера є жорстко закодованою. Але його можна екстерналізувати (у властивості / лист Excel). Можна вибрати, який браузер використовувати, і тут ми використали 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
Цей фрагмент коду пов'язаний з файлом властивостей читання, який ми використовували як локатор веб-елементів та контейнер 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
Цей фрагмент коду має справу з різними функціями Selenium, які ми регулярно використовуємо у своїх сценаріях, але ми відокремили ці функції від тестових скриптів, щоб зменшити рядки коду у фреймворці та збільшити його зручність використання.
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
Цей фрагмент коду стосується надсилання автоматизованої пошти після виконання тесту.
Тестові компоненти
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
Це фактичний тестовий випадок, коли:
- Ми запускаємо URL-адресу.
- Ми натискаємо на вкладку завантаження та перевіряємо, чи можна натиснути посилання для завантаження.
- Ми читаємо всі заголовки h3 на вкладці завантаження сторінки.
- Ми перевіряємо кількість заголовків h3.
Багаторазові компоненти
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. Властивості
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
як налаштувати maven в eclipse - -
Це вхідні дані, що надходять у цей фреймворк, оскільки фреймворк розроблений для керування даними.
- ScreenShotLoc.java зберігає розташування знімків екрана на диску та розташування драйверів браузера.
- APPURL.properties зберігає URL-адресу програми, яка бере участь у тестуванні.
- ObjectRepository.properties зберігає локатори веб-елементів.
Знімок екрана та звіт після виконання
Зараз ми побачимо звіт після виконання:
Позитивний сценарій: Наведений вище скріншот - це звіт, створений, коли всі етапи тестування автоматизованих тестових випадків успішно виконуються.
Негативний сценарій: Наведений вище скріншот - це звіт, який створюється, коли всі етапи тестування автоматизованих тестових випадків не виконуються успішно.
Автоматизований знімок екрана пошти:
Рекомендація використовувати PhantomJS як тестовий браузер
Нижче наведено кілька рекомендацій щодо використання PhantomJS як тестового браузера.
- Виконання швидко, з хорошою продуктивністю.
- Хороший кандидат для автоматизації, якщо не потрібен ручний моніторинг, оскільки браузер не менше графічного інтерфейсу.
- Настійно рекомендується, коли тестові кейси призначені для проведення димових тестів або тестових випадків, коли точки перевірки враховуються лише.
- Не рекомендується для регресивного функціонального тестування.
Пропоноване читання = >> Знімки екрана в Selenium
Щасливого читання !!
Рекомендована література
- Підручник з огірка селену: інтеграція огірка Java Selenium WebDriver
- 7 факторів, що впливають на тестову оцінку проекту автоматизації селену - Підручник з селену № 32
- Appium Studio for Eclipse: наскрізна автоматизація Appium / Selenium From Eclipse
- Вступ до Selenium WebDriver - Підручник з селену №8
- Підручник із селенової сітки: Налаштування та приклад крос-браузерного тестування
- Підручник із селену ChromeDriver: Тести веб-драйверів на селен у Chrome
- Ефективні сценарії сценаріїв та усунення несправностей селену - Підручник селену No27
- Налагодження сценаріїв селену за допомогою журналів (Підручник Log4j) - Підручник селену No26