selenium phantomjs tutorial
У овом чланку је примера кода објашњена аутоматизација селена помоћу ПхантомЈС:
ПхантомЈС је претраживач без главе који се првенствено користи за аутоматизацију без ГУИ-ја.
Перформансе и извршавање у овом прегледачу су бржи и углавном се користе у сценаријима где ручно надгледање није потребно и у оним апликацијама које су потпуно аутоматизоване.
ПхантомЈС се топло препоручује у случају извршења скрипте преко ноћи, где људско надгледање није потребно јер је извршавање брзо. Такође пружа могућности за аутоматски снимак екрана за ручно праћење процеса извршавања скрипте.
Шта ћете научити:
- Употреба ПхантомЈС на аутоматизацији веб страница
- ПхантомЈС и селен за веб аутоматизацију (основно)
- ПхантомЈС и селен за веб аутоматизацију (напредно)
- Снимак екрана и извештај након извршења
- Препорука за употребу ПхантомЈС-а као пробног прегледача
- Препоручено читање
Употреба ПхантомЈС на аутоматизацији веб страница
У овом чланку ћемо користити алатку за аутоматизацију Селениум за извршавање функционалне аутоматизације у прегледачу ПхантомЈС.
ПхантомЈС уствари покреће претраживач који нема ГУИ интерфејс, али има све стандарде прегледача са ГУИ интерфејсом (Фирефок, ИЕ итд.), Стандардно ДОМ скриптирање, Ајак позиви итд.
Циљ употребе ПхантомЈС-а са селеном
Веома је важно разумети циљ употребе ПхантомЈС-а са селеном.
Сви знамо да је Селениум алат за функционалну аутоматизацију који се користи за аутоматизацију различитих функционалности веб апликација.
Сада је циљ ПхантомЈС-а мало другачији јер је претраживач без ГУИ-а и његова примарна употреба је аутоматизација тест случајева који спадају у категорију тестова дима / валидације, а не пуноправна регресивна аутоматизација теста.
Ако аутоматизујемо помоћу селена и ПхантомЈС, морамо бити опрезни при одабиру тест случајева. Други важан део је праћење статуса извршења тест случајева јер физички не можемо видети извршење.
ПхантомЈС и селен за веб аутоматизацију (основно)
Као и било који други прегледачи са ГУИ интерфејсом (Фирефок, ИЕ, Цхроме итд.), И за ПхантомЈС, Селениум има стандардни АПИ који подржава аутоматизацију.
Илуструјмо то једноставним кодом:
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(); } }
Покреће се горњи исечак кода Званична веб страница селена у прегледачу ПхантомЈС и извршава операцију клика на картици за преузимање. Затим израчунава број заглавља означених х3 главног садржаја на страници за преузимање и штампа га.
како отворити апк датотеку у Виндовсима
Након извршења сваке операције, снима се снимак екрана за ручно праћење.
Јава програмирање интервју питања и одговори за свеже
Сада ћемо интегрисати исту функционалност теста у оквир са праћењем дневника заједно са снимком екрана. Хајде да додамо и аутоматско слање поште заједно са интеграцијом извештаја о опсегу како бисмо добили комплетан обим аутоматизације, како бисмо могли касније да пратимо резултат извршења.
ПхантомЈС и селен за веб аутоматизацију (напредно)
Слика структуре оквира
Оквир је онакав како слика сугерише и састоји се од:
- Компоненте за вишекратну употребу које могу поново користити све тест скрипте
- Компонента теста која ће се креирати нова са сваким новим тест случајем.
- Компоненте ресурса које су улазни подаци оквира као што су (локатори веб елемената, УРЛ итд.)
Овде је пројекат изграђен на Мавену заједно са тест оквиром ТестНГ. Такође, користили смо Ектент Репорт. Али не улазим у детаље Мавеновог пројекта или извештаја о опсегу, већ само задржавам фокус на ПхантомЈС.
Детаљи кода за сваку од компоненти дати су у наставку. Циљ овог оквира је да се усредсреди на примену пхантомЈС-а, па је оквир дизајниран на основу тога, али дефинитивно се може проширити овај оквир према сопственој пословној спецификацији.
Прво ћемо видети у којим зависностима треба да се пријавимо ПОМ.кмл како би се покренуо овај пројекат
'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
ПОМ.кмл
Компоненте за вишекратну употребу
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); } } }
ИнитиатеБровсер.јава
Овај део кода повезан је са покретањем прегледача.
Овде је име прегледача чврсто кодирано. Али може се екстернализовати (у својствима / екцел листу). Може се одабрати који прегледач ће се користити, а овде смо користили ПхантомЈС.
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; } }
ПропертиРеадер.јава
Овај део кода повезан је са датотеком својстава читања коју смо користили као локатор веб елемената и контејнер УРЛ-а.
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); } }
РеусеаблеМетходс.јава
Овај део кода се бави разним Селениум функцијама које редовно користимо у нашим скриптама, али раздвојили смо ове функције од тест скрипти како бисмо смањили редове кода у оквиру и повећали његову употребљивост.
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();} } }
СендМаил.јава
Овај део кода се бави слањем аутоматизоване поште након извршења тест случаја.
Тест Цомпонентс
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(); } }
ТестСцриптс.јава
Ово је стварни тест случај где:
- Покрећемо УРЛ.
- Кликнемо на картицу за преузимање и потврђујемо да ли је на линк за преузимање могуће кликнути или не.
- Читамо сва х3 заглавља на картици за преузимање странице.
- Проверавамо број заглавља х3.
Компоненте за вишекратну употребу
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'; }
СцреенСхотЛоцатионс.јава
APPURL = https://www.google.com ALTERNATE_APPURL = https://selenium.dev/
АППУРЛ.пропертиес
Download_Tab = Download H3_Headerlist= (//div[@id='mainContent']//h3[1])
ОбјецтРепоситори.пропертиес
То су улазни подаци који се уносе у овај оквир јер је оквир дизајниран да се заснива на подацима.
- СцреенСхотЛоц.јава чува локацију екрана у погону и локацију управљачког програма прегледача.
- АППУРЛ.пропертиес чува УРЛ апликације која је укључена у тестирање.
- ОбјецтРепоситори.пропертиес чува локаторе веб елемената.
Снимак екрана и извештај након извршења
Сада ћемо видети извештај после извршења:
Позитиван сценарио: Горњи снимак екрана је извештај који се генерише када се успешно изврше сви тест кораци аутоматизованих тест случајева.
Негативни сценарио: Горњи снимак екрана је извештај који се генерише када се сви кораци тестирања аутоматизованих тест случајева не изврше успешно.
Аутоматски снимак е-поште:
Препорука за употребу ПхантомЈС-а као пробног прегледача
Доље је дато неколико препорука о томе када користити ПхантомЈС као пробни прегледач.
- Извршење је брзо уз добре перформансе.
- Добар кандидат за аутоматизацију ако ручно надгледање није потребно, јер прегледач није ни ГУИ.
- Топло се препоручује када су тест случајеви дизајнирани за извођење тестова дима или тест случајеви када се тачке валидације узимају у обзир само.
- Не препоручује се за регресивно функционално испитивање.
Предложено читање = >> Снимке екрана у селену
како отворити мкв датотеку
Срећно читање !!
Препоручено читање
- Водич за краставац селениј: Интеграција Јава Селениум ВебДривер краставца
- 7 фактора који утичу на процену теста пројекта аутоматизације селена - Водич за селен бр. 32
- Аппиум Студио за Ецлипсе: Аутоматска аутоматизација Аппиум / Селениум из Ецлипсе-а
- Увод у Селениум ВебДривер - Водич за селен бр. 8
- Водич за селенску мрежу: Постављање и пример тестирања више прегледача
- Водич за ЦхромеДривер Селениум: Тестови Селениум Вебдривер-а на Цхроме-у
- Ефикасни сценарији за скриптирање и решавање проблема са селенијем - Водич за селениј # 27
- Отклањање грешака у селенијевим скриптама помоћу дневника (Водич за Лог4ј) - Водич за селениум # 26