Class: Capybara::RackTest::Form

Inherits:
Node show all
Defined in:
lib/capybara/rack_test/form.rb

Defined Under Namespace

Classes: NilUploadedFile

Instance Attribute Summary

Attributes inherited from Driver::Node

#driver, #native

Instance Method Summary (collapse)

Methods inherited from Node

#==, #[], #all_text, #checked?, #click, #disabled?, #find_css, #find_xpath, #path, #select_option, #selected?, #set, #tag_name, #unselect_option, #value, #visible?, #visible_text

Methods inherited from Driver::Node

#==, #[], #all_text, #checked?, #click, #disabled?, #double_click, #drag_to, #hover, #initialize, #inspect, #path, #right_click, #select_option, #selected?, #set, #tag_name, #trigger, #unselect_option, #value, #visible?, #visible_text

Constructor Details

This class inherits a constructor from Capybara::Driver::Node

Instance Method Details

- (Boolean) multipart?



79
80
81
# File 'lib/capybara/rack_test/form.rb', line 79

def multipart?
  self[:enctype] == "multipart/form-data"
end

- (Object) params(button)



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/capybara/rack_test/form.rb', line 17

def params(button)
  params = {}

  form_element_types=[:input, :select, :textarea]
  form_elements_xpath=XPath.generate do |x| 
    xpath=x.descendant(*form_element_types).where(~x.attr(:form))
    xpath=xpath.union(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'
      if %w(radio checkbox).include? field['type']
        if field['checked']
          node=Capybara::RackTest::Node.new(self.driver, field)
          merge_param!(params, field['name'].to_s, node.value.to_s)
        end          
      elsif %w(submit image).include? field['type']
        # TO DO 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
              content_type = MIME::Types.type_for(value).first.to_s
              Rack::Test::UploadedFile.new(value, content_type)
            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
    when 'select'
      if field['multiple'] == 'multiple'
        options = field.xpath(".//option[@selected]")
        options.each do |option|
          merge_param!(params, field['name'].to_s, (option['value'] || option.text).to_s)
        end
      else
        option = field.xpath(".//option[@selected]").first
        option ||= field.xpath('.//option').first
        merge_param!(params, field['name'].to_s, (option['value'] || option.text).to_s) if option
      end
    when 'textarea'
      merge_param!(params, field['name'].to_s, field.text.to_s.gsub(/\n/, "\r\n"))
    end
  end
  merge_param!(params, button[:name], button[:value] || "") if button[:name]
  params
end

- (Object) submit(button)



73
74
75
76
77
# File 'lib/capybara/rack_test/form.rb', line 73

def submit(button)
  action = (button && button['formaction']) || native['action']
  requset_method = (button && button['formmethod']) || method
  driver.submit(requset_method, action.to_s, params(button))
end