Class: Mechanize::Form
- Inherits:
-
Object
- Object
- Mechanize::Form
- Defined in:
- lib/mechanize/form.rb,
lib/mechanize/inspect.rb,
lib/mechanize/form/field.rb,
lib/mechanize/form/button.rb,
lib/mechanize/form/option.rb,
lib/mechanize/monkey_patch.rb,
lib/mechanize/form/check_box.rb,
lib/mechanize/form/file_upload.rb,
lib/mechanize/form/select_list.rb,
lib/mechanize/form/image_button.rb,
lib/mechanize/form/radio_button.rb,
lib/mechanize/form/multi_select_list.rb
Overview
Synopsis
This class encapsulates a form parsed out of an HTML page. Each type of input fields available in a form can be accessed through this object. See GlobalForm for more methods.
Example
Find a form and print out its fields
form = page.forms.first # => Mechanize::Form
form.fields.each { |f| puts f.name }
Set the input field ‘name’ to “Aaron”
form['name'] = 'Aaron'
puts form['name']
Defined Under Namespace
Classes: Button, CheckBox, Field, FileUpload, Hidden, ImageButton, MultiSelectList, Option, RadioButton, Reset, SelectList, Submit, Text, Textarea
Instance Attribute Summary collapse
-
#action ⇒ Object
Returns the value of attribute action.
-
#buttons ⇒ Object
readonly
Returns the value of attribute buttons.
-
#checkboxes ⇒ Object
readonly
Returns the value of attribute checkboxes.
-
#enctype ⇒ Object
Returns the value of attribute enctype.
-
#fields ⇒ Object
(also: #elements)
readonly
Returns the value of attribute fields.
-
#file_uploads ⇒ Object
readonly
Returns the value of attribute file_uploads.
-
#form_node ⇒ Object
readonly
Returns the value of attribute form_node.
-
#method ⇒ Object
Returns the value of attribute method.
-
#name ⇒ Object
Returns the value of attribute name.
-
#page ⇒ Object
readonly
Returns the value of attribute page.
-
#radiobuttons ⇒ Object
readonly
Returns the value of attribute radiobuttons.
Instance Method Summary collapse
-
#[](field_name) ⇒ Object
Fetch the value of the first input field with the name passed in ==Example Fetch the value set in the input field ‘name’ puts form.
-
#[]=(field_name, value) ⇒ Object
Set the value of the first input field with the name passed in ==Example Set the value in the input field ‘name’ to “Aaron” form = ‘Aaron’.
-
#add_button_to_query(button) ⇒ Object
This method adds a button to the query.
-
#add_field!(field_name, value = nil) ⇒ Object
Add a field with
field_name
andvalue
. -
#build_query(buttons = []) ⇒ Object
This method builds an array of arrays that represent the query parameters to be used with this form.
-
#click_button(button = buttons.first) ⇒ Object
Submit form using
button
. -
#delete_field!(field_name) ⇒ Object
Removes all fields with name
field_name
. -
#has_field?(field_name) ⇒ Boolean
(also: #has_key?)
Returns whether or not the form contains a field with
field_name
. - #has_value?(value) ⇒ Boolean
- #hidden_field?(field_name) ⇒ Boolean
- #hiddens ⇒ Object
-
#initialize(node, mech = nil, page = nil) ⇒ Form
constructor
A new instance of Form.
- #keys ⇒ Object
-
#method_missing(id, *args) ⇒ Object
Treat form fields like accessors.
- #pretty_print(q) ⇒ Object
-
#request_data ⇒ Object
This method calculates the request data to be sent back to the server for this form, depending on if this is a regular post, get, or a multi-part post,.
- #reset_button?(button_name) ⇒ Boolean
- #resets ⇒ Object
-
#set_fields(fields = {}) ⇒ Object
This method sets multiple fields on the form.
-
#submit(button = nil, headers = {}) ⇒ Object
Submit this form with the button passed in.
- #submit_button?(button_name) ⇒ Boolean
- #submits ⇒ Object
- #text_field?(field_name) ⇒ Boolean
- #textarea_field?(field_name) ⇒ Boolean
- #textareas ⇒ Object
- #texts ⇒ Object
- #values ⇒ Object
Constructor Details
#initialize(node, mech = nil, page = nil) ⇒ Form
Returns a new instance of Form.
35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/mechanize/form.rb', line 35 def initialize(node, mech=nil, page=nil) @enctype = node['enctype'] || 'application/x-www-form-urlencoded' @form_node = node @action = Util.html_unescape(node['action']) @method = (node['method'] || 'GET').upcase @name = node['name'] @clicked_buttons = [] @page = page @mech = mech parse end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(id, *args) ⇒ Object
Treat form fields like accessors.
130 131 132 133 134 135 136 137 |
# File 'lib/mechanize/form.rb', line 130 def method_missing(id,*args) method = id.to_s.gsub(/=$/, '') if field(method) return field(method).value if args.empty? return field(method).value = args[0] end super end |
Instance Attribute Details
#action ⇒ Object
Returns the value of attribute action.
25 26 27 |
# File 'lib/mechanize/form.rb', line 25 def action @action end |
#buttons ⇒ Object (readonly)
Returns the value of attribute buttons.
27 28 29 |
# File 'lib/mechanize/form.rb', line 27 def @buttons end |
#checkboxes ⇒ Object (readonly)
Returns the value of attribute checkboxes.
27 28 29 |
# File 'lib/mechanize/form.rb', line 27 def checkboxes @checkboxes end |
#enctype ⇒ Object
Returns the value of attribute enctype.
28 29 30 |
# File 'lib/mechanize/form.rb', line 28 def enctype @enctype end |
#fields ⇒ Object (readonly) Also known as: elements
Returns the value of attribute fields.
27 28 29 |
# File 'lib/mechanize/form.rb', line 27 def fields @fields end |
#file_uploads ⇒ Object (readonly)
Returns the value of attribute file_uploads.
27 28 29 |
# File 'lib/mechanize/form.rb', line 27 def file_uploads @file_uploads end |
#form_node ⇒ Object (readonly)
Returns the value of attribute form_node.
32 33 34 |
# File 'lib/mechanize/form.rb', line 32 def form_node @form_node end |
#method ⇒ Object
Returns the value of attribute method.
25 26 27 |
# File 'lib/mechanize/form.rb', line 25 def method @method end |
#name ⇒ Object
Returns the value of attribute name.
25 26 27 |
# File 'lib/mechanize/form.rb', line 25 def name @name end |
#page ⇒ Object (readonly)
Returns the value of attribute page.
33 34 35 |
# File 'lib/mechanize/form.rb', line 33 def page @page end |
#radiobuttons ⇒ Object (readonly)
Returns the value of attribute radiobuttons.
27 28 29 |
# File 'lib/mechanize/form.rb', line 27 def @radiobuttons end |
Instance Method Details
#[](field_name) ⇒ Object
Fetch the value of the first input field with the name passed in
Example
Fetch the value set in the input field ‘name’
puts form['name']
111 112 113 114 |
# File 'lib/mechanize/form.rb', line 111 def [](field_name) f = field(field_name) f && f.value end |
#[]=(field_name, value) ⇒ Object
Set the value of the first input field with the name passed in
Example
Set the value in the input field ‘name’ to “Aaron”
form['name'] = 'Aaron'
120 121 122 123 124 125 126 127 |
# File 'lib/mechanize/form.rb', line 120 def []=(field_name, value) f = field(field_name) if f.nil? add_field!(field_name, value) else f.value = value end end |
#add_button_to_query(button) ⇒ Object
This method adds a button to the query. If the form needs to be submitted with multiple buttons, pass each button to this method.
213 214 215 |
# File 'lib/mechanize/form.rb', line 213 def () @clicked_buttons << end |
#add_field!(field_name, value = nil) ⇒ Object
Add a field with field_name
and value
76 77 78 |
# File 'lib/mechanize/form.rb', line 76 def add_field!(field_name, value = nil) fields << Field.new({'name' => field_name}, value) end |
#build_query(buttons = []) ⇒ Object
This method builds an array of arrays that represent the query parameters to be used with this form. The return value can then be used to create a query string for this form.
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/mechanize/form.rb', line 168 def build_query( = []) query = [] (fields + checkboxes).sort.each do |f| case f when Form::CheckBox if f.checked qval = proc_query(f) query.push(*qval) end when Form::Field qval = proc_query(f) query.push(*qval) end end radio_groups = {} .each do |f| fname = from_native_charset(f.name) radio_groups[fname] ||= [] radio_groups[fname] << f end # take one radio button from each group radio_groups.each_value do |g| checked = g.select {|f| f.checked} if checked.size == 1 f = checked.first qval = proc_query(f) query.push(*qval) elsif checked.size > 1 raise "multiple radiobuttons are checked in the same group!" end end @clicked_buttons.each { |b| qval = proc_query(b) query.push(*qval) } query end |
#click_button(button = buttons.first) ⇒ Object
Submit form using button
. Defaults to the first button.
146 147 148 |
# File 'lib/mechanize/form.rb', line 146 def ( = .first) submit() end |
#delete_field!(field_name) ⇒ Object
Removes all fields with name field_name
.
237 238 239 |
# File 'lib/mechanize/form.rb', line 237 def delete_field!(field_name) @fields.delete_if{ |f| f.name == field_name} end |
#has_field?(field_name) ⇒ Boolean Also known as: has_key?
Returns whether or not the form contains a field with field_name
49 50 51 |
# File 'lib/mechanize/form.rb', line 49 def has_field?(field_name) ! fields.find { |f| f.name.eql? field_name }.nil? end |
#has_value?(value) ⇒ Boolean
55 56 57 |
# File 'lib/mechanize/form.rb', line 55 def has_value?(value) ! fields.find { |f| f.value.eql? value }.nil? end |
#hidden_field?(field_name) ⇒ Boolean
72 |
# File 'lib/mechanize/form.rb', line 72 def hidden_field?(field_name) !! hiddens.find{|f| f.name == field_name}; end |
#hiddens ⇒ Object
66 |
# File 'lib/mechanize/form.rb', line 66 def hiddens ; @hiddens ||= fields.select { |f| f.class == Hidden }; end |
#keys ⇒ Object
59 |
# File 'lib/mechanize/form.rb', line 59 def keys; fields.map { |f| f.name }; end |
#pretty_print(q) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/mechanize/inspect.rb', line 55 def pretty_print(q) q.object_group(self) { q.breakable; q.group(1, '{name', '}') { q.breakable; q.pp name } q.breakable; q.group(1, '{method', '}') { q.breakable; q.pp method } q.breakable; q.group(1, '{action', '}') { q.breakable; q.pp action } q.breakable; q.group(1, '{fields', '}') { fields.each do |field| q.breakable q.pp field end } q.breakable; q.group(1, '{radiobuttons', '}') { .each { |b| q.breakable; q.pp b } } q.breakable; q.group(1, '{checkboxes', '}') { checkboxes.each { |b| q.breakable; q.pp b } } q.breakable; q.group(1, '{file_uploads', '}') { file_uploads.each { |b| q.breakable; q.pp b } } q.breakable; q.group(1, '{buttons', '}') { .each { |b| q.breakable; q.pp b } } } end |
#request_data ⇒ Object
This method calculates the request data to be sent back to the server for this form, depending on if this is a regular post, get, or a multi-part post,
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/mechanize/form.rb', line 220 def request_data query_params = build_query() case @enctype.downcase when /^multipart\/form-data/ boundary = rand_string(20) @enctype = "multipart/form-data; boundary=#{boundary}" params = [] query_params.each { |k,v| params << param_to_multipart(k, v) unless k.nil? } @file_uploads.each { |f| params << file_to_multipart(f) } params.collect { |p| "--#{boundary}\r\n#{p}" }.join('') + "--#{boundary}--\r\n" else Mechanize::Util.build_query_string(query_params) end end |
#reset_button?(button_name) ⇒ Boolean
70 |
# File 'lib/mechanize/form.rb', line 70 def () !! resets.find{|f| f.name == }; end |
#resets ⇒ Object
64 |
# File 'lib/mechanize/form.rb', line 64 def resets ; @resets ||= .select { |f| f.class == Reset }; end |
#set_fields(fields = {}) ⇒ Object
This method sets multiple fields on the form. It takes a list of field name, value pairs. If there is more than one field found with the same name, this method will set the first one found. If you want to set the value of a duplicate field, use a value which is a Hash with the key as the index in to the form. The index is zero based. For example, to set the second field named ‘foo’, you could do the following:
form.set_fields( :foo => { 1 => 'bar' } )
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/mechanize/form.rb', line 88 def set_fields(fields = {}) fields.each do |k,v| case v when Hash v.each do |index, value| self.fields_with(:name => k.to_s).[](index).value = value end else value = nil index = 0 [v].flatten.each do |val| index = val.to_i unless value.nil? value = val if value.nil? end self.fields_with(:name => k.to_s).[](index).value = value end end end |
#submit(button = nil, headers = {}) ⇒ Object
Submit this form with the button passed in
140 141 142 |
# File 'lib/mechanize/form.rb', line 140 def submit =nil, headers = {} @mech.submit(self, , headers) end |
#submit_button?(button_name) ⇒ Boolean
69 |
# File 'lib/mechanize/form.rb', line 69 def () !! submits.find{|f| f.name == }; end |
#submits ⇒ Object
63 |
# File 'lib/mechanize/form.rb', line 63 def submits ; @submits ||= .select { |f| f.class == Submit }; end |
#text_field?(field_name) ⇒ Boolean
71 |
# File 'lib/mechanize/form.rb', line 71 def text_field?(field_name) !! texts.find{|f| f.name == field_name}; end |
#textarea_field?(field_name) ⇒ Boolean
73 |
# File 'lib/mechanize/form.rb', line 73 def textarea_field?(field_name) !!textareas.find{|f| f.name == field_name}; end |
#textareas ⇒ Object
67 |
# File 'lib/mechanize/form.rb', line 67 def textareas; @textareas ||= fields.select { |f| f.class == Textarea }; end |
#texts ⇒ Object
65 |
# File 'lib/mechanize/form.rb', line 65 def texts ; @texts ||= fields.select { |f| f.class == Text }; end |
#values ⇒ Object
61 |
# File 'lib/mechanize/form.rb', line 61 def values; fields.map { |f| f.value }; end |