module Tapestry::Locator
Private Instance Methods
This method is what actually calls the browser instance to find an element. If there is an element definition like this:
text_field :username, id: 'username'
This will become the following:
browser.text_field(id: 'username')
Note that the `to_subtype` method is called, which allows for the generic `element` to be expressed as the type of element, as opposed to `text_field` or `select_list`. For example, an `element` may be defined like this:
element :enable, id: 'enableForm'
Which means it would look like this:
Watir::HTMLElement:0x1c8c9 selector={:id=>"enableForm"}
Whereas getting the subtype would give you:
Watir::CheckBox:0x12f8b elector={element: (webdriver element)}
Which is what you would get if the element definition were this:
checkbox :enable, id: 'enableForm'
Using the subtype does get tricky for scripts that require the built-in sychronization aspects and wait states of Watir
.
The approach being used in this method is necessary to allow actions like `set`, which are not available on `element`, even though other actions, like `click`, are. But if you use `element` for your element definitions, and your script requires a series of actions where elements may be delayed in appearing, you'll get an “unable to locate element” message, along with a Watir::Exception::UnknownObjectException.
# File lib/tapestry/element.rb, line 225 def access_element(element, locators, _qualifiers) if element == "element".to_sym @browser.element(locators).to_subtype else @browser.__send__(element, locators) end rescue Watir::Exception::UnknownObjectException return false if caller_locations.any? do |str| str.to_s.match?("ready_validations_pass?") end raise end