class Capybara::RackTest::Form
def add_input_param(field, params)
def add_input_param(field, params) if %w[radio checkbox].include? field['type'] if field['checked'] node = Capybara::RackTest::Node.new(driver, field) merge_param!(params, field['name'].to_s, node.value.to_s) end elsif %w[submit image].include? field['type'] # TODO: identify the click button here (in document order, rather # than leaving until the end of the params) elsif field['type'] == 'file' if multipart? file = if (value = field['value']).to_s.empty? NilUploadedFile.new else mime_info = MiniMime.lookup_by_filename(value) Rack::Test::UploadedFile.new(value, (mime_info && mime_info.content_type).to_s) end merge_param!(params, field['name'].to_s, file) else merge_param!(params, field['name'].to_s, File.basename(field['value'].to_s)) end else merge_param!(params, field['name'].to_s, field['value'].to_s) end end
def add_select_param(field, params)
def add_select_param(field, params) if field['multiple'] == 'multiple' field.xpath(".//option[@selected]").each do |option| merge_param!(params, field['name'].to_s, (option['value'] || option.text).to_s) end else option = field.xpath('.//option[@selected]').first || field.xpath('.//option').first merge_param!(params, field['name'].to_s, (option['value'] || option.text).to_s) if option end end
def add_textarea_param(field, params)
def add_textarea_param(field, params) merge_param!(params, field['name'].to_s, field['_capybara_raw_value'].to_s.gsub(/\n/, "\r\n")) end
def make_params
def make_params if Rack::Utils.respond_to?(:default_query_parser) Rack::Utils.default_query_parser.make_params else ParamsHash.new end end
def merge_param!(params, key, value)
def merge_param!(params, key, value) if Rack::Utils.respond_to?(:default_query_parser) Rack::Utils.default_query_parser.normalize_params(params, key, value, Rack::Utils.param_depth_limit) else Rack::Utils.normalize_params(params, key, value) end end
def multipart?
def multipart? self[:enctype] == "multipart/form-data" end
def params(button)
def params(button) params = make_params form_element_types = %i[input select textarea] form_elements_xpath = XPath.generate do |x| xpath = x.descendant(*form_element_types).where(!x.attr(:form)) xpath += x.anywhere(*form_element_types).where(x.attr(:form) == native[:id]) if native[:id] xpath.where(!x.attr(:disabled)) end.to_s native.xpath(form_elements_xpath).map do |field| case field.name when 'input' add_input_param(field, params) when 'select' add_select_param(field, params) when 'textarea' add_textarea_param(field, params) end end merge_param!(params, button[:name], button[:value] || "") if button[:name] params.to_params_hash end
def request_method
def request_method self[:method] =~ /post/i ? :post : :get end
def submit(button)
def submit(button) action = (button && button['formaction']) || native['action'] method = (button && button['formmethod']) || request_method driver.submit(method, action.to_s, params(button)) end