/usr/lib/ruby/vendor_ruby/capybara/node/finders.rb is in ruby-capybara 2.2.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | module Capybara
module Node
module Finders
##
#
# Find an {Capybara::Element} based on the given arguments. +find+ will raise an error if the element
# is not found.
#
# If the driver is capable of executing JavaScript, +find+ will wait for a set amount of time
# and continuously retry finding the element until either the element is found or the time
# expires. The length of time +find+ will wait is controlled through {Capybara.default_wait_time}
# and defaults to 2 seconds.
#
# +find+ takes the same options as +all+.
#
# page.find('#foo').find('.bar')
# page.find(:xpath, '//div[contains(., "bar")]')
# page.find('li', :text => 'Quox').click_link('Delete')
#
# @param (see Capybara::Node::Finders#all)
# @option options [Boolean] match The matching strategy to use.
# @option options [false, Numeric] wait How long to wait for the element to appear.
#
# @return [Capybara::Element] The found element
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
#
def find(*args)
query = Capybara::Query.new(*args)
synchronize(query.wait) do
if query.match == :smart or query.match == :prefer_exact
result = resolve_query(query, true)
result = resolve_query(query, false) if result.size == 0 and not query.exact?
else
result = resolve_query(query)
end
if query.match == :one or query.match == :smart and result.size > 1
raise Capybara::Ambiguous.new("Ambiguous match, found #{result.size} elements matching #{query.description}")
end
if result.size == 0
raise Capybara::ElementNotFound.new("Unable to find #{query.description}")
end
result.first
end.tap(&:allow_reload!)
end
##
#
# Find a form field on the page. The field can be found by its name, id or label text.
#
# @param [String] locator Which field to find
# @return [Capybara::Element] The found element
#
def find_field(locator, options={})
find(:field, locator, options)
end
alias_method :field_labeled, :find_field
##
#
# Find a link on the page. The link can be found by its id or text.
#
# @param [String] locator Which link to find
# @return [Capybara::Element] The found element
#
def find_link(locator, options={})
find(:link, locator, options)
end
##
#
# Find a button on the page. The button can be found by its id, name or value.
#
# @param [String] locator Which button to find
# @return [Capybara::Element] The found element
#
def find_button(locator, options={})
find(:button, locator, options)
end
##
#
# Find a element on the page, given its id.
#
# @param [String] id Which element to find
# @return [Capybara::Element] The found element
#
def find_by_id(id, options={})
find(:id, id, options)
end
##
#
# Find all elements on the page matching the given selector
# and options.
#
# Both XPath and CSS expressions are supported, but Capybara
# does not try to automatically distinguish between them. The
# following statements are equivalent:
#
# page.all(:css, 'a#person_123')
# page.all(:xpath, '//a[@id="person_123"]')
#
#
# If the type of selector is left out, Capybara uses
# {Capybara.default_selector}. It's set to :css by default.
#
# page.all("a#person_123")
#
# Capybara.default_selector = :xpath
# page.all('//a[@id="person_123"]')
#
# The set of found elements can further be restricted by specifying
# options. It's possible to select elements by their text or visibility:
#
# page.all('a', :text => 'Home')
# page.all('#menu li', :visible => true)
#
# @overload all([kind], locator, options)
# @param [:css, :xpath] kind The type of selector
# @param [String] locator The selector
# @option options [String, Regexp] text Only find elements which contain this text or match this regexp
# @option options [Boolean] visible Only find elements that are visible on the page. Setting this to false
# finds invisible _and_ visible elements.
# @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially
# @return [Capybara::Result] A collection of found elements
#
def all(*args)
resolve_query(Capybara::Query.new(*args))
end
##
#
# Find the first element on the page matching the given selector
# and options, or nil if no element matches.
#
# @overload first([kind], locator, options)
# @param [:css, :xpath] kind The type of selector
# @param [String] locator The selector
# @param [Hash] options Additional options; see {#all}
# @return [Capybara::Element] The found element or nil
#
def first(*args)
all(*args).first
end
private
def resolve_query(query, exact=nil)
synchronize do
elements = if query.selector.format==:css
base.find_css(query.css)
else
base.find_xpath(query.xpath(exact))
end.map do |node|
Capybara::Node::Element.new(session, node, self, query)
end
Capybara::Result.new(elements, query)
end
end
end
end
end
|