Watir 6.7.0 is now available on RubyGems! A bunch of new features.
To install:
gem install watiror in your Gemfile:
gem "watir", "~> 6.7"HTML5.1 and SVG2 Support
There have been some bugs and inconsistencies with these features, but they have been addressed in this release.
Watir now parses the latest official W3C HTML & SVG standards to automatically generate Element classes with their officially supported attributes.
These can be used for both element location and obtaining attribute values in a properly encapsulated fashion:
element = browser.text_field(tabindex: '1')
element.tabindex
# => 1Non-standard attributes for elements can still be located and returned with:
element = browser.div(css: "div[notstandard='foo']")
element.attribute_value('notstandard')
# => 'foo'Table Features
Working with tables can be a challenge. Often it is easy enough to get the Table cell you need, but have to interact with elements in relation to it. Here are two useful ways to make this easier:
# Get the title of the first row for the located cell
cell_name = browser.td(text: "John Smith")
cell_name.column_header
# => "Full Name"
# Interact with a sibling cell based on the header
cell_name.sibling_from_header(text: "Opted In").checkbox.clickIterating with Elements
Some elements can in some respects be considered Collections.
OListandUListeach effectively have a collection ofLITableeffectively has a collection ofTableRowTableRoweffectively has a collection ofTableCell
Now you can iterate over them as if they were a collection like:
browser.ol(id: 'countries').each(&:text)
# => ['USA', 'Canada', 'France']Siblings
Element#siblings returns an HTMLCollection of all of the elements that are
direct children of the calling element’s parent. Note that the element
calling this method is included in the results. As with all adjacent methods,
this method accepts a hash that will filter the results by any valid Watir locator.
Original Window
We can have long debates about this, and you are free to disagree, but I am not a fan of using Ruby blocks when they are merely used to manage a simple order of code execution (as opposed to using it to reference variables not defined until the context of the calling method).
To switch to a window, take an action, and return to the original window you can currently:
browser.window(title: 'Foo').use do |browser|
do_the_things
end
# or
original_window = browser.window.handle
browser.window(title: 'Foo').use
do_the_things
browser.window(handle: original_window).useWith this update you can now use a second window procedurally without having to explicitly store a variable:
browser.window(title: 'Foo').use
do_the_things
browser.original_window.useStealing From the Page Object Gem
While going through Cheezy’s updated Page Object gem, I found a number of
features that deserve be included directly in Watir. If you already
use page-object.gem, you likely won’t see anything new from this.
Checkbox#set,#set?, and#clearcan now be handled with#check,#checked?and#uncheckrespectivelyElement#attribute_valuecan now be accessed withElement#attribute(also like Selenium)- Added support for
Element#scroll_into_view,#location,#size,#height,#widthand#center/#centre Radio#setand#setcan now be handled with#selectand#selected?respectively
See the Changelog for the complete history of updates.