selenium phantomjs tutorial
इस अनुच्छेद में, फेलोमजस के साथ सेलेनियम स्वचालन कोड उदाहरणों के साथ समझाया गया है:
PhantomJS एक हेडलेस ब्राउज़र है जो मुख्य रूप से GUI कम स्वचालन के लिए उपयोग किया जाता है।
इस ब्राउज़र पर प्रदर्शन और निष्पादन तेजी से हो रहा है और आम तौर पर उन परिदृश्यों में उपयोग किया जाता है जहां मैनुअल निगरानी की आवश्यकता नहीं होती है और उन अनुप्रयोगों पर जो पूरी तरह से स्वचालित हैं।
रातोंरात स्क्रिप्ट निष्पादन के मामले में फैंटमजस की अत्यधिक सिफारिश की जाती है, जहां मानव निगरानी की आवश्यकता नहीं है क्योंकि निष्पादन जल्दी होता है। यह स्क्रिप्ट निष्पादन प्रक्रिया के मैनुअल ट्रैकिंग के लिए एक स्वचालित स्क्रीनशॉट के लिए विकल्प भी प्रदान करता है।
आप क्या सीखेंगे:
- PhantomJS उपयोग वेबपेज स्वचालन पर
- PhantomJS और वेब स्वचालन के लिए सेलेनियम (मूल)
- PhantomJS और सेलेनियम वेब स्वचालन (उन्नत) के लिए
- पोस्ट-एक्ज़ीक्यूशन स्क्रीनशॉट और रिपोर्ट
- परीक्षण ब्राउज़र के रूप में प्रेतजाल का उपयोग करने की सिफारिश
- अनुशंसित पाठ
PhantomJS उपयोग वेबपेज स्वचालन पर
इस लेख में, हम PhantomJS ब्राउज़र पर कार्यात्मक स्वचालन करने के लिए सेलेनियम स्वचालन उपकरण का उपयोग करेंगे।
PhantomJS वास्तव में एक ब्राउज़र को इंस्टेंट करता है, जिसमें GUI इंटरफ़ेस नहीं है, लेकिन इसमें GUI इंटरफ़ेस (फ़ायरफ़ॉक्स, IE, इत्यादि), मानक DOM स्क्रिप्टिंग, Ajax कॉल आदि जैसे ब्राउज़र के सभी मानक हैं।
सेलेनियम के साथ फैंटमज का उपयोग करने का उद्देश्य
सेलेनियम के साथ फैंटमज का उपयोग करने के उद्देश्य को समझना बहुत महत्वपूर्ण है।
हम सभी जानते हैं कि सेलेनियम एक कार्यात्मक स्वचालन उपकरण है जिसका उपयोग वेब अनुप्रयोगों के विभिन्न कार्यों को स्वचालित करने के लिए किया जाता है।
अब PhantomJS का उद्देश्य थोड़ा अलग है क्योंकि यह GUI कम ब्राउज़र है और इसका प्राथमिक उपयोग धूम्रपान के परीक्षण / सत्यापन परीक्षणों की श्रेणी के अंतर्गत आने वाले परीक्षण मामलों को स्वचालित करना है और पूर्ण-प्रतिगामी प्रतिगामी परीक्षण स्वचालन नहीं है।
यदि हम सेलेनियम और फैंटमज का उपयोग करके स्वचालित करते हैं, तो हमें परीक्षण मामलों को चुनने में सावधानी बरतनी चाहिए। एक अन्य महत्वपूर्ण हिस्सा परीक्षण मामलों के निष्पादन की स्थिति पर नज़र रखता है क्योंकि हम शारीरिक रूप से निष्पादन को नहीं देख सकते हैं।
PhantomJS और वेब स्वचालन के लिए सेलेनियम (मूल)
जीएनआई इंटरफ़ेस (फ़ायरफ़ॉक्स, आईई, क्रोम, आदि) के साथ किसी भी अन्य ब्राउज़रों की तरह, फ़ैंटमजस के लिए भी, सेलेनियम को स्वचालन का समर्थन करने के लिए एक मानक एपीआई है।
एक सरल कोड के साथ इसका उदाहरण दें:
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 टैग किए गए हेडर की संख्या की गणना करता है और इसे प्रिंट करता है।
विंडोज 7 के लिए पासवर्ड पटाखा सॉफ्टवेयर
प्रत्येक ऑपरेशन के निष्पादन के बाद, यह मैन्युअल ट्रैकिंग के लिए स्क्रीनशॉट लेता है।
जावा साक्षात्कार कोड प्रश्न और उत्तर
अब हम स्क्रीनशॉट के साथ लॉग ट्रैकिंग के साथ एक फ्रेमवर्क के भीतर समान परीक्षण कार्यक्षमता को एकीकृत करेंगे। आइए इसे पूर्ण स्वचालन आवरण देने के लिए हद रिपोर्ट एकीकरण के साथ स्वचालित मेलिंग भी जोड़ें, ताकि हम निष्पादन परिणाम को बाद में ट्रैक कर सकें।
PhantomJS और सेलेनियम वेब स्वचालन (उन्नत) के लिए
फ्रेमवर्क संरचना की छवि
जैसा कि चित्र से पता चलता है फ्रेमवर्क निम्न है और इससे बना है:
- पुन: प्रयोज्य घटक जिनका पुन: उपयोग प्रत्येक परीक्षण स्क्रिप्ट द्वारा किया जा सकता है
- टेस्ट कंपोनेंट जो प्रत्येक नए टेस्ट केस के साथ नया बनाया जाएगा।
- संसाधन घटक जो ढांचे के इनपुट हैं (जैसे वेब तत्व लोकेटर, URL, आदि)
यहां प्रोजेक्ट टेस्टिंग फ्रेमवर्क टेस्टएनजी के साथ मावेन पर बनाया गया है। साथ ही, हमने एक्स्टेंट रिपोर्ट का उपयोग किया है। लेकिन मैं एक मावेन परियोजना या विस्तार रिपोर्ट के विवरण में नहीं मिल रहा हूं, बल्कि सिर्फ फैंटमजस पर ध्यान केंद्रित कर रहा हूं।
प्रत्येक घटक के लिए कोड विवरण नीचे दिए गए हैं। इस ढांचे का उद्देश्य प्रेतजाल के कार्यान्वयन पर ध्यान केंद्रित करना है, इसलिए रूपरेखा उसी के आधार पर तैयार की गई है, लेकिन कोई निश्चित रूप से इस ढांचे को अपने स्वयं के व्यवसाय विनिर्देश के अनुसार बढ़ा सकता है।
सबसे पहले, हम देखेंगे कि हमें किन निर्भरताओं में घोषणा करने की आवश्यकता है 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
कोड का यह टुकड़ा ब्राउज़र इनीशिएशन के साथ जुड़ा हुआ है।
यहां ब्राउजर का नाम हार्डकोड है। लेकिन इसे बाहरी (गुणों / एक्सेल शीट में) किया जा सकता है। जो ब्राउज़र का उपयोग करने के लिए चुन सकते हैं, और यहाँ हमने 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; } }
जायदाद
कोड का यह टुकड़ा रीडिंग प्रॉपर्टीज़ फाइल से जुड़ा है जिसे हमने वेब एलिमेंट लोकेटर और 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); } }
पुन: प्रयोज्यमठोदेसजवा
कोड का यह टुकड़ा विभिन्न सेलेनियम कार्यों से संबंधित है, जिनका उपयोग हम अपनी स्क्रिप्ट में नियमित रूप से करते हैं, लेकिन हमने इन कार्यों को टेस्ट स्क्रिप्ट से अलग कर दिया है ताकि फ्रेमवर्क में कोड की लाइनों को कम किया जा सके और इसकी उपयोगिता को बढ़ाया जा सके।
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.properties
Download_Tab = Download H3_Headerlist= (//div(@id='mainContent')//h3(1))
ObjectRepository.properties
ये इस ढांचे के लिए दिए गए इनपुट हैं क्योंकि रूपरेखा को डेटा-संचालित करने के लिए डिज़ाइन किया गया है।
- ScreenShotLoc.java ड्राइव और ब्राउज़र के ड्राइवर स्थान में स्क्रीनशॉट स्थान संग्रहीत करता है।
- APPURL.properties परीक्षण में शामिल एप्लिकेशन URL को संग्रहीत करता है।
- ObjectRepository.properties वेब तत्व लोकेटरों को संग्रहीत करता है।
पोस्ट-एक्ज़ीक्यूशन स्क्रीनशॉट और रिपोर्ट
अब हम निष्पादन के बाद की रिपोर्ट देखने जा रहे हैं:
सकारात्मक परिदृश्य: उपरोक्त स्क्रीनशॉट उत्पन्न रिपोर्ट है जब स्वचालित परीक्षण मामलों के सभी परीक्षण चरणों को सफलतापूर्वक निष्पादित किया जाता है।
नकारात्मक परिदृश्य: उपरोक्त स्क्रीनशॉट उत्पन्न रिपोर्ट है जब स्वचालित परीक्षण मामलों के सभी परीक्षण चरणों को सफलतापूर्वक निष्पादित नहीं किया जाता है।
देखने वाली कंपनियों का इंटरनेट
स्वचालित मेल स्क्रीनशॉट:
परीक्षण ब्राउज़र के रूप में प्रेतजाल का उपयोग करने की सिफारिश
नीचे दिए गए कुछ सुझाव हैं, जब टेस्ट ब्राउज़र के रूप में फैंटमज का उपयोग करना है।
- निष्पादन अच्छा प्रदर्शन के साथ तेज है।
- ऑटोमेशन के लिए एक अच्छा उम्मीदवार अगर मैनुअल मॉनिटरिंग की आवश्यकता नहीं है क्योंकि ब्राउज़र जीयूआई से कम नहीं है।
- अत्यधिक मामलों की सिफारिश तब की जाती है जब परीक्षण मामलों को धूम्रपान परीक्षण या परीक्षण के मामलों को करने के लिए डिज़ाइन किया जाता है जहां सत्यापन बिंदुओं को केवल ध्यान में रखा जाता है।
- प्रतिगामी कार्यात्मक परीक्षण के लिए अनुशंसित नहीं है।
सुझाव पढ़ें = >> सेलेनियम में स्क्रीनशॉट
पढ़ने का आनंद लो!!
अनुशंसित पाठ
- ककड़ी सेलेनियम ट्यूटोरियल: ककड़ी जावा सेलेनियम वेबड्राइवर एकीकरण
- सेलेनियम स्वचालन परियोजना के परीक्षण के अनुमान को प्रभावित करने वाले 7 कारक - सेलेनियम ट्यूटोरियल # 32
- ग्रहण के लिए Appium Studio: ग्रहण से अंत तक एंडियम / सेलेनियम स्वचालन
- सेलेनियम वेबड्राइवर का परिचय - सेलेनियम ट्यूटोरियल # 8
- सेलेनियम ग्रिड ट्यूटोरियल: सेटअप और क्रॉस ब्राउज़र परीक्षण का उदाहरण
- क्रोमड्राइव सेलेनियम ट्यूटोरियल: क्रोम पर सेलेनियम वेबड्राइवर टेस्ट
- कुशल सेलेनियम स्क्रिप्टिंग और समस्या निवारण परिदृश्य - सेलेनियम ट्यूटोरियल # 27
- लॉग (लॉग 4 जे ट्यूटोरियल) के साथ सेलेनियम लिपियों को डीबग करना - सेलेनियम ट्यूटोरियल # 26