Class: Watir::ElementLocator

Inherits:
Object
  • Object
show all
Includes:
Exception
Defined in:
lib/watir-webdriver/locators/element_locator.rb

Constant Summary collapse

WD_FINDERS =
[
  :class,
  :class_name,
  :css,
  :id,
  :link,
  :link_text,
  :name,
  :partial_link_text,
  :tag_name,
  :xpath
]
WILDCARD_ATTRIBUTE =
/^(aria|data)_(.+)$/
CONVERTABLE_REGEXP =

Regular expressions that can be reliably converted to xpath ‘contains` expressions in order to optimize the locator.

%r{
  \A
  ([^\[\]\\^$.|?*+()]*) # leading literal characters
  [^|]*?                # do not try to convert expressions with alternates
  ([^\[\]\\^$.|?*+()]*) # trailing literal characters
  \z
}x

Instance Method Summary collapse

Constructor Details

#initialize(wd, selector, valid_attributes) ⇒ ElementLocator

Returns a new instance of ElementLocator.



31
32
33
34
35
# File 'lib/watir-webdriver/locators/element_locator.rb', line 31

def initialize(wd, selector, valid_attributes)
  @wd               = wd
  @selector         = selector.dup
  @valid_attributes = valid_attributes
end

Instance Method Details

#locateObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/watir-webdriver/locators/element_locator.rb', line 37

def locate
  e = by_id and return e # short-circuit if :id is given

  if @selector.size == 1
    element = find_first_by_one
  else
    element = find_first_by_multiple
  end

  # This actually only applies when finding by xpath/css - browser.text_field(:xpath, "//input[@type='radio']")
  # We don't need to validate the element if we built the xpath ourselves.
  # It is also used to alter behavior of methods locating more than one type of element
  # (e.g. text_field locates both input and textarea)
  validate_element(element) if element
rescue Selenium::WebDriver::Error::NoSuchElementError, Selenium::WebDriver::Error::StaleElementReferenceError
  nil
end

#locate_allObject



55
56
57
58
59
60
61
# File 'lib/watir-webdriver/locators/element_locator.rb', line 55

def locate_all
  if @selector.size == 1
    find_all_by_one
  else
    find_all_by_multiple
  end
end