Support multiple expression types in one selector

This commit is contained in:
Thomas Walpole 2019-04-22 18:04:15 -07:00
parent d6f570ea19
commit dcd7fab897
8 changed files with 24 additions and 21 deletions

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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)