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}\""