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 PDF.
Page Count: 264

DownloadSatya Avasarala-Selenium Web Driver Practical Guide-Packt Publishing (2014)
Open PDF In BrowserView 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 , ,
,

Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.6
Linearized                      : No
Create Date                     : 2014:01:20 15:55:26+05:30
Creator                         : Adobe InDesign CS6 (Windows)
Modify Date                     : 2014:06:08 17:07:13+04:00
Has XFA                         : No
Tagged PDF                      : Yes
XMP Toolkit                     : Adobe XMP Core 5.4-c005 78.147326, 2012/08/23-13:03:03
Instance ID                     : uuid:71937668-641c-4139-b5f8-7f33d27f3199
Original Document ID            : adobe:docid:indd:4992da54-27df-11de-a18e-f5498a2a904f
Document ID                     : xmp.id:EE9D1C96BB81E31197178B7C0ACD869D
Rendition Class                 : proof:pdf
Derived From Instance ID        : xmp.iid:88B20B47867FE3119751AF4DD3B25F7E
Derived From Document ID        : xmp.did:9488249FE579E311ACD7ECF289353A7A
Derived From Original Document ID: adobe:docid:indd:4992da54-27df-11de-a18e-f5498a2a904f
Derived From Rendition Class    : default
History Action                  : converted
History Parameters              : from application/x-indesign to application/pdf
History Software Agent          : Adobe InDesign CS6 (Windows)
History Changed                 : /
History When                    : 2014:01:20 15:55:26+05:30
Metadata Date                   : 2014:06:08 17:07:13+04:00
Creator Tool                    : Adobe InDesign CS6 (Windows)
Format                          : application/pdf
Producer                        : Adobe PDF Library 10.0.1
Trapped                         : False
Page Layout                     : SinglePage
Page Count                      : 264
EXIF Metadata provided by EXIF.tools

Navigation menu