-
Book Overview & Buying
-
Table Of Contents
-
Feedback & Rating

Selenium Design Patterns and Best Practices
By :

Let's look at the commands we just learned in the IDE and Selenese and how they translate into the Ruby language. In the case of Ruby, we will only look at the key commands and how they translate from Selenese into Ruby. The goal of this exercise is to take away some of the intimidation factor of moving to a programming language for someone who may never have seen software code before.
To start, let's look back at the HTML table that is the Selenese output:
The first line in this table is the name of the test, which happens to be search_test
.
The second item, shown in the preceding screenshot is the open command to the root (/
) of the base domain URL. So, the browser will navigate to this exact address http://awful-valentine.com/.
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.
In Ruby, the open
command translates into a very straightforward get
method call. The code looks like this:
selenium.get("http://awful-valentine.com/")
Note that we didn't have to use base URL like we did with Selenese. WebDriver talks directly to the web browser, not through JavaScript; this eliminates XSS limitations, and you can test as many websites as you want in a single test run.
Once the browser navigates to the website we want, it needs to locate the search field and input the search term. In the search_test
table, it is in the third line:
Since this is a complex multistep action, let's break it down into smaller chunks:
find_element
method by passing it the HTML ID of the text field (searchInput
), and then store the element in the element variable:element = selenium.find_element(:id, "searchInput")
element
variable, we will type the cheese
string into it by using the send_keys
method:element.send_keys("cheese")
element
variable to store the reference to the text field, and then applied some typing action on that variable.selenium.find_element(:id, "searchInput").send_keys("cheese")
Method chaining is a common type of syntax that allows the programmer to invoke multiple method calls without using intermittent variables. Each method call in the chain returns an object that answers to the next method call in the chain. We will go deeper into object-oriented programming in the The Page Objects pattern section of Chapter 7, The Page Objects Pattern.
The last action our test performs is clicking on the search submit button. In the Selenese table, it is the fourth row of our test:
click
command to it:selenium.find_element(:id, "searchsubmit").click
The clickAndWait
command translates to a simple click
method call in Ruby.
Notice that with Selenium WebDriver, the wait for page to load part of the clickAndWait
command is implicit. As of Selenium 2, when navigating from page to page, Selenium will automatically wait for the new page to finish loading. This, however, does not apply for any AJAX requests to finish. We will discuss AJAX waits in Chapter 5, Stabilizing the Tests.
Change the font size
Change margin width
Change background colour