Class: Capybara::Selector

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/capybara/selector/selector.rb,
lib/capybara/selector/css.rb,
lib/capybara/selector/filter_set.rb,
lib/capybara/selector/filters/base.rb,
lib/capybara/selector/filters/node_filter.rb,
lib/capybara/selector/filters/expression_filter.rb

Overview

## Built-in Selectors

* **:xpath** - Select elements by XPath expression
  * Locator: An XPath expression

* **:css** - Select elements by CSS selector
  * Locator: A CSS selector

* **:id** - Select element by id
  * Locator: The id of the element to match

* **:field** - Select field elements (input [not of type submit, image, or hidden], textarea, select)
  * Locator: Matches against the id, name, or placeholder
  * Filters:
    * :id (String) — Matches the id attribute
    * :name (String) — Matches the name attribute
    * :placeholder (String) — Matches the placeholder attribute
    * :type (String) — Matches the type attribute of the field or element type for 'textarea' and 'select'
    * :readonly (Boolean)
    * :with (String) — Matches the current value of the field
    * :class (String, Array<String>) — Matches the class(es) provided
    * :checked (Boolean) — Match checked fields?
    * :unchecked (Boolean) — Match unchecked fields?
    * :disabled (Boolean) — Match disabled field?
    * :multiple (Boolean) — Match fields that accept multiple values

* **:fieldset** - Select fieldset elements
  * Locator: Matches id or contents of wrapped legend
  * Filters:
    * :id (String) — Matches id attribute
    * :legend (String) — Matches contents of wrapped legend
    * :class (String, Array<String>) — Matches the class(es) provided

* **:link** - Find links ( <a> elements with an href attribute )
  * Locator: Matches the id or title attributes, or the string content of the link, or the alt attribute of a contained img element
  * Filters:
    * :id (String) — Matches the id attribute
    * :title (String) — Matches the title attribute
    * :alt (String) — Matches the alt attribute of a contained img element
    * :class (String) — Matches the class(es) provided
    * :href (String, Regexp, nil) — Matches the normalized href of the link, if nil will find <a> elements with no href attribute

* **:button** - Find buttons ( input [of type submit, reset, image, button] or button elements )
  * Locator: Matches the id, value, or title attributes, string content of a button, or the alt attribute of an image type button or of a descendant image of a button
  * Filters:
    * :id (String) — Matches the id attribute
    * :title (String) — Matches the title attribute
    * :class (String) — Matches the class(es) provided
    * :value (String) — Matches the value of an input button
    * :type

* **:link_or_button** - Find links or buttons
  * Locator: See :link and :button selectors

* **:fillable_field** - Find text fillable fields ( textarea, input [not of type submit, image, radio, checkbox, hidden, file] )
  * Locator: Matches against the id, name, or placeholder
  * Filters:
    * :id (String) — Matches the id attribute
    * :name (String) — Matches the name attribute
    * :placeholder (String) — Matches the placeholder attribute
    * :with (String) — Matches the current value of the field
    * :type (String) — Matches the type attribute of the field or element type for 'textarea'
    * :class (String, Array<String>) — Matches the class(es) provided
    * :disabled (Boolean) — Match disabled field?
    * :multiple (Boolean) — Match fields that accept multiple values

* **:radio_button** - Find radio buttons
  * Locator: Match id, name, or associated label text
  * Filters:
    * :id (String) — Matches the id attribute
    * :name (String) — Matches the name attribute
    * :class (String, Array<String>) — Matches the class(es) provided
    * :checked (Boolean) — Match checked fields?
    * :unchecked (Boolean) — Match unchecked fields?
    * :disabled (Boolean) — Match disabled field?
    * :option (String) — Match the value

* **:checkbox** - Find checkboxes
  * Locator: Match id, name, or associated label text
  * Filters:
    * *:id (String) — Matches the id attribute
    * *:name (String) — Matches the name attribute
    * *:class (String, Array<String>) — Matches the class(es) provided
    * *:checked (Boolean) — Match checked fields?
    * *:unchecked (Boolean) — Match unchecked fields?
    * *:disabled (Boolean) — Match disabled field?
    * *:option (String) — Match the value

* **:select** - Find select elements
  * Locator: Match id, name, placeholder, or associated label text
  * Filters:
    * :id (String) — Matches the id attribute
    * :name (String) — Matches the name attribute
    * :placeholder (String) — Matches the placeholder attribute
    * :class (String, Array<String>) — Matches the class(es) provided
    * :disabled (Boolean) — Match disabled field?
    * :multiple (Boolean) — Match fields that accept multiple values
    * :options (Array<String>) — Exact match options
    * :with_options (Array<String>) — Partial match options
    * :selected (String, Array<String>) — Match the selection(s)
    * :with_selected (String, Array<String>) — Partial match the selection(s)

* **:option** - Find option elements
  * Locator: Match text of option
  * Filters:
    * :disabled (Boolean) — Match disabled option
    * :selected (Boolean) — Match selected option

* **:datalist_input**
  * Locator:
  * Filters:
    * :disabled
    * :name
    * :placeholder

* **:datalist_option**
  * Locator:

* **:file_field** - Find file input elements
  * Locator: Match id, name, or associated label text
  * Filters:
    * :id (String) — Matches the id attribute
    * :name (String) — Matches the name attribute
    * :class (String, Array<String>) — Matches the class(es) provided
    * :disabled (Boolean) — Match disabled field?
    * :multiple (Boolean) — Match field that accepts multiple values

* **:label** - Find label elements
  * Locator: Match id or text contents
  * Filters:
    * :for (Element, String) — The element or id of the element associated with the label

* **:table** - Find table elements
  * Locator: id or caption text of table
  * Filters:
    * :id (String) — Match id attribute of table
    * :caption (String) — Match text of associated caption
    * :class (String, Array<String>) — Matches the class(es) provided

* **:frame** - Find frame/iframe elements
  * Locator: Match id or name
  * Filters:
    * :id (String) — Match id attribute
    * :name (String) — Match name attribute
    * :class (String, Array<String>) — Matches the class(es) provided

* **:element**
  * Locator: Type of element ('div', 'a', etc) - if not specified defaults to '*'
  * Filters: Matches on any element attribute

Defined Under Namespace

Modules: Filters Classes: CSS, FilterSet

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, &block) ⇒ Selector

Returns a new instance of Selector.



182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/capybara/selector/selector.rb', line 182

def initialize(name, &block)
  @name = name
  @filter_set = FilterSet.add(name) {}
  @match = nil
  @label = nil
  @failure_message = nil
  @description = nil
  @format = nil
  @expression = nil
  @expression_filters = {}
  @default_visibility = nil
  instance_eval(&block)
end

Instance Attribute Details

#formatObject (readonly)

Returns the value of attribute format.



161
162
163
# File 'lib/capybara/selector/selector.rb', line 161

def format
  @format
end

#nameObject (readonly)

Returns the value of attribute name.



161
162
163
# File 'lib/capybara/selector/selector.rb', line 161

def name
  @name
end

Class Method Details

.add(name, &block) ⇒ Object



169
170
171
# File 'lib/capybara/selector/selector.rb', line 169

def add(name, &block)
  all[name.to_sym] = Capybara::Selector.new(name.to_sym, &block)
end

.allObject



165
166
167
# File 'lib/capybara/selector/selector.rb', line 165

def all
  @selectors ||= {} # rubocop:disable Naming/MemoizedInstanceVariableName
end

.remove(name) ⇒ Object



177
178
179
# File 'lib/capybara/selector/selector.rb', line 177

def remove(name)
  all.delete(name.to_sym)
end

.update(name, &block) ⇒ Object



173
174
175
# File 'lib/capybara/selector/selector.rb', line 173

def update(name, &block)
  all[name.to_sym].instance_eval(&block)
end

Instance Method Details

#call(locator, **options) ⇒ Object



290
291
292
293
294
295
296
# File 'lib/capybara/selector/selector.rb', line 290

def call(locator, **options)
  if format
    @expression.call(locator, options)
  else
    warn "Selector has no format"
  end
end

#css(*expression_filters) {|locator, options| ... } ⇒ #call #css#call

Define a selector by a CSS selector

Overloads:

  • #css(*expression_filters) {|locator, options| ... } ⇒ #call

    Parameters:

    • expression_filters (Array<Symbol>)

      ([]) Names of filters that can be implemented via this CSS selector

    Yields:

    • (locator, options)

      The block to use to generate the CSS selector

    Yield Parameters:

    • locator (String)

      The locator string passed to the query

    • options (Hash)

      The options hash passed to the query

    Yield Returns:

    • (#to_s)

      An object that can produce a CSS selector

Returns:

  • (#call)

    The block that will be called to generate the CSS selector



245
246
247
248
249
250
251
# File 'lib/capybara/selector/selector.rb', line 245

def css(*allowed_filters, &block)
  if block
    @format, @expression = :css, block
    allowed_filters.flatten.each { |ef| expression_filters[ef] = nil }
  end
  format == :css ? @expression : nil
end

#custom_filtersObject



196
197
198
199
# File 'lib/capybara/selector/selector.rb', line 196

def custom_filters
  warn "Deprecated: Selector#custom_filters is not valid when same named expression and node filter exist - don't use"
  node_filters.merge(expression_filters).freeze
end

#default_visibility(fallback = Capybara.ignore_hidden_elements) ⇒ Object



374
375
376
377
# File 'lib/capybara/selector/selector.rb', line 374

def default_visibility(fallback = Capybara.ignore_hidden_elements)
  return @default_visibility unless @default_visibility.nil?
  fallback
end

#description(options) ⇒ String

Returns Description of the selector when used with the options passed.

Parameters:

  • options (Hash)

    The options of the query used to generate the description

Returns:

  • (String)

    Description of the selector when used with the options passed



288
# File 'lib/capybara/selector/selector.rb', line 288

def_delegator :@filter_set, :description

#expression_filter(name, *types, options = {}, &block) ⇒ Object

Parameters:

  • name (Symbol, Regexp)

    The filter name

  • matcher (Regexp)

    (nil) A Regexp used to check whether a specific option is handled by this filter

  • types (Array<Symbol>)

    The types of the filter - currently valid types are [:boolean]

  • options (Hash) (defaults to: {})

    ({}) Options of the filter

Options Hash (options):

  • :valid_values (Array<>)

    Valid values for this filter

  • :default (Object)

    The default value of the filter (if any)

  • :skip_if (Object)

    Value of the filter that will cause it to be skipped

  • :matcher (Regexp) — default: nil

    A Regexp used to check whether a specific option is handled by this filter. If not provided the filter will be used for options matching the filter name.



349
# File 'lib/capybara/selector/selector.rb', line 349

def_delegators :@filter_set, :node_filter, :expression_filter, :filter

#expression_filtersObject



205
206
207
# File 'lib/capybara/selector/selector.rb', line 205

def expression_filters
  @filter_set.expression_filters
end

#filterObject



# File 'lib/capybara/selector/selector.rb', line 328

#filter_set(name, filters_to_use = nil) ⇒ Object



351
352
353
354
355
356
357
# File 'lib/capybara/selector/selector.rb', line 351

def filter_set(name, filters_to_use = nil)
  f_set = FilterSet.all[name]
  filter_selector = filters_to_use.nil? ? ->(*) { true } : ->(n, _) { filters_to_use.include? n }
  @filter_set.expression_filters.merge!(f_set.expression_filters.select(&filter_selector))
  @filter_set.node_filters.merge!(f_set.node_filters.select(&filter_selector))
  f_set.descriptions.each { |desc| @filter_set.describe(&desc) }
end

#label(label) ⇒ String #labelString

Set/get a descriptive label for the selector

Overloads:

  • #label(label) ⇒ String

    Parameters:

    • label (String)

      A descriptive label for this selector - used in error messages

Returns:

  • (String)

    The currently set label



276
277
278
279
# File 'lib/capybara/selector/selector.rb', line 276

def label(label = nil)
  @label = label if label
  @label
end

#match {|locator| ... } ⇒ #call

Automatic selector detection

Yields:

  • (locator)

    This block takes the passed in locator string and returns whether or not it matches the selector

Yield Parameters:

  • , (String)

    locator The locator string used to determin if it matches the selector

Yield Returns:

  • (Boolean)

    Whether this selector matches the locator string

Returns:

  • (#call)

    The block that will be used to detect selector match



262
263
264
265
# File 'lib/capybara/selector/selector.rb', line 262

def match(&block)
  @match = block if block
  @match
end

#match?(locator) ⇒ Boolean

Should this selector be used for the passed in locator

This is used by the automatic selector selection mechanism when no selector type is passed to a selector query

Parameters:

  • locator (String)

    The locator passed to the query

Returns:

  • (Boolean)

    Whether or not to use this selector



307
308
309
# File 'lib/capybara/selector/selector.rb', line 307

def match?(locator)
  @match&.call(locator)
end

#node_filter(name, *types, options = {}, &block) ⇒ Object

Parameters:

  • name (Symbol, Regexp)

    The filter name

  • types (Array<Symbol>)

    The types of the filter - currently valid types are [:boolean]

  • options (Hash) (defaults to: {})

    ({}) Options of the filter

Options Hash (options):

  • :valid_values (Array<>)

    Valid values for this filter

  • :default (Object)

    The default value of the filter (if any)

  • :skip_if (Object)

    Value of the filter that will cause it to be skipped

  • :matcher (Regexp) — default: nil

    A Regexp used to check whether a specific option is handled by this filter. If not provided the filter will be used for options matching the filter name.



# File 'lib/capybara/selector/selector.rb', line 311

#node_filtersObject



201
202
203
# File 'lib/capybara/selector/selector.rb', line 201

def node_filters
  @filter_set.node_filters
end

#visible(default_visibility) ⇒ Object

Set the default visibility mode that shouble be used if no visibile option is passed when using the selector. If not specified will default to the behavior indicated by Capybara.ignore_hidden_elements

Parameters:

  • default_visibility (Symbol)

    Only find elements with the specified visibility:

    • :all - finds visible and invisible elements.

    • :hidden - only finds invisible elements.

    • :visible - only finds visible elements.



370
371
372
# File 'lib/capybara/selector/selector.rb', line 370

def visible(default_visibility)
  @default_visibility = default_visibility
end

#xpath(*expression_filters) {|locator, options| ... } ⇒ #call #xpath#call

Define a selector by an xpath expression

Overloads:

  • #xpath(*expression_filters) {|locator, options| ... } ⇒ #call

    Parameters:

    • expression_filters (Array<Symbol>)

      ([]) Names of filters that can be implemented via this expression

    Yields:

    • (locator, options)

      The block to use to generate the XPath expression

    Yield Parameters:

    • locator (String)

      The locator string passed to the query

    • options (Hash)

      The options hash passed to the query

    Yield Returns:

    • (#to_xpath, #to_s)

      An object that can produce an xpath expression

Returns:

  • (#call)

    The block that will be called to generate the XPath expression



223
224
225
226
227
228
229
# File 'lib/capybara/selector/selector.rb', line 223

def xpath(*allowed_filters, &block)
  if block
    @format, @expression = :xpath, block
    allowed_filters.flatten.each { |ef| expression_filters[ef] = Filters::IdentityExpressionFilter.new }
  end
  format == :xpath ? @expression : nil
end