selenium phantomjs tutorial
В тази статия селеновата автоматизация с PhantomJS е обяснена с примери за кодове:
PhantomJS е браузър без глава, който се използва предимно за автоматизация без GUI.
Производителността и изпълнението, които се случват в този браузър, са по-бързи и обикновено се използват в сценарии, при които не се изисква ръчен мониторинг, и в онези приложения, които са напълно автоматизирани.
PhantomJS е силно препоръчителен в случай на овърнайт изпълнение на скриптове, където не се изисква човешко наблюдение, тъй като изпълнението е бързо бързо. Той също така предоставя опции за автоматична екранна снимка за ръчно проследяване на процеса на изпълнение на скрипта.
Какво ще научите:
- Използване на PhantomJS при автоматизация на уеб страници
- PhantomJS и селен за уеб автоматизация (Basic)
- PhantomJS и селен за уеб автоматизация (Разширено)
- Снимка на екрана и отчет след изпълнението
- Препоръка за използване на PhantomJS като тестов браузър
- Препоръчително четене
Използване на PhantomJS при автоматизация на уеб страници
В тази статия ще използваме инструмента за автоматизация Selenium за извършване на функционална автоматизация в браузъра PhantomJS.
PhantomJS всъщност създава браузър, който няма GUI интерфейс, но има всички стандарти на браузър с GUI интерфейс като (Firefox, IE и т.н.), стандартни DOM скриптове, Ajax повиквания и т.н.
Цел на използването на PhantomJS със селен
Много е важно да разберете целта на използването на PhantomJS със селен.
Всички знаем, че Selenium е инструмент за функционална автоматизация, който се използва за автоматизиране на различни функционалности на уеб приложения.
Сега целта на PhantomJS е малко по-различна, тъй като е браузър без графичен интерфейс и основната му употреба е да автоматизира тестовите случаи с попадане в категорията тестове за дим / валидиране, а не пълноценна регресивна тестова автоматизация.
Ако автоматизираме с помощта на Selenium и PhantomJS, трябва да внимаваме при избора на тестовите случаи. Друга важна част е проследяването на състоянието на изпълнение на тестовите случаи, тъй като физически не можем да видим изпълнението.
PhantomJS и селен за уеб автоматизация (Basic)
Подобно на всички други браузъри с GUI интерфейс (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 маркираните заглавки на основното съдържание в страницата за изтегляне и го отпечатва.
къде мога да предавам аниме безплатно
След изпълнението на всяка операция се прави екранна снимка за ръчно проследяване.
как да отворите dat файла на windows
Сега ще интегрираме същата тестова функционалност в рамка с проследяване на регистрационния файл заедно със скрийншота. Нека добавим и автоматично изпращане по пощата, заедно с интеграция на отчети за обхват, за да му предоставим цялостна автоматизация, така че да можем да проследим резултата от изпълнението по-късно.
PhantomJS и селен за уеб автоматизация (Разширено)
Изображение на структурата на рамката
Рамката е както изображението подсказва и се състои от:
- Многократно използваемите компоненти, които могат да бъдат използвани повторно от всеки тестов скрипт
- Тестовият компонент, който ще бъде създаден нов с всеки нов тестов случай.
- Ресурсните компоненти, които са входовете на рамката като (локатори на уеб елементи, URL и т.н.)
Тук проектът е изграден върху Maven заедно с тестовата рамка TestNG. Също така използвахме Extent Report. Но аз не навлизам в подробности за проект на 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
как да отворя apk файл на android
APPURL = https://www.google.com ALTERNATE_APPURL = https://selenium.dev/
APPURL.свойства
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
Това са входовете, подадени към тази рамка, тъй като рамката е проектирана да бъде управлявана от данни.
- ScreenShotLoc.java съхранява местоположението на екрана в устройството и местоположението на драйвера на браузъра.
- APPURL.properties съхранява URL адреса на приложението, включен в тестването.
- ObjectRepository.properties съхранява локатори на уеб елементи.
Снимка на екрана и отчет след изпълнението
Сега ще видим отчета след изпълнението:
Положителен сценарий: Горната екранна снимка е отчетът, генериран, когато всички тестови стъпки на автоматизираните тестови случаи се изпълняват успешно.
Отрицателен сценарий: Горната екранна снимка е отчетът, генериран, когато всички тестови стъпки на автоматизираните тестови случаи не се изпълняват успешно.
Автоматизиран екран на пощата:
Препоръка за използване на PhantomJS като тестов браузър
По-долу са дадени няколко препоръки за това кога да се използва PhantomJS като тестов браузър.
- Изпълнението е бързо с добро представяне.
- Добър кандидат за автоматизация, ако не се изисква ръчно наблюдение, тъй като браузърът не е по-малко GUI.
- Силно препоръчително, когато тестовите случаи са проектирани да извършват димни тестове или тестови случаи, при които точките за валидиране се вземат предвид само.
- Не се препоръчва за регресивно функционално тестване.
Предложено четене = >> Екранни снимки в Селен
Честито четене !!
Препоръчително четене
- Урок за краставици селен: Интеграция на краставица Java Selenium WebDriver
- 7 фактора, влияещи върху тестовата оценка на проекта за автоматизация на селен - Урок № 32 за селен
- Appium Studio за Eclipse: Автоматизация на Appium / селен от край до край от Eclipse
- Въведение в Selenium WebDriver - Урок № 8 за селен
- Урок за селенова мрежа: Настройка и пример за тестване на различни браузъри
- Урок за ChromeDriver Selenium: Тестове за Selenium Webdriver в Chrome
- Ефективни сценарии за скриптове и отстраняване на неизправности в селен - Урок № 27 за селен
- Отстраняване на грешки в скриптове за селен с регистрационни файлове (Урок за Log4j) - Урок за селен # 26