Satya Avasarala Selenium Web Driver Practical Guide Packt Publishing (2014)
Satya%20Avasarala-Selenium%20WebDriver%20Practical%20Guide-Packt%20Publishing%20(2014)
User Manual:
Open the PDF directly: View PDF .
Page Count: 264
Download | ![]() |
Open PDF In Browser | View PDF |
Selenium WebDriver Practical Guide Interactively automate web applications using Selenium WebDriver Satya Avasarala BIRMINGHAM - MUMBAI Selenium WebDriver Practical Guide Copyright © 2014 Packt Publishing All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews. Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book. Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information. First published: January 2014 Production Reference: 1170114 Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. ISBN 978-1-78216-885-0 www.packtpub.com Cover Image by Prashant Timappa Shetty (sparkling.spectrum.123@gmail.com) Credits Author Satya Avasarala Reviewers Anuj Chaudhary Project Coordinator Amey Sawant Proofreader Clyde Jenkins David Askirk Fotel Daniel Lam Ripon Al Wasim Acquisition Editors Anthony Albuquerque Indexers Hemangini Bari Monica Ajmera Mehta Rekha Nair Priya Subramani Richard Harvey Graphics Lead Technical Editor Priya Singh Technical Editors Dennis John Yuvraj Mannari Abhinash Sahu Production Coordinator Aparna Bhagat Venu Manthena Gaurav Thingalaya Copy Editors Tanvi Gaitonde Kirti Pai Adithi Shetty Cover Work Aparna Bhagat About the Author Satya Avasarala has rich experience in Java development and automation testing. He is an engineer in computer science. He has used WebDriver for many years now and has created several good automation frameworks. He has worked at various large software enterprises such as Oracle Corp, Yahoo! Inc., VMware Inc., and the REA Group. In addition, he is also interested in Service Oriented Architectural design and Business Intelligence. He is an Oracle-certified Service Oriented Architecture Infrastructure Implementation Expert and a Business Intelligence Foundation Suite Implementation Specialist. I would like to thank all my acquisition editors, technical editors, and project coordinators for constantly supporting me in completing this book. I should also thank my colleagues, Pratik Patil and Kerri Rusnak, for their constant encouragement and support in writing this book. Last but not least, I would like to thank my wife, Swathi Vennelaganti, for sacrificing many weekends while I was busy writing this book. Without all these people, this book wouldn't have been a reality. About the Reviewers Anuj Chaudhary is a software engineer who enjoys working on software testing and automation. He has a vast experience with various testing methodologies such as manual testing, automated testing, performance testing, and security testing. He has worked as an individual contributor and technical lead on various software projects dealing with all of the stages in the application development life cycle. He has been awarded the title of Microsoft MVP twice in a row. He writes a blog that you can visit at www.anujchaudhary.com. I would like to thank and congratulate the Packt Publishing team for publishing this awesome book. David Askirk Fotel has worked with computers since his parents brought home an old, used IBM PS/2. He started his development career writing simple programs in QBasic and later in Pascal. From there, he moved on to writing programs in C. Later on, he moved on to Java and other languages. His greatest experience so far was with Lisp, which had a great impact on his programming style and approach to code. David has worked on test-driven development and as a test manager, implementing Selenium tests on an e-learning system. This book is the first on which David has worked, but will not be the last! Daniel Lam is an Agile Test Developer with experience in open and closed source test tools. He specializes in Java, Selenium WebDriver, Continuous Integration, and BDD test frameworks. Ripon Al Wasim is a software engineer living in Dhaka, Bangladesh. He has 12 years' experience in the software industry, three years in software development, and nine years in software testing (both manual and automated). He has also been involved in conducting software testing courses in various companies. He has worked for clients in various countries such as Japan, USA, Finland, Norway, and Bangladesh. Ripon started participating in posting professional questions and answers on Stack Overflow in the year 2011 at http://stackoverflow.com/users/617450/riponal-wasim. Ripon is a Sun Certified Java Programmer (SCJP). He is Japanese Language Proficiency Test (JLPT) Level 3 certified, and is a little familiar with Japanese culture, as he stayed in Japan for one year as an IT professional. This book is Ripon's first official effort. I would like to thank my mother and wife for fostering a helping and inspiring environment at home so I could study and review. I am also deeply thankful and grateful to Cefalo Amravi Ltd. (http://cefalo.com/en), my current company, for providing me a good opportunity to work with automated testing using Selenium WebDriver. I would like to thank Yves Hwang, Product Manager at Varnish Software (https://www.varnish-software.com/) and Partha Guha Roy, CTO of Cefalo Amravi Ltd. for providing technical assistance during my project work. www.PacktPub.com Support files, eBooks, discount offers and more You might want to visit www.PacktPub.com for support files and downloads related to your book. Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub. com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at service@packtpub.com for more details. At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks. TM http://PacktLib.PacktPub.com Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book library. Here, you can access, read and search across Packt's entire library of books. Why Subscribe? • • • Fully searchable across every book published by Packt Copy and paste, print and bookmark content On demand and accessible via web browser Free Access for Packt account holders If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view nine entirely free books. Simply use your login credentials for immediate access. Table of Contents Preface Chapter 1: Introducing WebDriver and WebElements 1 9 Understanding the history of Selenium Selenium 1 or Selenium Remote Control or Selenium RC Selenium 2 or Selenium WebDriver or WebDriver Differences between Selenium 1 and Selenium 2 9 9 12 13 Setting up a project in Eclipse WebElements Locating WebElements using WebDriver 15 20 21 Handling the browser Having better APIs Testing mobile apps Having developer support and advanced functionalities The findElement() method The findElements() method Firebug Using the By locating mechanism Actions on WebElements The getAttribute() method The sendKeys() method The clear() method The submit() method The getCssValue() method The getLocation() method The getSize() method The getText() method The getTagName() method The isDisplayed() method The isEnabled() method The isSelected() method Summary 14 14 14 14 21 22 22 23 32 32 33 34 35 36 37 38 38 39 40 41 41 42 Table of Contents Chapter 2: Exploring Advanced Interactions of WebDriver Understanding actions, build, and perform Learning mouse-based interactions The moveByOffset action The click at current location action The click on a WebElement action The clickAndHold at current location action The clickAndHold a WebElement action The release at current location action The release on another WebElement action The moveToElement action The dragAndDropBy action The dragAndDrop action The doubleClick at current location action The doubleClick on WebElement action The contextClick on WebElement action The contextClick at current location action Learning keyboard-based interactions The keyDown and keyUp actions The sendKeys() method Summary 43 43 45 45 47 49 50 51 52 53 53 55 55 56 57 57 58 59 59 60 60 Chapter 3: Exploring the Features of WebDriver 61 Chapter 4: Different Available WebDrivers 79 Setting the desired capabilities for a browser Taking screenshots Locating target windows and iFrames Switching among windows Switching among frames Handling alerts Exploring Navigate Waiting for WebElements to load Implicit wait time Explicit wait time Handling cookies Summary FirefoxDriver Understanding the Firefox profile Adding the extension to Firefox Storing and retrieving a profile 61 63 65 65 66 68 69 71 72 73 73 77 79 80 84 86 Dealing with Firefox preferences 87 Setting preferences Understanding frozen preferences 89 91 [ ii ] Table of Contents Firefox binary 93 Installing multiple versions of Firefox InternetExplorerDriver Installing InternetExplorerDriver Writing your first test script for the IE browser Building the InternetExplorer driver service Understanding IEDriver capabilities ChromeDriver Installing ChromeDriver Writing your first test script for the Chrome browser Using ChromeOptions SafariDriver Writing your first test script for the Safari browser OperaDriver Installing OperaDriver Writing your first test script for the Opera browser Summary Chapter 5: Understanding WebDriver Events Introducing EventFiringWebDriver and EventListener classes Creating an instance of EventListener Implementing WebDriverEventListener Extending AbstractWebDriverEventListener Creating a WebDriver instance Creating EventFiringWebDriver and EventListener instances Registering EventListener with EventFiringWebDriver Executing and verifying the events Registering multiple EventListeners Exploring different WebDriver event listeners Listening for WebElement value change Listening for WebElement clicked Listening for a WebElement search event Listening for browser back navigation Listening for browser forward navigation Listening for browser navigateTo events Listening for script execution Listening for any exception Unregistering EventListener with EventFiringWebDriver Summary [ iii ] 93 95 95 97 100 104 105 105 106 107 109 109 110 110 110 111 113 113 114 115 117 118 118 118 119 120 121 121 122 122 122 123 123 123 124 124 124 Table of Contents Chapter 6: Dealing with I/O Learning about the FileHandler class Copying files from the source to the destination directory Copying files from the source to the destination directory based on filename suffix Creating a directory Deleting a file or directory Understanding the IsZipped() method Understanding the makeExecutable() method Understanding the makeWritable() method Reading a file Understanding the canExecute() method Learning about the TemporaryFilesystem class Understanding the default temporary filesystem Creating a directory in DefaultTmpFS Deleting a temporary directory Deleting multiple files Changing the temporary filesystem Learning about the Zip class Compressing a directory Decompressing a directory Summary Chapter 7: Exploring RemoteWebDriver and WebDriverBackedSelenium Introducing RemoteWebDriver Understanding the RemoteWebDriver server Downloading the server Running the server Understanding the RemoteWebDriver client Converting an existing test script to use RemoteWebDriver server Using RemoteWebDriver for the Firefox browser Using RemoteWebDriver and the IE browser Using RemoteWebDriver and the Chrome browser Extending the RemoteWebDriver client to take screenshots Understanding the JSON wire protocol Replacing the client library with your own code Exploring WebDriverBackedSelenium Summary [ iv ] 125 125 125 126 127 128 128 129 129 130 131 132 132 133 134 134 135 136 136 137 138 139 139 141 141 141 143 143 147 149 152 154 156 160 165 168 Table of Contents Chapter 8: Understanding Selenium Grid Exploring Selenium Grid Understanding the hub Understanding the node Modifying the existing test script to use Selenium Grid Requesting for nonregistered capabilities Queuing up the request if the node is busy Dealing with two nodes with matching capabilities Configuring Selenium Grid Specifying node configuration parameters Setting supported browsers by a node Setting node timeouts Setting the limit on browser instances Reregistering the node automatically Setting node health-check time Unregistering an unavailable node Setting the browser timeout Hub configuration parameters 169 169 174 176 178 181 182 183 183 184 184 184 185 186 186 186 187 187 Waiting for a match of desired capability Customized CapabilityMatcher WaitTimeout for a new session Different ways to specify the configuration Summary Chapter 9: Understanding PageObject Pattern Creating test cases for our WordPress blog Test case 1 – Adding a new post to our WordPress blog Test case 2 – Deleting a post from our WordPress blog Test case 3 – Counting the number of posts on our WordPress blog What is the PageObject pattern? Using the @FindBy annotation Understanding PageFactory Good practices for the PageObjects design Consider a web page as a services provider Always look for implied services Using PageObjects within a PageObject The AddNewPost PageObject The AllPostsPage PageObject Consider methods in PageObjects as services and not as User Actions Identifying some WebElements on the fly Keeping the page-specific details off the test script Understanding loadable components [v] 187 188 188 188 190 191 191 192 193 194 195 197 198 199 199 201 202 202 203 204 206 207 208 Table of Contents Working on an end-to-end example of WordPress Looking at all the PageObjects The AdminLoginPage PageObject The AllPostsPage PageObject The AddNewPostPage PageObject The EditPostPage PageObject The DeletePostPage PageObject Looking at the test cases 209 209 209 210 213 213 214 215 Adding a new post Editing a post Deleting a post Counting posts 215 216 217 218 Summary Chapter 10: Testing iOS and Android Apps Different forms of mobile applications Available software tools Automating iOS and Android tests using Appium Automating iOS application tests Automating Android application tests Prerequisites for Appium Setting up Xcode Setting up Android SDK Installing Appium Automating for iOS Automating for Android Summary 219 221 221 223 223 224 225 226 226 227 231 232 236 238 Index 239 [ vi ] Preface This book is about Selenium WebDriver, also known as Selenium 2, which is a UI automation tool used by software developers and QA engineers to test their web application on different web browsers. The reader is expected to have a basic idea of programming, preferably using Java, because we take the reader through several features of WebDriver using code examples. This book can be used as a reference for your day-to-day usage of WebDriver. What this book covers Chapter 1, Introducing WebDriver and WebElements, will start off by briefly discussing the history of Selenium and the differences between Selenium 1 and Selenium 2. Then, we quickly jump into WebDriver by describing how it perceives a web page. We will also look at what a WebDriver's WebElement is. Then, we talk about locating WebElements on a web page and performing some basic actions on them. Chapter 2, Exploring Advanced Interactions of WebDriver, will dive deeply into more advanced actions that WebDriver can perform on the WebElements of a web page, such as the dragging-and-dropping of elements from one frame of a page to another and right/context-clicking on WebElements. We're sure you will find this chapter interesting to read. Chapter 3, Exploring the Features of WebDriver, will talk about some advanced features of WebDriver, such as taking screenshots of web pages, executing JavaScript, and handling cookies and proxies. Preface Chapter 4, Different Available WebDrivers, will talk about various implementations of WebDriver, such as FirefoxDriver, IEDriver, and ChromeDriver. When we discuss WebDriver in Chapter 1, Introducing WebDriver and WebElements, we will see that WebDriver has specific implementations for most of the popular browsers available on the market. Chapter 5, Understanding WebDriver Events, will deal with the event-handling aspect of WebDriver. To state a few, events can be a value change on a WebElement, a browser back-navigation invocation, script execution completion, and so on. Chapter 6, Dealing with I/O, will introduce you to the file-handling features of WebDriver. Concepts such as copying files, uploading files, and deleting files will be discussed in this chapter. Chapter 7, Exploring RemoteWebDriver and WebDriverBackedSelenium, will deal with two very important topics of WebDriver: RemoteWebDriver and WebDriverBackedSelenium. If you want to execute a WebDriver installed on a different machine from your machine, you can use the RemoteWebDriver class to handle all your commands for that remote machine. One of its popular use cases is browser compatibility testing. The other class we talk about in this chapter is WebDriverBackedSelenium. This is useful for people who want to use WebDriver, but still have many of their existing tests using Selenium 1. Finally, we will migrate some code using Selenium1 APIs to use WebDriver APIs. Chapter 8, Understanding Selenium Grid, will talk about one important and interesting feature of Selenium named Selenium Grid. Using this, you can submit your developed automation scenarios to a server and specify there the target platform, that is, the OS, browser type, and version, upon which you want these scenarios to be executed. If a node with such a configuration is registered and available, the server will dispatch your job to that node, and it will take care of executing your automation scenarios in its environment and publish the results back to the server. Chapter 9, Understanding PageObject Pattern, will talk about a well-known design pattern named the PageObject pattern. This is a proven pattern that will give you a better handle on your automation framework and scenarios. Chapter 10, Testing iOS and Android Apps, we will take you through how WebDriver can be used to automate your test scripts for iOS and Android applications. We will also discuss a recently developed software tool called Appium. By the end of this book, we are sure you will be one of the world's advanced WebDriver users. [2] Preface What you need for this book The following sections describe the installation of components required to work with the code in this book. Installing Java In this book, all the code examples that we show covering various features of WebDriver will be in Java. To follow these examples and write your own code, you need Java Development Kit installed on your computer. The latest version of JDK can be downloaded from the following link: http://docs.oracle.com/javase/7/docs/webnotes/install/windows/jdkinstallation-windows.html A step-by-step installation guide is available at the following link: http://docs.oracle.com/javase/7/docs/webnotes/install/windows/jdkinstallation-windows.html Installing Eclipse This book is a practical guide that expects the user to write and execute WebDriver examples. For this, it would be handy to install a Java IDE. You can install your favorite IDE. Here, I am installing Eclipse. It can be downloaded from the following link: http://www.eclipse.org/downloads/packages/eclipse-ide-javadevelopers/junosr2 Installing Firefox Most of the work in this book will be done using Firefox. However, we do talk about other browsers and their respective drivers in Chapter 4, Different Available WebDrivers. We will work with Firefox 17.0.1, which has been tested and tried against WebDriver 2.33.0. It can be downloaded from the following link: https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/17.0.1/ Installing Firebug Firebug is one of the add-ons of Firefox. It is widely used to inspect HTML elements on a web page. You can get Firebug from the following link: https://getfirebug.com/ [3] Preface After installation, when you open the Firefox browser, you should see the firebug icon on the top-right corner of the browser, as shown highlighted in red in the following screenshot: Now, click on the Firebug icon to load the Firebug UI, as shown in the following screenshot: [4] Preface Installing FirePath After you have installed the Firebug add-on to Firefox, it's time to extend Firebug to have something named FirePath. FirePath is used to get XPath and CSS values of an HTML element on a web page. You can download FirePath from the following location: https://addons.mozilla.org/en-US/firefox/addon/FirePath/ After installation, you should see a new tab in the Firebug UI for FirePath, as shown in the following screenshot: Downloading WebDriver client library (language bindings) As discussed earlier, test scripts need a client library with which to interact, or command WebDriver to execute specific user events against a web application being tested on a browser. For this, you need to download the WebDriver client library. In this book, we use Java language bindings to create and execute our automation scripts. [5] Preface At the time of writing this book, all the code examples are written based on Selenium Java Version 2.33.0. It is recommended that you download that version from the following location: https://code.google.com/p/selenium/downloads/detail?name=seleniumjava-2.33.0.zip&can=2&q= Downloading the Firefox Driver The good news is that you have already downloaded the Firefox Driver. Yes, the Firefox Driver comes along with client libraries. But, for other drivers, such as the IE Driver, Safari Driver, Chrome Driver, and so on, you have to download them explicitly from the following link: http://docs.seleniumhq.org/download/ We will download them when we need to in Chapter 4, Different Available WebDrivers. Who this book is for If you are a quality assurance/testing professional, software developer, or web application developer looking to create automation test scripts for your web applications, this is the perfect guide for you! As a prerequisite, this book expects you to have a basic understanding of Java programming, although any previous knowledge of WebDriver or Selenium 1 is not needed. By the end of this book, you will have acquired a comprehensive knowledge of WebDriver, which will help you in writing your automation tests. Conventions In this book, you will find a number of styles of text that distinguish among different kinds of information. Here are some examples of these styles, and an explanation of their meaning. Code words in text, database table names, folder names, filenames, file extensions, pathnames, dummy URLs, user input, and Twitter handles are shown as follows: "The moveByOffset() method is used to move the mouse from its current position to another point on the web page." A block of code is set as follows: public class NavigateToAUrl { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); [6] Preface driver.get("http://www.google.com"); } } When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold: public class GoogleSearchButtonByName { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); WebElement searchBox = driver.findElement(By.name("btnK")); searchBox.submit(); } } Any command-line input or output is written as follows: java -jar selenium-server-standalone-2.33.0.jar -role node -hub http://172.16.87.131:1111/grid/register -registerCycle 10000 New terms and important words are shown in bold. Words that you see on the screen, in menus or dialog boxes for example, appear in the text like this: "Open Eclipse from the directory you have installed it in earlier. Navigate to File | New | Java Project". Warnings or important notes appear in a box like this. Tips and tricks appear like this. Reader feedback Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of. To send us general feedback, simply send an e-mail to feedback@packtpub.com, and mention the book title via the subject of your message. If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors. [7] Preface Customer support Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase. Downloading the example code You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you. Errata Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in the text or the code—we would be grateful if you would report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub. com/submit-errata, selecting your book, clicking on the errata submission form link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded on our website, or added to any list of existing errata, under the Errata section of that title. Any existing errata can be viewed by selecting your title from http://www.packtpub.com/support. Piracy Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works, in any form, on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy. Please contact us at copyright@packtpub.com with a link to the suspected pirated material. We appreciate your help in protecting our authors, and our ability to bring you valuable content. Questions You can contact us at questions@packtpub.com if you are having a problem with any aspect of the book, and we will do our best to address it. [8] Introducing WebDriver and WebElements In this chapter, we will look briefly into the Selenium history and proceed to the basic components of a web page, WebElements. We will learn different ways to locate WebElements on a web page and execute various user actions on them. We will cover the following topics in this chapter: • History of Selenium • Difference between Selenium 1 and Selenium 2 • Setting up an Eclipse project to execute the example code • Locating WebElements on a web page • Actions that can be taken on the WebElements Understanding the history of Selenium Though this book is not intended to deal with Selenium 1, it is a good idea to know briefly about it before we start off with WebDriver. In this way, we can understand how and why WebDriver has evolved. Selenium 1 or Selenium Remote Control or Selenium RC Selenium RC is a popular UI automation library, allowing developers and testers to automate their interactions with a Web Application Under Test (WAUT) by providing them with the necessary libraries, supported in multiple languages, to program. Introducing WebDriver and WebElements In terms of design, Selenium RC chose to use generic JavaScript named Selenium Core to drive the WAUT on a browser. However, the decision of using generic JavaScript that can drive the WAUT on any browser should comply with a security policy named Same-Origin Policy. Every available browser in the market imposes this policy on the websites that are loaded on it. To know about this policy, we should take a closer look at how a browser executes JavaScript loaded from a website. For every website that is loaded on it, the browser creates a separate sandbox for the website's JavaScript, which restricts the JavaScript to be executed only on it's respective website domain. This way, a JavaScript that belongs to one website doesn't execute on another website that is currently loaded on that browser. This security vulnerability, named Cross-site scripting, is the browser's responsibility to restrict. So, coming back to Selenium RC, its generic JavaScript is not allowed, by the browser, to execute on a website (WAUT) that is coming from a different domain. So, how did Selenium RC handle this? To overcome this security restriction, Selenium RC acts as an HTTP Proxy Server. When the test script asks to launch a browser, Selenium RC server launches the browser and injects its JavaScript (Selenium Core) into the browser. All the subsequent requests for the WAUT go through Selenium RC (acting as an HTTP Proxy Server) to the actual web server hosting WAUT. Thus making the browser think that the web application is being served from the Selenium RC's server domain than the actual web server's domain and allowing Selenium Core to execute and drive the web application. Typically, it works in the following way: 1. A tester or a developer, through his/her test script, can command Selenium RC server to perform certain actions on the WAUT on a certain browser. The way the user can command Selenium RC to perform something is by using the client libraries provided by Selenium RC. These libraries are provided in different languages, such as Java, Ruby, Python, Perl, PHP, and .NET. These commands, which are passed from the test scripts to Selenium RC, are named Selenese commands. In a test script, you will have a set of Selenese commands to test a scenario on the WAUT. [ 10 ] Chapter 1 2. Once the Selenium RC server receives the command from the test script, it will launch the test script preferred browser, and while launching, it injects the Selenium Core into the browser. js Launch Selenese Command to launch browser >_ Test Script using Client libraries in Java, Python, Ruby, and so on. js Selenium Remote Control Server js Browsers loaded with Selenium Core JavaScript on them 3. Upon loading on the browser, Selenium Core executes all the Selenese commands from the test script, coming through Selenium RC, against the WAUT. The browser doesn't restrict it, because it treats Selenium Core and WAUT as a part of the same domain. >_ Selenese Command to be executed on WAUT Selenese Command to be executed on WAUT Test Script using Client libraries in Java, Python, Ruby, and so on. Treated as same Domain js Selenium Core Selenium Remote Control Server [ 11 ] WAUT Introducing WebDriver and WebElements 4. Now comes the HTTP Proxy part of the Selenium RC server. All the requests and responses of the browser for WAUT go to the actual web server via Selenium RC server, because the browser thinks Selenium RC is serving WAUT. Selenium Remote Control Server (acting as HTTP Proxy) Request js + WAUT Selenium Core Response Request Response Browser making request to Selenium RC Actual Web server hosting WAUT 5. After execution, Selenium RC will send out the test result back to the test script for developer's analysis. Selenium 2 or Selenium WebDriver or WebDriver To overcome some of the limitations of Selenium 1, which we are going to discuss shortly, WebDriver has come into existence for the following reasons: • To give a better control on the browser by implementing browser-specific implementations. • To give a better programming experience to the developer by adhering more closely to the object-oriented programming fundamentals. It works in the following way: 1. A tester or developer, through his/her test script, can command WebDriver to perform certain actions on the WAUT on a certain browser. The way the user can command WebDriver to perform something is by using the client libraries or language bindings provided by WebDriver. These libraries are provided in different languages, such as Java, Ruby, Python, Perl, PHP, and .NET. [ 12 ] Chapter 1 2. By using the language-binding client libraries, developers can invoke the browser-specific implementations of WebDriver, such as Firefox Driver, IE Driver, Opera Driver, and so on, to interact with the WAUT on the respective browser. These browser-specific implementations of WebDriver will work with the browser natively and execute commands from outside the browser to simulate exactly how the application user does. 3. After execution, WebDriver will send out the test result back to the test script for developer's analysis. Request-Response Firefox Driver >_ + Request-Response IE Driver Web Server hosting WAUT Test Script using WebDriver Client libraries supported in Java, Ruby, Python, and so on. Request-Response Chrome Driver Browsers WebDriver’s Browser-specific Implementations Differences between Selenium 1 and Selenium 2 Now that we know how Selenium 1 and Selenium 2 are designed, let's quickly see the differences between them. [ 13 ] Introducing WebDriver and WebElements Handling the browser As we saw earlier, Selenium RC drives the browser from within the browser by sitting in it as JavaScript (Selenium Core). All the events that are to be executed on the WAUT go through Core. This kind of approach will come with some limitations, such as: • Core being limited within the JavaScript sandbox of the browser, as it needs to comply with the Same-Origin policy. • Because this JavaScript library is generic and not specific to any particular browser, the developers of test scripts sometimes end up with a situation where their test scripts execute very well on some browsers but not on some other. To overcome this limitation, WebDriver, on the other hand, handles the browser from outside the browser. It has an implementation for each browser, and the developer who wants to execute his/her tests on a particular browser should use that particular implementation of WebDriver. This gives the test scripts a better handle on the browser because these WebDriver implementations speak to the browsers natively, thus increasing the robustness of the test scripts. Having better APIs WebDriver comes with a better set of APIs meeting the expectations of most developers by being closer to the object-oriented programming in terms of its implementation. Testing mobile apps Using WebDriver's mobile-specific implementations, such as IPhoneDriver and AndroidDriver, developers can actually generate test scripts that can execute their mobile applications on simulators/emulators and actual devices. Selenium RC doesn't support mobile application testing. Having developer support and advanced functionalities WebDriver is being actively developed over a period of time, and you can see many advanced interactions with the web as well as mobile applications, such as File Handling, Touch APIs, and so on. The API set of it is getting bigger and bigger with lots of features, which were never thought about in Selenium RC. Definitely, it is the future! [ 14 ] Chapter 1 Setting up a project in Eclipse Now, let's set up our project in Eclipse and write our first piece of code to use WebDriver and navigate to a web page. Please follow the sequence of the following steps to create an Eclipse WebDriver project: 1. Open Eclipse from the directory you have installed it in earlier. Navigate to File | New | Java Project. 2. A New Java Project dialog appears, as shown in the following screenshot. Enter the project name of your choice, leave the rest to default, and click Next. [ 15 ] Introducing WebDriver and WebElements 3. In the next screen, go to the Libraries tab, click on the Add External JARs… button, and select selenium-java-2.33.0.jar and selenium-java-2.33.0srcs.jar files from the downloaded location of Selenium WebDriver. [ 16 ] Chapter 1 4. Click on the Add External JARs… button and add all the jars available under the libs folder of the Selenium WebDriver directory(). Now the Libraries section should look like this: 5. Click on Finish. [ 17 ] Introducing WebDriver and WebElements 6. Now, let's create our first class that uses WebDriver to navigate to a web page. In the project explorer window of Eclipse, right-click and navigate to src | New | Class, enter the details of the class name and package name, as shown in the following screenshot, and then click on Finish: 7. The first piece of code to invoke WebDriver and navigate to a URL is as follows: package com.packt.webdriver.chapter1; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class NavigateToAUrl { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); } } [ 18 ] Chapter 1 Downloading the example code You can download the example code files for all Packt books you have purchased from your account at http://www. packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you. Lets look at each line of code. Line 1 is the name of the package in which your class file is going to reside, lines 2 and 3 import necessary WebDriver classes that we are going to explore, line 4 is the class declaration, and line 5 is the start of the main method. Now, coming to the important part of the code: WebDriver driver = new FirefoxDriver(); Line 6 is where we instantiate the Firefox implementation of the WebDriver interface. WebDriver is an interface whose concrete implementation is done in two classes: RemoteWebDriver and HtmlUnitDriver. We will talk about the RemoteWebDriver and HtmlUnitDriver classes more in depth later in this book, but right now knowing them as implementations of the WebDriver interface is sufficient. FirefoxDriver is a subclass of the RemoteWebDriver class, which extends the RemoteWebDriver class more specifically for the Firefox browser. Similarly, we have the InternetExplorerDriver, ChromeDriver, SafariDriver, AndroidDriver, and IPhoneDriver classes, which are specific implementations for the respective browsers and devices. The following figure shows the hierarchy of the classes: WebDriver RemoteWebDriver FirefoxDriver InternetExplorerDriver SafariDriver ChromeDriver AndroidDriver IPhoneDriver Let's now look at the last line of the code: driver.get("http://www.google.com"); [ 19 ] HtmlUnitDriver Introducing WebDriver and WebElements In the preceding code, we use one of the methods of the WebDriver interface called the get() method to make the browser load the requested web page on it. If the browser, in this case Firefox, is not already opened, it will launch a new browser window. 8. Now, execute your code by navigating to Run | Run or using the Ctrl + F11 shortcut. A Firefox browser should open and load the Google Search page in your browser. WebElements A web page is comprised of many different HTML elements, such as buttons, links, a body, labels, forms, and so on, that are named WebElements in the context of WebDriver. Together, these elements on a web page will achieve the business functionality. For example, let's look at the HTML code of the login page of a website.Forgot Password ? In the preceding HTML code, there are different types of WebElements such as , ,