diff --git a/lib/webrat/core/page.rb b/lib/webrat/core/page.rb
index 35261fd..a61b40d 100644
--- a/lib/webrat/core/page.rb
+++ b/lib/webrat/core/page.rb
@@ -15,7 +15,7 @@ module Webrat
@method = method
@data = data
- reset_dom
+ reset_scope
load_page if @url
session.current_page = self
@@ -32,7 +32,7 @@ module Webrat
# field can be either the value of a name attribute (i.e. user[email])
# or the text inside a element that points at the field.
def fills_in(id_or_name_or_label, options = {})
- field = find_field(id_or_name_or_label, TextField, TextareaField, PasswordField)
+ field = scope.find_field(id_or_name_or_label, TextField, TextareaField, PasswordField)
field.set(options[:with])
end
@@ -44,7 +44,7 @@ module Webrat
# Example:
# checks 'Remember Me'
def checks(id_or_name_or_label)
- field = find_field(id_or_name_or_label, CheckboxField)
+ field = scope.find_field(id_or_name_or_label, CheckboxField)
field.check
end
@@ -56,7 +56,7 @@ module Webrat
# Example:
# unchecks 'Remember Me'
def unchecks(id_or_name_or_label)
- field = find_field(id_or_name_or_label, CheckboxField)
+ field = scope.find_field(id_or_name_or_label, CheckboxField)
field.uncheck
end
@@ -68,7 +68,7 @@ module Webrat
# Example:
# chooses 'First Option'
def chooses(label)
- field = find_field(label, RadioField)
+ field = scope.find_field(label, RadioField)
field.choose
end
@@ -87,10 +87,10 @@ module Webrat
id_or_name_or_label = options[:from]
if id_or_name_or_label
- field = find_field(id_or_name_or_label, SelectField)
+ field = scope.find_field(id_or_name_or_label, SelectField)
option = field.find_option(option_text)
else
- option = find_select_option(option_text)
+ option = scope.find_select_option(option_text)
end
flunk("Could not find option #{option_text.inspect}") if option.nil?
@@ -107,7 +107,7 @@ module Webrat
# attaches_file "Resume", "/path/to/the/resume.txt"
# attaches_file "Photo", "/path/to/the/image.png", "image/png"
def attaches_file(id_or_name_or_label, path, content_type = nil)
- field = find_field(id_or_name_or_label, FileField)
+ field = scope.find_field(id_or_name_or_label, FileField)
field.set(path, content_type)
end
@@ -148,7 +148,7 @@ module Webrat
#
# clicks_link "Sign up", :javascript => false
def clicks_link(link_text, options = {})
- link = find_link(link_text)
+ link = scope.find_link(link_text)
link.click(nil, options)
end
@@ -159,7 +159,7 @@ module Webrat
# Example:
# clicks_link_within "#user_12", "Vote"
def clicks_link_within(selector, link_text)
- link = find_link(link_text, selector)
+ link = scope.find_link(link_text, selector)
link.click
end
@@ -170,7 +170,7 @@ module Webrat
# Example:
# clicks_get_link "Log out"
def clicks_get_link(link_text)
- link = find_link(link_text)
+ link = scope.find_link(link_text)
link.click(:get)
end
@@ -181,7 +181,7 @@ module Webrat
# Example:
# clicks_delete_link "Log out"
def clicks_delete_link(link_text)
- link = find_link(link_text)
+ link = scope.find_link(link_text)
link.click(:delete)
end
@@ -192,7 +192,7 @@ module Webrat
# Example:
# clicks_post_link "Vote"
def clicks_post_link(link_text)
- link = find_link(link_text)
+ link = scope.find_link(link_text)
link.click(:post)
end
@@ -203,7 +203,7 @@ module Webrat
# Example:
# clicks_put_link "Update profile"
def clicks_put_link(link_text)
- link = find_link(link_text)
+ link = scope.find_link(link_text)
link.click(:put)
end
@@ -221,7 +221,7 @@ module Webrat
def clicks_button(value = nil)
button = nil
- forms.each do |form|
+ scope.forms.each do |form|
button = form.find_button(value)
break if button
end
@@ -251,78 +251,20 @@ module Webrat
protected
def load_page
- request_page(@url, @method, @data)
- end
-
- def find_select_option(option_text)
- forms.each do |form|
- result = form.find_select_option(option_text)
- return result if result
- end
-
- nil
- end
-
-
- def find_link(text, selector = nil)
- matching_links = []
-
- links_within(selector).each do |possible_link|
- matching_links << possible_link if possible_link.matches_text?(text)
- end
-
- if matching_links.any?
- matching_links.sort_by { |l| l.text.length }.first
- else
- flunk("Could not find link with text #{text.inspect}")
- end
- end
-
- def find_field(id_or_name_or_label, *field_types)
- forms.each do |form|
- result = form.find_field(id_or_name_or_label, *field_types)
- return result if result
- end
-
- flunk("Could not find #{field_types.inspect}: #{id_or_name_or_label.inspect}")
- end
-
- def request_page(url, method, data)
- debug_log "REQUESTING PAGE: #{method.to_s.upcase} #{url} with #{data.inspect}"
-
- session.send "#{method}", url, data || {}
+ session.request_page(@url, @method, @data)
- if session.response_body =~ /Exception caught/
- save_and_open
- end
+ save_and_open if session.exception_caught?
- flunk("Page load was not successful (Code: #{session.response_code.inspect})") unless (200..299).include?(session.response_code)
- reset_dom
+ flunk("Page load was not successful (Code: #{session.response_code.inspect})") unless session.success_code?
+ reset_scope
end
- def reset_dom
- @dom = nil
- @forms = nil
+ def reset_scope
+ @scope = nil
end
- def links_within(selector)
- (dom / selector / "a[@href]").map do |link_element|
- Link.new(self, link_element)
- end
- end
-
- def forms
- return @forms if @forms
-
- @forms = (dom / "form").map do |form_element|
- Form.new(self, form_element)
- end
- end
-
- def dom # :nodoc:
- return @dom if defined?(@dom) && @dom
- flunk("You must visit a path before working with the page.") unless @session.response_code
- @dom = Hpricot(@session.response_body)
+ def scope
+ @scope ||= Scope.new(self, session.response_body)
end
def flunk(message)
diff --git a/lib/webrat/core/scope.rb b/lib/webrat/core/scope.rb
new file mode 100644
index 0000000..f6ae23a
--- /dev/null
+++ b/lib/webrat/core/scope.rb
@@ -0,0 +1,61 @@
+module Webrat
+ class Scope
+
+ def initialize(page, html)
+ @page = page
+ @html = html
+ end
+
+ def find_select_option(option_text)
+ forms.each do |form|
+ result = form.find_select_option(option_text)
+ return result if result
+ end
+
+ nil
+ end
+
+ def find_link(text, selector = nil)
+ matching_links = []
+
+ links_within(selector).each do |possible_link|
+ matching_links << possible_link if possible_link.matches_text?(text)
+ end
+
+ if matching_links.any?
+ matching_links.sort_by { |l| l.text.length }.first
+ else
+ flunk("Could not find link with text #{text.inspect}")
+ end
+ end
+
+ def find_field(id_or_name_or_label, *field_types)
+ forms.each do |form|
+ result = form.find_field(id_or_name_or_label, *field_types)
+ return result if result
+ end
+
+ flunk("Could not find #{field_types.inspect}: #{id_or_name_or_label.inspect}")
+ end
+
+ def links_within(selector)
+ (dom / selector / "a[@href]").map do |link_element|
+ Link.new(@page, link_element)
+ end
+ end
+
+ def forms
+ return @forms if @forms
+
+ @forms = (dom / "form").map do |form_element|
+ Form.new(@page, form_element)
+ end
+ end
+
+ def dom # :nodoc:
+ return @dom if defined?(@dom) && @dom
+ @dom = Hpricot(@html)
+ end
+
+ end
+end
\ No newline at end of file
diff --git a/lib/webrat/core/session.rb b/lib/webrat/core/session.rb
index 987a46a..f52c7fe 100644
--- a/lib/webrat/core/session.rb
+++ b/lib/webrat/core/session.rb
@@ -9,6 +9,19 @@ module Webrat
File.expand_path(".")
end
+ def request_page(url, method, data)
+ debug_log "REQUESTING PAGE: #{method.to_s.upcase} #{url} with #{data.inspect}"
+ send "#{method}", url, data || {}
+ end
+
+ def success_code?
+ (200..299).include?(response_code)
+ end
+
+ def exception_caught?
+ response_body =~ /Exception caught/
+ end
+
def current_page
@current_page ||= Page.new(self)
end