Introduction to Watir


What is WATIR?

y Web Application Testing In Ruby y It is a library for the Ruby language which drives Internet Explorer the

same way people do;  clicks links,  fills in forms,  and presses buttons. y Watir can also check results, such as whether expected text appears on the page. y It can be used to test all types of web applications (ASP.Net, JSP, PHP, Rails, etc«) y Open Source ± written by Bret Pettichord, Paul Rogers and many other contributors.

What WATIR is not«

y Watir is not a record/playback tool.

However, there are several recorders ³out there´ Ù WatirMaker Ù Watir WebRecorder Ù Webmetrics RIA Script Recorder (most recent discussion«they are considering open sourcing their application) y Watir is not a link checker  However, you can easily write your own link checker and customize it to your specific needs. y Watir is not a test case management tool.  However, you can write one in Ruby if desired. y Doesn¶t test Flash or Applets. 

What is Ruby?

y Full featured Object Oriented scripting language o Made ³famous´ for it¶s web application framework Rails. (Ruby on Rails) y Interpreted rather than compiled y Written by Matz (Yukihiro Matsumoto)  Started in 1994 y Written in C  Will work on any platform that has a C compiler
Windows Ù Linux

How does Watir work?

y Uses the COM interface of Internet Explorer (IE)  a.k.a ActiveX or OLE y Allows an external program to control IE  Similar interfaces exist for Word, Excel, PowerPoint and Outlook. y Full access to the contents of an HTML page y Provides different ways to access objects

.The BIG question: Why Watir You don¶t need to be a professional developer to program your watir scripts. And yet«You are learning a robust programming language ± not just another tool.

read data files. and pretty much anything else you can think of«) y No ³Vendor-script´ y It¶s simple ± elegant ± INTUITIVE y It has a supportive online community for when you get µstuck¶.Why Watir cont« y As a testing tool: It¶s as robust & sophisticated as µprofessional¶ tools such as Rational. . (You have the power to connect to databases. Mercury & Segue. y As a library of a programming language [Ruby ] : It¶s powerful. structure your code into reusable libraries. export XML.

org/frs/?group_id=167 2nd: Install Watir: c:\>gem install watir ‡ Packaged as a gem.aspx?FamilyID=e59c3964-672d-4511-bb3e2d5e1db91038&DisplayLang=en .microsoft. ‡ http://rubyforge. ‡ Gem = A Ruby library that can be installed over the internet. ‡ Current Watir gem version contains Watir .Setting up WATIR 1st: Download and install Ruby.5.[2] ‡ To install SIMPLY type: gem install watir 3rd: Download and install Internet Explorer Toolbar ‡ http://www.

Learning WATIR: Getting Started As you start to get into Ruby/Watir you¶ll want some Good information at your fingertips! Introductory Documentation: 1.rubyforge.rubyforge. Watir User Guide: .pragprog. Scripting 101 Tutorial: http://wtr. Everyday Scripting with Ruby: for 2. Watir homepage: http://wtr. Programming Ruby (Online Book): http://www. 3. and You: Books: 2.

com/coop/cse?cx=0072670897253 85613265%3Agmydx5gtw6u ³The Guts´ Documentation: Methods Suported by Element Reference: 2.ruby-doc.Learning WATIR: More In-Depth« Forums: 1. Ruby Rdoc: Watir General Forum (now on Google Groups): http://groups.rubyforge. Watir Search (web interface that searches 7 Watir sites): http://www.html ted+by+element 3. Online Ruby Information: .

$199) (Add-on to VS.sapphiresteel.Development Environments (IDE¶s) for Ruby y Use any text editor as an IDE:     ScITE (Free) Ù Included with your ruby download. Notepad (Free) Eclipse (using RDT Plugin) Ù http://www.Net ) Ù  Komodo IDE ($295) / Komodo Edit (Free) Ù .com Ruby In Steel (Free .sourceforge.

Page") irb(main):003:0> ie.show_all_objects My .attach(:title. Use it to:   Attach to IE windows and quickly identify browser objects Run quick experiments to see if things will work in your tests y y y irb(main):001:0> require watir irb(main):002:0> ie = Watir::IE.Using Ruby¶s Interactive Command Interpreter (IRB) What is it?   Irb = Interactive RuBy It evaluates Ruby expressions from the terminal.

Demo: Using IRB Demo: Show_all_objects .

Let¶s get started« It¶s time to turn on the watir! .

close .godaddy. #----------------------------------------#Includes require µwatir¶ include Watir #Declare Variables url = ³http://www.Basic Anatomy of a Watir Script #----------------------------------------#All scripts should use comments #where needed.start(url) #Print results to the screen Puts ³Begin Test: GoDaddy´ #Logical Code / Body of Script if´ #Open the IE Browser browser = Watir::IE.contains_text(³Domain Name Search´) then puts ³Test PASSED´ else puts ³Test FAILED´ #Close the IE Browser (clean up) puts ³End Test: GoDaddy´ browser.

godaddy.start( browser. navigate and ³probe´ the IE browser window browser = Watir::IE.attach( browser = http://www.close browser.maximize .The Watir::IE Class y This is the heart and soul of Watir (from the users point of view) y Contains all the methods needed to browser.

y Reference the Watir API using the ³require´ keyword and start coding require watir include Watir browser = ) .Use Watir y Using the Watir API is very easy.start(

Demo: Basic GoDaddy Script Demo: Basic GoDaddy Script .

frames. y Watir scripts need to access these objects & manipulate them just as a user would.  Clicking. tables. typing. etc« . selecting. submitting.Web Pages are all about OBJECTS y Web pages are developed with objects:  Links. drop-down boxes. forms. etc. buttons.

How do I identify objects? ³View Source´ Small Scripts Use IRB IE Developer Toolbar .

View Source y ³View Source´ on any page by rightclicking with your mouse on web page: .

godaddy. .com and flashed the first two links ± one at a time. In the example below.Use IRB IRB can be used to identify objects on the page. I launched http://www.

tables.bring_to_front $ie. Tables that are nested will be included .godaddy.to_s $ie.length #iterate through all the tables on the page #goto the first table on the page #show how many tables are on the page.Small Scripts         Require watir url = $ie = Watir::IE.tables[1].to_s} $ie.each { |t| puts t.tables.start(url) $ie.

IE Developer Tool y A tool for exploring and understanding web pages. y Locates and selects specific elements on a web page by clicking on the objects in your page. y Gives a tree view of objects .

Demo: IE Developer Toolbar Demo: IE Developer Toolbar .

Manipulating Objects y Now that you know how to identify objects« y The next step is how to ³Manipulate´ objects« .

³ -OR‡ browser. ³GoDaddy´).link( Web Page Objects: Link Web browser view: ‡ GoDaddy Watir code: ‡>GoDaddy</a> .link( HTML source: ‡ <a href=´).

clear HTML source: ‡ <input type = ³checkbox´ name = ³checkme´ value = ³1´> . ³checkme´). ³checkme´).checkbox(:name.set -OR‡ browser.Manipulating Web Page Objects: Checkbox Web browser view: ‡ Check Me: Watir code: ‡ browser.checkbox(:name.

Manipulating Web Page Objects: Radio Buttons Web browser view: ‡ Click Me: Watir code: ‡ browser.set -OR‡ HTML source: ‡ <input type = ³radio´ name = ³clickme´ id = ³1´> .radio(:name. ³clickme´). ³clickme´).

select(³is fun´) HTML source: ‡ <select name = "selectme" > <option name=1> <option name=2>Web Testing <option name=3>in Ruby <option name=4>is fun </select> .Manipulating Web Page Objects: Selection Boxes Web browser view: ‡ Watir code: ‡ browser. ³selectme´).select_list(:name.

³typeinme´).clear d´) -OR- HTML s urce: ‡ <input type = "text" name = "typeinme" > .set(³Life is g ser.Manipulating Web Page Objects: Text Fields Web br ‡ ser ie : Watir c de: ‡ br ‡ br ser.text_field(:name. ³typeinme´).text_field(:name.

click HTML source: ‡ <input type = "button" name = "clickme" value = "Click Me"> .button(:value.Manipulating Web Page Objects: Buttons Web browser view: ‡ Watir code: ‡ browser. "Click Me").

³ [unique identifier]´ . [method] (: [element] .click [Variable] .button(:value. [method] .A Closer Look«at the structure browser. "Click Me").

[method] (: [element] . [method] . ³ [unique identifier]´ .click [Variable] .An Even Closer Look« browser.button(:value. "Click Me").

³xxx´).button(:text.button(:value.button( browser. ³xxx´). ³//img[@src=µxxx¶]/input ´).click :caption :index :class :xpath . ³xxx´).button(:class.button( :text browser.button(:id. x).click browser. ³xxx´).click :value browser. ³xxx´).button( :name browser.button(:name. ³xxx´).Element Options for BUTTON :id browser.

as a watir scripter can only use 1 element ± maybe 2 to describe your desired object. y And you. .8 elements! ±But I only need one« y Even though there are 8 possible elements the user has to identify a button« y A developer might only use 1 ± 3 elements in his code.

Using multiple identifiers browser. :index => 3).click . watir will access the first button with the text: ³Click Here´.link(:text. Using the above y Suppose you had 3 buttons on your web page all with the text: ³Click Here´. Click Here ). What if you wanted the 3rd? y You can use multiple identifiers on some methods: => Click Here .

openqa.Supported methods by element Chart obtained from: .

Method Examples .

Test Automation is MORE than Identifying objects y Identifying objects is currently the most time consuming part of creating your test scripts« y However. . «This is the most sophisticated part of your scripts. after your objects have been identified & manipulated: you want to ³Test´ them! y You¶ll want to create ³PASS´ or ³FAIL´ scenarios.

  assert( . To use Test::Unit in your scripts you µrequire¶ it just as you do watir require µtest/unit¶ require µwatir¶ y Test::Unit is a way to organize your code into ³tests´ y Test::Unit has built in methods called ³assertions´ that help your tests with validation.exists?) The above statement will return a TRUE or FALSE indicating a pass or fail in your test.Test::Unit y Test::Unit is a library of Ruby (just like Watir)     It is not technically part of Watir«however it is used regularly to structure tests. ³Click Here´).

exists?) end end .Test::Unit ± Basic Code Structure require 'test/unit class TC_MyTest < Test::Unit::TestCase include Watir def setup end def teardown end #optional #optional #optional #optional def test_pass assert(something.

onlinephotofiler.onlinephotofiler.aspx"> expected to be =~ </app. 1) Failure: test_smokeTest(TC_manage_accounts) [opf_smoketest. 1\/GalleryThumbnails/>. 0 errors >Exit code: 0 . 1 seconds.rb:35:in `create_gallery' opf_smoketest. 1 tests.rb:398:in `test_smokeTest']: <"http://app.rb Loaded suite opf_smoketest Started F Finished in 51.Test::Unit±A Failure Returns results such as these: >ruby opf_smoketest.

Create Permalinks 12. PhotoStore Make Purchase Finished in 225.701 seconds. Create Gallery 02. Reorder Galleries 08. 1 tests.Test::Unit±A Pass Returns results such as these: Loaded suite opf_smoketest Started 01. Save Badge 06. Add Photos 03. Edit Tags 10. Reorder Images 09. 0 errors >Exit code: 0 - PASS PASS PASS PASS PASS PASS PASS PASS PASS PASS PASS PASS . 29 assertions. Edit Photos 04. Create Badge 05. Edit Title & Description 11. 0 failures. Version Number 07.

Test::Unit Assertions .

How Test::Unit executes your tests. (Every methods starting with µtest¶. It¶s important to understand that Test::Unit will execute your methods in alphabetical/numerical order! Also. . the setup and teardown methods will wrap around every test.

How Test::Unit executes your tests. If you have the following methods in a testcase using test::unit def setup def teardown def test_01 def test_02 def test_03 They will execute in this order (every test method is wrapped with the µsetup¶ and µteardown¶ methods) def setup def test_01 def teardown def setup def test_02 def teardown def setup def test_03 def teardown .

How Test::Unit executes your tests. Setup your tests like this: def setup def teardown def 01 def 02 def 03 #notice these methods no longer start with test def test_all_methods_within_one_launch_of_the_browser_and_in_this_order 01 02 03 (Compare this structure with the one on the previous page) . To write your testcases such that you are not launching your IE browser 66x or 180x try this: 1. Use less µtest´ methods and more assertions within your methods -OR2.

Windows Pop-Ups y Sometimes when a user is using a web page a pop-up window will appear. These require special attention in watir. y Pop-Up examples:        Security Alerts Choose File pop-ups Save As Login (username/password) panels Alert boxes Script prompt/textbox Confirmation Boxes (ok/cancel) .

button(:text. ³Click Me´). ³Click Me´).attach´ method: #create a new browser instance & attach to it.Windows Pop-Ups ± Part 2 browser.attach(:url. photostore_browser = Watir::IE.click_no_wait sleep 3 #Use the sleep method with any value you change to: browser. ³. /PhotoStore/) -ORUse AutoIt to manipulate windows controls .button(:text.

autoit. "1_gardengnome.ControlSetText("Choose file". ''.AutoIt y AutoIt is a scripting language designed for automating the Windows GUI y Bundled with Watir now (you don¶t have to µrequire¶ it) y y y y y y y y y $browser.autoit. "". "&Open") #------------------------------------------------------------------------------------- .click_no_wait sleep 2 #------------------------------------------------------------------------------------#AutoIt Watir.ControlClick("Choose file". 1148.WinWaitActive("Choose file". "". "ctl00_NonGalleryContent_Uploader1_FileUpload1").jpg") Watir. 3) Watir.autoit.file_field(:id.

com/autoit3/ y AutoIt3 has an information tool (similar to the IE dev toolbar) that can help you identify windows nloads.autoitscript.shtml . y AutoIt3 Download: http://www. Download the full AutoIt3 program to access this tool.AutoIt3 Bonus! y To Read up on AutoIt3 & learn commands go here: http://www.

Demo: OPF ± Smoke Test Script Demo: GoDaddy¶s ± Online Photo Filer: SmokeTest .

test.to_s) assert($browser.onlinephotofilercom.close end .text_field(:id.1. "#{$gallery_name}").url.rb' class TC_manage_accounts < Test::Unit::TestCase #includes include Watir include Mod_navigate_to_OPF_test #variables $gallery_name = "Auto Gallery 17" $version_number = "Version GalleryThumbnails.div(:text. "ctl00_NonGalleryContent_MyPhotoGallery_mtbTitle_tbText"). "ctl00_NonGalleryContent_lnkCreate").set( $gallery_name) $browser. $browser."ctl00_OwnerBar1_menuGalleries_1 dropdownMenuItem ctl00_OwnerBar1_menuGalleries_5").button(:id.ide\/GalleryThumbnails/.PASS") End def test_smokeTest create_gallery End end #End class: TC_manage_accounts y y y y y y y y y y def setup navigate_to_OPF_test end def teardown $ $browser.1" $storefront_url = "" $site_login = xxxx" $site_password = xxxxx" def create_gallery $ sleep 6 assert_match(/app. Create Gallery .Putting it all together« y y y y y y y y y y y y y y #requires require 'watir' require 'test/unit' require 'test/unit/testcase' require 'opf_navigate_to_opf_test.exists?) puts ("01.

Congratulations! You¶re on your way« «to programming the ruby/watir way! .

http://pettichord.alaska.dukk. http://elandingstest.aspx 11.html 10. http://wiki. http://217.pdf «and countless others I have referenced over the years. http://swik.138/presentations/javazone/2006/slides/ 6.html 5. 8. . http://del.html 7. http://wiki.rubyforge.References Used 4 Presentation« 14.openqa.rubyforge. http://blog.77. http://wtr. http://wtr.pdf 9.

Sign up to vote on this title
UsefulNot useful