teamcapybara--capybara/lib/capybara/selector/definition/datalist_input.rb

36 lines
1.1 KiB
Ruby

# frozen_string_literal: true
Capybara.add_selector(:datalist_input, locator_type: [String, Symbol]) do
label 'input box with datalist completion'
xpath do |locator, **options|
xpath = XPath.descendant(:input)[XPath.attr(:list)]
locate_field(xpath, locator, **options)
end
filter_set(:_field, %i[disabled name placeholder])
node_filter(:options) do |node, options|
actual = node.find("//datalist[@id=#{node[:list]}]", visible: :all).all(:datalist_option, wait: false).map(&:value)
(options.sort == actual.sort).tap do |res|
add_error("Expected #{options.inspect} options found #{actual.inspect}") unless res
end
end
expression_filter(:with_options) do |expr, options|
options.inject(expr) do |xpath, option|
xpath[XPath.attr(:list) == XPath.anywhere(:datalist)[expression_for(:datalist_option, option)].attr(:id)]
end
end
describe_expression_filters do |with_options: nil, **|
desc = +''
desc << " with at least options #{with_options.inspect}" if with_options
desc
end
describe_node_filters do |options: nil, **|
" with options #{options.inspect}" if options
end
end