Support multiple expression types in one selector
This commit is contained in:
parent
d6f570ea19
commit
dcd7fab897
|
@ -11,6 +11,7 @@ module Capybara
|
|||
session_options:,
|
||||
enable_aria_label: session_options.enable_aria_label,
|
||||
test_id: session_options.test_id,
|
||||
selector_format: nil,
|
||||
**options,
|
||||
&filter_block)
|
||||
@resolved_node = nil
|
||||
|
@ -21,7 +22,8 @@ module Capybara
|
|||
|
||||
@selector = Selector.new(
|
||||
find_selector(args[0].is_a?(Symbol) ? args.shift : args[0]),
|
||||
config: { enable_aria_label: enable_aria_label, test_id: test_id }
|
||||
config: { enable_aria_label: enable_aria_label, test_id: test_id },
|
||||
format: selector_format
|
||||
)
|
||||
|
||||
@locator = args.shift
|
||||
|
@ -371,8 +373,8 @@ module Capybara
|
|||
node.is_a?(::Capybara::Node::Simple) && node.path == '/'
|
||||
end
|
||||
|
||||
def apply_filter?(_filter)
|
||||
true
|
||||
def apply_filter?(filter)
|
||||
filter.format.nil? || (filter.format == selector_format)
|
||||
end
|
||||
|
||||
def matches_locator_filter?(node)
|
||||
|
|
|
@ -24,6 +24,10 @@ module Capybara
|
|||
@options.key?(:skip_if) && value == @options[:skip_if]
|
||||
end
|
||||
|
||||
def format
|
||||
@options[:format]
|
||||
end
|
||||
|
||||
def matcher?
|
||||
!@matcher.nil?
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@ module Capybara
|
|||
end
|
||||
|
||||
def matches?(node, value, context = nil, exact:)
|
||||
apply(node, value, true, context, exact: exact)
|
||||
apply(node, value, true, context, exact: exact, format: context&.default_format)
|
||||
rescue Capybara::ElementNotFound
|
||||
false
|
||||
end
|
||||
|
|
|
@ -203,16 +203,17 @@ module Capybara
|
|||
|
||||
attr_reader :errors
|
||||
|
||||
def initialize(definition, config:)
|
||||
def initialize(definition, config:, format:)
|
||||
definition = self.class[definition] unless definition.is_a? Definition
|
||||
super(definition)
|
||||
@definition = definition
|
||||
@config = config
|
||||
@format = format
|
||||
@errors = []
|
||||
end
|
||||
|
||||
def format
|
||||
@definition.default_format
|
||||
@format || @definition.default_format
|
||||
end
|
||||
alias_method :current_format, :format
|
||||
|
||||
|
@ -240,14 +241,10 @@ module Capybara
|
|||
errors << error_msg
|
||||
end
|
||||
|
||||
def expression_for(name, locator, config: @config, **options)
|
||||
Selector.new(name, config: config).call(locator, **options)
|
||||
def expression_for(name, locator, config: @config, format: current_format, **options)
|
||||
Selector.new(name, config: config, format: format).call(locator, **options)
|
||||
end
|
||||
|
||||
# def expression_for(name, locator, config: @config, format: current_format, **options)
|
||||
# Selector.new(name, config: config, format: format).call(locator, **options)
|
||||
# end
|
||||
|
||||
# @api private
|
||||
def with_filter_errors(errors)
|
||||
old_errors = @errors
|
||||
|
|
|
@ -30,7 +30,7 @@ Capybara::SpecHelper.spec '#all' do
|
|||
|
||||
it 'should accept an XPath instance', :exact_false do
|
||||
@session.visit('/form')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}).call('Name')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('Name')
|
||||
expect(@xpath).to be_a(::XPath::Union)
|
||||
@result = @session.all(@xpath).map(&:value)
|
||||
expect(@result).to include('Smith', 'John', 'John Smith')
|
||||
|
|
|
@ -235,7 +235,7 @@ Capybara::SpecHelper.spec '#find' do
|
|||
|
||||
it 'should accept an XPath instance' do
|
||||
@session.visit('/form')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}).call('First Name')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
|
||||
expect(@xpath).to be_a(::XPath::Union)
|
||||
expect(@session.find(@xpath).value).to eq('John')
|
||||
end
|
||||
|
|
|
@ -24,7 +24,7 @@ Capybara::SpecHelper.spec '#first' do
|
|||
|
||||
it 'should accept an XPath instance' do
|
||||
@session.visit('/form')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}).call('First Name')
|
||||
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
|
||||
expect(@xpath).to be_a(::XPath::Union)
|
||||
expect(@session.first(@xpath).value).to eq('John')
|
||||
end
|
||||
|
|
|
@ -167,7 +167,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
xpath(:something, :other) { |_locator| XPath.descendant }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:something, :other)
|
||||
end
|
||||
|
@ -176,7 +176,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
xpath { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:valid3, :valid4)
|
||||
end
|
||||
|
@ -185,7 +185,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
xpath(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:valid1)
|
||||
expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
|
||||
|
@ -208,7 +208,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
css(:name, :other_name) { |_locator| '' }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:name, :other_name)
|
||||
end
|
||||
|
@ -217,7 +217,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
css { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:valid3, :valid4)
|
||||
end
|
||||
|
@ -226,7 +226,7 @@ RSpec.describe Capybara do
|
|||
Capybara.add_selector :test do
|
||||
css(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
||||
end
|
||||
selector = Capybara::Selector.new :test, config: nil
|
||||
selector = Capybara::Selector.new :test, config: nil, format: nil
|
||||
|
||||
expect(selector.expression_filters.keys).to include(:valid1)
|
||||
expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
|
||||
|
|
Loading…
Reference in New Issue