- Table of Contents
- Getting Started
- Locators
- Click Pend JS/DOM Ready
- Forms
- Images
- Checkboxes
- Radio Buttons
- Select Boxes
- Tables
- Executing JavaScript code on the page. Handling popup dialogs.
- Frames
- Test/Unit
- Test Suite
- Notes
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<body bgcolor="antiquewhite">
<img src="images/freebsd_daemon.jpg">
<h2>
Version 1.0</h2><h1>
Test Automation Training</h1><h3>
Testing Web Applications with Ruby and Selenium WebDriver</h3></body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page1"
# Timeout = 15 sec
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Find text on the page by regexp
puts "Test Passed: Page 1 Validated" if wait.until {
/Testing Web Applications with Ruby and Selenium WebDriver/.match(browser.page_source)
}
browser.quit
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<body bgcolor="antiquewhite">
<img src="images/freebsd_daemon.jpg">
<h2>
Version 1.0</h2><h1>
Test Automation Training</h1><h3>
Testing Web Applications with Ruby and Selenium WebDriver</h3></body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page1"
# Timeout = 15 sec
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Find text on the page by regexp
puts "Test Passed: Page 1 Validated" if wait.until {
/Testing Web Applications with Ruby and Selenium WebDriver/.match(browser.page_source)
}
browser.quit
driver.findElement(By.name("submit")).sendKeys(Keys.Return);
or
driver.findElement(By.name("submit")).sendKeys(Keys.Enter);
private void TryClick(By selector)
{
var wait = WaitUpTo(TimeSpan.FromSeconds(10));
var element = wait.Until(ExpectedConditions.ElementIsVisible((selector)));
//really important bit!
WaitUpTo(TimeSpan.FromSeconds(5))
.Until(d => element.Enabled);
element.Click();
}
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<body bgcolor="antiquewhite">
<img src="images/freebsd_daemon.jpg">
<h2>
Version 1.0</h2>
<h1>
Test Automation Training</h1><h3>
Testing Web Applications with Ruby and Selenium WebDriver</h3><p>
Enter something interesting in the text box and click a button!</p><form name="input" action="page1.html" method="post">
<p>
<input type="text" name="searchbox"></p><p>
<input type="submit" name="submit" value="submit"></p></form></body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page3"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Add text to a text box
input = wait.until {
element = browser.find_element(:name, "searchbox")
element if element.displayed?
}
input.send_keys("Information")
# Check that the form exists
form = wait.until {
element = browser.find_element(:name, "input")
element if element.displayed?
}
puts "Test Passed: Form input found" if form.displayed?
# Click the button based the form it is in (you can also call 'submit' method)
form.find_element(:name, "submit").click
browser.quit
<html>
<head>
<title>Images</title>
</head>
<body bgcolor="lightsteelblue">
<img src="images/freebsd_daemon.jpg">
<h2>Version 1.0</h2>
<h1>We are testing images...</h1><h3>Testing Web Applications with Ruby and Selenium WebDriver</h3>
<img name="watergraphic" src="images/WaterFaucet.jpg" alt="Image of water faucet"/>
<a href="page1.html"><img alt="Image Button" src="images/totoro.gif"/></a>
</body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page4"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Check that the image exists using different attributes and xpath
puts "Test Passed: Found a graphic with the path 'images/WaterFaucet.jpg' in the source filename" if wait.until {
browser.find_element(:xpath => "//img[@src='images/WaterFaucet.jpg']").displayed?
}
puts "Test Passed: Found a graphic with the name watergraphic" if wait.until {
browser.find_element(:name, "watergraphic").displayed?
}
puts "Test Passed: Found a graphic with 'Image of water faucet' as alt text" if wait.until {
browser.find_element(:xpath => "//img[@alt='Image of water faucet']").displayed?
}
# Click the image button
image = wait.until {
element = browser.find_element(:xpath => "//img[@src='images/totoro.gif']")
element if element.displayed?
}
image.click
# Check the text on the new page
puts "Test Passed: Page 1 Validated" if wait.until {
/Test Automation Training/.match(browser.page_source)
}
browser.quit
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<body bgcolor="cadetblue">
<img src="images/freebsd_daemon.jpg">
<h2>Version 1.0</h2>
<h1>Test Automation Training</h1><h3>Testing Web Applications with Ruby and Selenium WebDriver</h3>
<form action="page1" method="post">
<p><Input type="checkbox" name="checkthebox"></p> <p><Input type="submit" value="submit"></p></form>
</body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page5"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
cb = browser.find_element(:name, "checkthebox")
# Check that the checkbox exists
cb = wait.until {
element = browser.find_element(:name, "checkthebox")
element if element.displayed?
}
puts "Test Passed: The check box exists" if cb
# Check the checkbox
cb.click
# Verify the state of checkbox
puts "Test Passed: The check box is selected now" if cb.selected? == true
sleep 2
# Un-Check the checkbox
cb.click
# Verify the state of checkbox again
puts "Test Passed: The check box is unselected now" if cb.selected? == false
browser.quit
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<body bgcolor="antiquewhite"">
<img src="images/freebsd_daemon.jpg">
<h2>Version 1.0</h2>
<h1>Test Automation Training</h1><h3>Testing Web Applications with Ruby and Selenium WebDriver</h3>
<form action="page1" method="post">
<p>Option 1<Input type="radio" name="radiobutton1"></p> <p>Option 2<Input type="radio" name="radiobutton2"></p> <p>Option 3<Input type="radio" name="radiobutton3"></p> <p><input type="submit" value="submit"></p></form>
</body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page6"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
#### Check that the radio button exists
puts "Test Passed: Radio button found" if wait.until {
browser.find_element(:name, "radiobutton1").displayed?
}
#### Change the state of the Radio Buttons
cb1 = wait.until {
element = browser.find_element(:name, "radiobutton1")
element if element.displayed?
}
cb1.click if cb1.selected? == false
cb3 = wait.until {
element = browser.find_element(:name, "radiobutton3")
element if element.displayed?
}
cb3.click if cb3.selected? == false
browser.quit
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<img src="images/freebsd_daemon.jpg">
<h2>Version 1.0</h2><h1>Test Automation Training</h1><h3>Testing select boxes</h3>
<form action="page1" method="post">
<select name="dropdown" multiple="multiple" size="2">
<option value="1">Volvo</option>
<option value="2">Saab</option>
<option value="3">Mercedes</option>
<option value="4">Audi</option>
</select>
<p><Input type="submit" value="submit"></p></form>
</body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page7"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
#### Interact with the drop down box
select_list = wait.until {
element = browser.find_element(:name, "dropdown")
element if element.displayed?
}
select_list.clear
#### Extract all options from the select box
options=select_list.find_elements(:tag_name => "option")
#### Select the option "Volvo"
options.each do |g|
if g.text == "Volvo"
g.click
break
end
end
#### Select another option "Audi"
options.each do |g|
if g.text == "Audi"
g.click
break
end
end
#### Print currently selected options
options.each do |g|
if g.selected?
puts g.text
end
end
browser.quit
<html>
<head>
<title>Testing with Ruby and Selenium WebDriver</title>
</head>
<img src="images/freebsd_daemon.jpg">
<h2>Version 1.0</h2><h1>Test Automation Training</h1><h3>Testing tables</h3>
<table id="booktable" border="1">
<tr>
<td>fraise</td>
<td>orange</td>
</tr>
<tr>
<td>vin</td>
<td>eau</td>
</tr>
</table>
</body>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page8"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
#### Check that the table with the given id is displayed
table = wait.until {
element = browser.find_element(:id, "booktable")
element if element.displayed?
}
puts "Test Passed: Book Table found" if table
#### Print full table contents
puts "Table with id=booktable:\n" + table.text
#### Iterate through all cells of the table
browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr/td").each do |r|
puts "Cell Value: " + r.text
end
#### Print the value from the 1'st column of the 2'nd row of the table
puts "Value from the 1'st column of the 2'nd row of the table: " + browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[1].text.split(' ')[0]
#### Print the value from the 2'nd column of the 1'st row of the table
puts "Value from the 2'nd column of the 1'st row of the table: " + browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[0].text.split(' ')[1]
browser.quit
<script type="text/javascript">
function enter_name()
{
var name=prompt("Please enter your name","Artem");
if (name!=null && name!="")
{
document.write("Hello " + name + "! How are you today?");
window.stop();
}
}
function enter_age()
{
var age=prompt("Please enter your age","27");
if (age!=null && age!="")
{
document.write("You are " + age + " years old.");
window.stop();
}
}
</script>
<input type="button" onclick="enter_name()" value="Name">
<p><input type="button" onclick="enter_age()" value="Age">
</p>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page9"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Execute 1st JavaScript function on the page and Cancel the prompt box
browser.execute_script("enter_name()")
a = browser.switch_to.alert
if a.text == 'Please enter your name'
a.dismiss
else
a.accept
end
# Execute 2nd JavaScript function on the page and Accept the prompt box
browser.execute_script("enter_age()")
a = browser.switch_to.alert
if a.text == 'Please enter your name'
a.dismiss
else
a.send_keys("99")
a.accept
end
# Find the age on the page by regexp
puts "Test Passed: Page 9 Validated" if wait.until {
/99/.match(browser.page_source)
}
browser.get "http://localhost/page9"
# Execute any custom JavaScript code
puts browser.execute_script("return window.location.pathname")
browser.quit
<html>
<frameset cols="25%,50%,25%">
<frame id="frame1" src="http://www.debian.org" />
<frame id="frame2" src="http://www.kernel.org" />
<frame id="frame3" src="http://www.ubuntu.com" />
</frameset>
</html>
require 'rubygems'
require 'selenium-webdriver'
browser = Selenium::WebDriver.for :firefox
browser.get "http://localhost/page10"
wait = Selenium::WebDriver::Wait.new(:timeout => 15)
# Switch to the 1st frame
browser.switch_to.frame("frame1")
# Find text in the 1st frame by regexp
puts "Test Passed: Frame 1 Validated" if wait.until {
/An operating system is the set of basic programs and utilities that make
your computer run/.match(browser.page_source)
}
# Switch to parent page
browser.switch_to.default_content
# Switch to the 2nd frame
browser.switch_to.frame("frame2")
# Find text in the 2nd frame by regexp
puts "Test Passed: Frame 2 Validated" if wait.until {
/Welcome to the Linux Kernel Archives/.match(browser.page_source)
}
# Switch to parent page
browser.switch_to.default_content
# Switch to the 3rd frame
browser.switch_to.frame("frame3")
# Find text in the 3rd frame by regexp
puts "Test Passed: Frame 3 Validated" if wait.until {
/Ubuntu is, and always will be, absolutely free/.match(browser.page_source)
}
browser.quit
require 'rubygems'
require 'selenium-webdriver'
require 'test/unit'
class ExampleTestCase < Test::Unit::TestCase
#### Starting browser before each test
def setup
@browser = Selenium::WebDriver.for :firefox
@browser.get "http://localhost/page8"
@wait = Selenium::WebDriver::Wait.new(:timeout => 15)
end
#### Closing browser after each test
def teardown
@browser.quit
end
#### Check that the table is there
def test_table_existence
assert @wait.until {
@browser.find_element(:id, "booktable").displayed?
}
end
#### Checking values in the table cells
def test_table_values
##### Waiting for the values to appear
assert @wait.until {
@browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[0].text.split(' ')[0] == "fraise"
}
assert @wait.until {
@browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[0].text.split(' ')[1] == "orange"
}
##### Not waiting for the values to appear, assuming they are already visible
assert_equal(@browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[1].text.split(' ')[0], "vin")
assert_equal(@browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[1].text.split(' ')[1], "eau")
assert_not_equal(@browser.find_elements(:xpath => "//table[@id='booktable']/tbody/tr")[1].text.split(' ')[0], "fake")
end
end
#### Test suite
require 'rubygems'
require 'test/unit'
#### Below you can include any number of files to your test suite
require 'example_testunit'
Random Side Note
Fixed headers with this regex:
Find: (#+)([^# ])
new: ^\s*(#+)([^# ])
Replace: $1 $2
Reference:
Selenium for Ruby is very linear, the code isn't asynchronous or event driven like the pages we're testing against (html, js, etc). This makes sense as most test cases will rely on one another. In most cases you will need to wait until something changes in the HTML/DOM rather than feed an event to be fired off once the page is ready. Often people will implicitly look for changes in the DOM, but this is not always applicable. A more explicit method if you can change the page's source code is to execute JS from Selenium and wait until a function or variable returns/contains a valid value. Even still this is frustrating that this is not event driven as it would be best to implement a hook or subscribe to an event in the JS and have it alert you when it was finished rather than implicitly polling for an expectation.
Get value of input field
@driver.find_element(:id, "some-id").attribute('value')