Skip to content

Commit

Permalink
Added Form::Image,Label and Form::RadioButton#text that traces its label
Browse files Browse the repository at this point in the history
  • Loading branch information
maiha committed Aug 29, 2009
1 parent 13f45e5 commit 36219c6
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 3 deletions.
4 changes: 2 additions & 2 deletions lib/mechanize/form.rb
Expand Up @@ -282,9 +282,9 @@ def parse
next if name.nil? && !(type == 'submit' || type =='button')
case type
when 'radio'
@radiobuttons << RadioButton.new(node['name'], node['value'], !!node['checked'], self)
@radiobuttons << RadioButton.new(node['name'], node['value'], !!node['checked'], self, node)
when 'checkbox'
@checkboxes << CheckBox.new(node['name'], node['value'], !!node['checked'], self)
@checkboxes << CheckBox.new(node['name'], node['value'], !!node['checked'], self, node)
when 'file'
@file_uploads << FileUpload.new(node['name'], nil)
when 'submit'
Expand Down
11 changes: 10 additions & 1 deletion lib/mechanize/form/radio_button.rb
Expand Up @@ -5,9 +5,10 @@ class Form
class RadioButton < Field
attr_accessor :checked

def initialize(name, value, checked, form)
def initialize(name, value, checked, form, node)
@checked = checked
@form = form
@node = node
super(name, value)
end

Expand All @@ -24,6 +25,14 @@ def click
checked ? uncheck : check
end

def label
(id = @node['id']) && @form.page.labels_hash[id] || nil
end

def text
label.text rescue nil
end

private
def uncheck_peers
@form.radiobuttons_with(:name => name).each do |b|
Expand Down
27 changes: 27 additions & 0 deletions lib/mechanize/page.rb
Expand Up @@ -2,6 +2,8 @@
require 'mechanize/page/meta'
require 'mechanize/page/base'
require 'mechanize/page/frame'
require 'mechanize/page/image'
require 'mechanize/page/label'
require 'mechanize/headers'

class Mechanize
Expand Down Expand Up @@ -166,6 +168,31 @@ def iframes
search('iframe').map { |node| Frame.new(node, @mech, self) }
end

def images
@images ||=
search('img').map { |node| Image.new(node, self) }
end

def image_urls
@image_urls ||= images.map(&:url).uniq
end

def labels
@labels ||=
search('label').map { |node| Label.new(node, self) }
end

def labels_hash
unless @labels_hash
hash = {}
labels.each do |label|
hash[label.node['for']] = label if label.for
end
@labels_hash = hash
end
return @labels_hash
end

private

def html_body
Expand Down
26 changes: 26 additions & 0 deletions lib/mechanize/page/image.rb
@@ -0,0 +1,26 @@
class Mechanize
class Page < Mechanize::File
class Image
attr_reader :node
attr_reader :page

def initialize(node, page)
@node = node
@page = page
end

def src
@node['src']
end

def url
case src
when %r{^https?://}
src
else
(page.uri + src).to_s
end
end
end
end
end
20 changes: 20 additions & 0 deletions lib/mechanize/page/label.rb
@@ -0,0 +1,20 @@
class Mechanize
class Page < Mechanize::File
class Label
attr_reader :node
attr_reader :text
attr_reader :page
alias :to_s :text

def initialize(node, page)
@node = node
@text = node.inner_text
@page = page
end

def for
(id = @node['for']) && page.search("##{id}") || nil
end
end
end
end

0 comments on commit 36219c6

Please sign in to comment.