Advanced Test Automation – Generate your own css locators using nokogiri
Some of the pages that I test have hundreds of check boxes. I needed a way to generate the locators to use in selenium and create classes to use those locators.
This is an example of a class that contains selenium css locators for navigation links
class Navigation def initialize * browser @location = "css=a:contains(\"Location\")" @amenities = "css=a:contains(\"Amenities\")" @photos = "css=a:contains(\"Photos\")" @contact = "css=a:contains(\"Contact\")" @further_details = "css=a:contains(\"Further Details\")" end attr_accessor :location, :amenities, :photos, :contact, :further_details end
To use this class I would new it up and use standard selenium commands. This is how I would navigate to the amenities page
navigation = Navigation.new browser.click amenities
The spec below demonstrates how to get data you need using nokogiri. I want to click an anmenity check box with the label beach whose input name is “amenity_1_1_6”. I could click this checkbox with this command browser.click “amenity_1_1_6”, but I want to have a way to store all of the amenities on the page with the variable named by their label.
require "spec" require "nokogiri" describe "Find elements to use as locators in a web test" do it "should find the value of name for the input element and the text in span" do sample_html = '' attribute_name="" attribute_value="" doc = Nokogiri::HTML(sample_html) doc.css("label").each do |check_box| attribute_name = check_box.text attribute_value = check_box.children.css("input")[0]["name"] attribute_name = attribute_name.strip attribute_name = attribute_name.to_s.downcase end attribute_name.should=="beach" attribute_value.should=="amenity_1_1_6" end end
To take this further I can print the contents of my class file to generate my locators from this spec.
puts "@#{attribute_name} = \"#{attribute_value}\""