I have been working with watir over the last couple of days. I quickly became frustrated with numerous errors claiming that the element I wanted to perform an operation on did not exist. I found the Watir::Waiter class and started using it extensively. So extensively, that I decided to write a little monkey patch to make my life easier.
The application that I am working with performs a lot of client-side DOM manipulation. This can create instances where my script was asking Watir to perform operations on DOM objects that didn’t exist. To defend against that, every time that I called click or set or select on various DOM objects, I wrote two additional statements. One to make sure the browser had finished whatever it was working on, and one to make sure that the element I was about to interact with actually existed.
The code looked something like this.
@browser = Watir::Browser.new
@browser.goto("http://localhost")
@browser.wait
Watir::Waiter.wait_until { @browser.text_field(:name, /UserName/).exists? }
@browser.text_field(:name, /UserName/).set("Admin")
@browser.wait
Watir::Waiter.wait_until { @browser.text_field(:name, /Password/).exists? }
@browser.text_field(:name, /Password/).set("Password")
@browser.wait
Watir::Waiter.wait_until { @browser.button(:name, /Submit/).exists? }
@browser.button(:name, /Submit/).click
While that works, I got really sick of having to re-type the selector for the DOM element that I wanted to muck with. What I wanted to do was write code that looked something like this.
@browser = Watir::Browser.new
@browser.goto("http://localhost")
@browser.text_field(:name, /UserName/).wait_to_set("Admin")
@browser.text_field(:name, /Password/).wait_to_set("Password")
@browser.button(:name, /Submit/).wait_to_click
Wow. That is much more concise and easier to understand. Even a non-programmer can understand what is happening now.
To make this code actually work, I decided to write a quick monkey patch that adds a “wait_to_” alternative for every method that can be called on input elements and links. These methods call @browser.wait
, ask Watir::Waiter
to wait for the element to exist, and then call the requested method.
I called my monkey patch Watir Wait. (Get it? I crack myself up! :)) Take a peek and let me know what you think. If I get enough positive feedback, I’ll rework this into a proper patch and submit it to the Watir team for inclusion.
Tags: corgibytes