mkuklis-webrat 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +4 -0
- data/.gitignore +15 -0
- data/History.txt +413 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +188 -0
- data/VERSION +1 -0
- data/install.rb +1 -0
- data/lib/webrat/adapters/mechanize.rb +78 -0
- data/lib/webrat/adapters/merb.rb +11 -0
- data/lib/webrat/adapters/rack.rb +25 -0
- data/lib/webrat/adapters/rails.rb +81 -0
- data/lib/webrat/adapters/sinatra.rb +9 -0
- data/lib/webrat/core/configuration.rb +92 -0
- data/lib/webrat/core/elements/area.rb +31 -0
- data/lib/webrat/core/elements/element.rb +33 -0
- data/lib/webrat/core/elements/field.rb +487 -0
- data/lib/webrat/core/elements/form.rb +103 -0
- data/lib/webrat/core/elements/label.rb +31 -0
- data/lib/webrat/core/elements/link.rb +93 -0
- data/lib/webrat/core/elements/select_option.rb +48 -0
- data/lib/webrat/core/locators/area_locator.rb +38 -0
- data/lib/webrat/core/locators/button_locator.rb +54 -0
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
- data/lib/webrat/core/locators/field_locator.rb +25 -0
- data/lib/webrat/core/locators/field_named_locator.rb +41 -0
- data/lib/webrat/core/locators/form_locator.rb +19 -0
- data/lib/webrat/core/locators/label_locator.rb +34 -0
- data/lib/webrat/core/locators/link_locator.rb +74 -0
- data/lib/webrat/core/locators/locator.rb +20 -0
- data/lib/webrat/core/locators/select_option_locator.rb +59 -0
- data/lib/webrat/core/locators.rb +20 -0
- data/lib/webrat/core/logging.rb +23 -0
- data/lib/webrat/core/matchers/have_content.rb +68 -0
- data/lib/webrat/core/matchers/have_selector.rb +74 -0
- data/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/lib/webrat/core/matchers/have_xpath.rb +122 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/methods.rb +64 -0
- data/lib/webrat/core/mime.rb +18 -0
- data/lib/webrat/core/save_and_open_page.rb +48 -0
- data/lib/webrat/core/scope.rb +365 -0
- data/lib/webrat/core/session.rb +306 -0
- data/lib/webrat/core/xml.rb +72 -0
- data/lib/webrat/core.rb +13 -0
- data/lib/webrat/core_extensions/blank.rb +58 -0
- data/lib/webrat/core_extensions/deprecate.rb +8 -0
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
- data/lib/webrat/core_extensions/meta_class.rb +6 -0
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -0
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
- data/lib/webrat/integrations/merb.rb +10 -0
- data/lib/webrat/integrations/rails.rb +25 -0
- data/lib/webrat/integrations/rspec-rails.rb +10 -0
- data/lib/webrat/integrations/selenium.rb +11 -0
- data/lib/webrat/merb.rb +9 -0
- data/lib/webrat/rspec-rails.rb +2 -0
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers/base.rb +54 -0
- data/lib/webrat/selenium/application_servers/external.rb +26 -0
- data/lib/webrat/selenium/application_servers/merb.rb +50 -0
- data/lib/webrat/selenium/application_servers/rails.rb +67 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -0
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
- data/lib/webrat/selenium/matchers/have_content.rb +66 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
- data/lib/webrat/selenium/matchers.rb +4 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -0
- data/lib/webrat/selenium/selenium_session.rb +272 -0
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/lib/webrat/selenium.rb +70 -0
- data/lib/webrat.rb +18 -0
- data/spec/fakes/test_adapter.rb +37 -0
- data/spec/integration/mechanize/Rakefile +7 -0
- data/spec/integration/mechanize/config.ru +2 -0
- data/spec/integration/mechanize/sample_app.rb +20 -0
- data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -0
- data/spec/integration/mechanize/spec/spec_helper.rb +27 -0
- data/spec/integration/merb/.gitignore +21 -0
- data/spec/integration/merb/Rakefile +35 -0
- data/spec/integration/merb/app/controllers/application.rb +2 -0
- data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
- data/spec/integration/merb/app/controllers/testing.rb +27 -0
- data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
- data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
- data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
- data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
- data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
- data/spec/integration/merb/config/environments/development.rb +15 -0
- data/spec/integration/merb/config/environments/rake.rb +11 -0
- data/spec/integration/merb/config/environments/test.rb +14 -0
- data/spec/integration/merb/config/init.rb +25 -0
- data/spec/integration/merb/config/rack.rb +11 -0
- data/spec/integration/merb/config/router.rb +34 -0
- data/spec/integration/merb/spec/spec.opts +1 -0
- data/spec/integration/merb/spec/spec_helper.rb +26 -0
- data/spec/integration/merb/spec/webrat_spec.rb +39 -0
- data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
- data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
- data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
- data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
- data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
- data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
- data/spec/integration/rack/Rakefile +5 -0
- data/spec/integration/rack/app.rb +89 -0
- data/spec/integration/rack/test/helper.rb +21 -0
- data/spec/integration/rack/test/webrat_rack_test.rb +73 -0
- data/spec/integration/rails/.gitignore +3 -0
- data/spec/integration/rails/Rakefile +30 -0
- data/spec/integration/rails/app/controllers/application.rb +15 -0
- data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
- data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
- data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
- data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
- data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
- data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
- data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
- data/spec/integration/rails/app/views/links/show.html.erb +5 -0
- data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
- data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
- data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
- data/spec/integration/rails/config/boot.rb +109 -0
- data/spec/integration/rails/config/environment.rb +12 -0
- data/spec/integration/rails/config/environments/development.rb +17 -0
- data/spec/integration/rails/config/environments/selenium.rb +22 -0
- data/spec/integration/rails/config/environments/test.rb +22 -0
- data/spec/integration/rails/config/initializers/inflections.rb +10 -0
- data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
- data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
- data/spec/integration/rails/config/locales/en.yml +5 -0
- data/spec/integration/rails/config/routes.rb +19 -0
- data/spec/integration/rails/public/404.html +30 -0
- data/spec/integration/rails/public/422.html +30 -0
- data/spec/integration/rails/public/500.html +33 -0
- data/spec/integration/rails/script/about +4 -0
- data/spec/integration/rails/script/console +3 -0
- data/spec/integration/rails/script/dbconsole +3 -0
- data/spec/integration/rails/script/destroy +3 -0
- data/spec/integration/rails/script/generate +3 -0
- data/spec/integration/rails/script/performance/benchmarker +3 -0
- data/spec/integration/rails/script/performance/profiler +3 -0
- data/spec/integration/rails/script/performance/request +3 -0
- data/spec/integration/rails/script/plugin +3 -0
- data/spec/integration/rails/script/process/inspector +3 -0
- data/spec/integration/rails/script/process/reaper +3 -0
- data/spec/integration/rails/script/process/spawner +3 -0
- data/spec/integration/rails/script/runner +3 -0
- data/spec/integration/rails/script/server +3 -0
- data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
- data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
- data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
- data/spec/integration/rails/test/integration/webrat_test.rb +122 -0
- data/spec/integration/rails/test/test_helper.rb +26 -0
- data/spec/integration/sinatra/Rakefile +5 -0
- data/spec/integration/sinatra/classic_app.rb +64 -0
- data/spec/integration/sinatra/modular_app.rb +16 -0
- data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
- data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
- data/spec/integration/sinatra/test/test_helper.rb +17 -0
- data/spec/private/core/configuration_spec.rb +87 -0
- data/spec/private/core/field_spec.rb +85 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/session_spec.rb +200 -0
- data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -0
- data/spec/private/nokogiri_spec.rb +77 -0
- data/spec/private/rails/attaches_file_spec.rb +81 -0
- data/spec/private/rails/rails_adapter_spec.rb +86 -0
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/spec/public/basic_auth_spec.rb +24 -0
- data/spec/public/check_spec.rb +191 -0
- data/spec/public/choose_spec.rb +118 -0
- data/spec/public/click_area_spec.rb +106 -0
- data/spec/public/click_button_spec.rb +494 -0
- data/spec/public/click_link_spec.rb +511 -0
- data/spec/public/fill_in_spec.rb +224 -0
- data/spec/public/locators/field_by_xpath_spec.rb +19 -0
- data/spec/public/locators/field_labeled_spec.rb +172 -0
- data/spec/public/locators/field_with_id_spec.rb +16 -0
- data/spec/public/matchers/contain_spec.rb +114 -0
- data/spec/public/matchers/have_selector_spec.rb +146 -0
- data/spec/public/matchers/have_tag_spec.rb +39 -0
- data/spec/public/matchers/have_xpath_spec.rb +136 -0
- data/spec/public/reload_spec.rb +10 -0
- data/spec/public/save_and_open_spec.rb +70 -0
- data/spec/public/select_date_spec.rb +112 -0
- data/spec/public/select_datetime_spec.rb +137 -0
- data/spec/public/select_spec.rb +455 -0
- data/spec/public/select_time_spec.rb +100 -0
- data/spec/public/selenium/application_server_factory_spec.rb +49 -0
- data/spec/public/selenium/application_servers/external_spec.rb +12 -0
- data/spec/public/selenium/selenium_session_spec.rb +37 -0
- data/spec/public/set_hidden_field_spec.rb +5 -0
- data/spec/public/submit_form_spec.rb +5 -0
- data/spec/public/visit_spec.rb +58 -0
- data/spec/public/within_spec.rb +177 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +54 -0
- data/vendor/selenium-server.jar +0 -0
- metadata +409 -0
data/Rakefile
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'jeweler'
|
5
|
+
rescue LoadError
|
6
|
+
desc "Install gem using sudo"
|
7
|
+
task(:install) do
|
8
|
+
$stderr.puts "Jeweler not available. `gem install jeweler` to install this gem"
|
9
|
+
end
|
10
|
+
else
|
11
|
+
Jeweler::Tasks.new do |s|
|
12
|
+
s.name = "mkuklis-webrat"
|
13
|
+
s.author = "Bryan Helmkamp"
|
14
|
+
s.email = "bryan" + "@" + "brynary.com"
|
15
|
+
s.homepage = "http://github.com/mkuklis/webrat"
|
16
|
+
s.summary = "Ruby Acceptance Testing for Web applications"
|
17
|
+
s.description = <<-EOS.strip
|
18
|
+
Webrat lets you quickly write expressive and robust acceptance tests
|
19
|
+
for a Ruby web application. It supports simulating a browser inside
|
20
|
+
a Ruby process to avoid the performance hit and browser dependency of
|
21
|
+
Selenium or Watir, but the same API can also be used to drive real
|
22
|
+
Selenium tests when necessary (eg. for testing AJAX interactions).
|
23
|
+
Most Ruby web frameworks and testing frameworks are supported.
|
24
|
+
EOS
|
25
|
+
|
26
|
+
s.rubyforge_project = "webrat"
|
27
|
+
s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
|
28
|
+
|
29
|
+
# Dependencies
|
30
|
+
s.add_dependency "nokogiri", ">= 1.2.0"
|
31
|
+
s.add_dependency "rack", ">= 1.0"
|
32
|
+
|
33
|
+
s.add_development_dependency "rails", ">= 2.3"
|
34
|
+
s.add_development_dependency "merb-core", ">= 1.0"
|
35
|
+
s.add_development_dependency "launchy"
|
36
|
+
end
|
37
|
+
|
38
|
+
Jeweler::RubyforgeTasks.new
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
require 'spec/rake/spectask'
|
43
|
+
rescue LoadError
|
44
|
+
desc "Run specs"
|
45
|
+
task(:spec) { $stderr.puts '`gem install rspec` to run specs' }
|
46
|
+
else
|
47
|
+
desc "Run API and Core specs"
|
48
|
+
Spec::Rake::SpecTask.new do |t|
|
49
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
50
|
+
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Run all specs in spec directory with RCov"
|
54
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
55
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
56
|
+
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
57
|
+
t.rcov = true
|
58
|
+
t.rcov_opts = lambda do
|
59
|
+
IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Run everything against multiruby"
|
65
|
+
task :multiruby do
|
66
|
+
result = system "multiruby -S rake spec"
|
67
|
+
raise "Multiruby tests failed" unless result
|
68
|
+
result = system "jruby -S rake spec"
|
69
|
+
raise "JRuby tests failed" unless result
|
70
|
+
|
71
|
+
Dir.chdir "spec/integration/rails" do
|
72
|
+
result = system "multiruby -S rake test_unit:rails"
|
73
|
+
raise "Rails integration tests failed" unless result
|
74
|
+
|
75
|
+
result = system "jruby -S rake test_unit:rails"
|
76
|
+
raise "Rails integration tests failed" unless result
|
77
|
+
end
|
78
|
+
|
79
|
+
Dir.chdir "spec/integration/merb" do
|
80
|
+
result = system "multiruby -S rake spec"
|
81
|
+
raise "Merb integration tests failed" unless result
|
82
|
+
|
83
|
+
result = system "jruby -S rake spec"
|
84
|
+
raise "Rails integration tests failed" unless result
|
85
|
+
end
|
86
|
+
|
87
|
+
Dir.chdir "spec/integration/sinatra" do
|
88
|
+
result = system "multiruby -S rake test"
|
89
|
+
raise "Sinatra integration tests failed" unless result
|
90
|
+
|
91
|
+
result = system "jruby -S rake test"
|
92
|
+
raise "Sinatra integration tests failed" unless result
|
93
|
+
end
|
94
|
+
|
95
|
+
Dir.chdir "spec/integration/rack" do
|
96
|
+
result = system "multiruby -S rake test"
|
97
|
+
raise "Rack integration tests failed" unless result
|
98
|
+
|
99
|
+
result = system "jruby -S rake test"
|
100
|
+
raise "Rack integration tests failed" unless result
|
101
|
+
end
|
102
|
+
|
103
|
+
puts
|
104
|
+
puts "Multiruby OK!"
|
105
|
+
end
|
106
|
+
|
107
|
+
desc "Run each spec in isolation to test for dependency issues"
|
108
|
+
task :spec_deps do
|
109
|
+
Dir["spec/**/*_spec.rb"].each do |test|
|
110
|
+
if !system("spec #{test} &> /dev/null")
|
111
|
+
puts "Dependency Issues: #{test}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
namespace :spec do
|
117
|
+
desc "Run the integration specs"
|
118
|
+
task :integration => [
|
119
|
+
"integration:rack",
|
120
|
+
"integration:sinatra",
|
121
|
+
"integration:merb",
|
122
|
+
"integration:mechanize",
|
123
|
+
"integration:rails:webrat",
|
124
|
+
"integration:rails:selenium",
|
125
|
+
]
|
126
|
+
|
127
|
+
namespace :integration do
|
128
|
+
namespace :rails do
|
129
|
+
task :selenium do
|
130
|
+
Dir.chdir "spec/integration/rails" do
|
131
|
+
result = system "rake test_unit:selenium"
|
132
|
+
raise "Rails integration tests failed" unless result
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
task :webrat do
|
137
|
+
Dir.chdir "spec/integration/rails" do
|
138
|
+
result = system "rake test_unit:rails"
|
139
|
+
raise "Rails integration tests failed" unless result
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
desc "Run the Merb integration specs"
|
145
|
+
task :merb do
|
146
|
+
Dir.chdir "spec/integration/merb" do
|
147
|
+
result = system "rake spec"
|
148
|
+
raise "Merb integration tests failed" unless result
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
desc "Run the Sinatra integration specs"
|
153
|
+
task :sinatra do
|
154
|
+
Dir.chdir "spec/integration/sinatra" do
|
155
|
+
result = system "rake test"
|
156
|
+
raise "Sinatra integration tests failed" unless result
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
desc "Run the Sinatra integration specs"
|
161
|
+
task :rack do
|
162
|
+
Dir.chdir "spec/integration/rack" do
|
163
|
+
result = system "rake test"
|
164
|
+
raise "Rack integration tests failed" unless result
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
desc "Run the Mechanize integration specs"
|
169
|
+
task :mechanize do
|
170
|
+
Dir.chdir "spec/integration/mechanize" do
|
171
|
+
result = system "rake spec"
|
172
|
+
raise "Mechanize integration tests failed" unless result
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
desc 'Removes trailing whitespace'
|
179
|
+
task :whitespace do
|
180
|
+
sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
|
181
|
+
end
|
182
|
+
|
183
|
+
if defined?(Jeweler)
|
184
|
+
task :spec => :check_dependencies
|
185
|
+
task :build => :gemspec
|
186
|
+
end
|
187
|
+
|
188
|
+
task :default => :spec
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
puts IO.read(File.join(File.dirname(__FILE__), 'README.rdoc'))
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "mechanize"
|
2
|
+
|
3
|
+
module Webrat #:nodoc:
|
4
|
+
class MechanizeAdapter #:nodoc:
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_accessor :response
|
8
|
+
alias :page :response
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def request_page(url, http_method, data) #:nodoc:
|
14
|
+
super(absolute_url(url), http_method, data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get(url, data, headers_argument_not_used = nil)
|
18
|
+
@response = mechanize.get(url, data)
|
19
|
+
end
|
20
|
+
|
21
|
+
def post(url, data, headers_argument_not_used = nil)
|
22
|
+
post_data = data.inject({}) do |memo, param|
|
23
|
+
case param.last
|
24
|
+
when Hash
|
25
|
+
param.last.each {|attribute, value| memo["#{param.first}[#{attribute}]"] = value }
|
26
|
+
else
|
27
|
+
memo[param.first] = param.last
|
28
|
+
end
|
29
|
+
memo
|
30
|
+
end
|
31
|
+
@response = mechanize.post(url, post_data)
|
32
|
+
end
|
33
|
+
|
34
|
+
def response_body
|
35
|
+
@response.content
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_code
|
39
|
+
@response.code.to_i
|
40
|
+
end
|
41
|
+
|
42
|
+
def mechanize
|
43
|
+
@mechanize ||= WWW::Mechanize.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def_delegators :mechanize, :basic_auth
|
47
|
+
|
48
|
+
def absolute_url(url) #:nodoc:
|
49
|
+
current_host, current_path = split_current_url
|
50
|
+
if url =~ Regexp.new('^https?://')
|
51
|
+
url
|
52
|
+
elsif url =~ Regexp.new('^/')
|
53
|
+
current_host + url
|
54
|
+
elsif url =~ Regexp.new('^\.')
|
55
|
+
current_host + absolute_path(current_path, url)
|
56
|
+
else
|
57
|
+
url
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def split_current_url
|
63
|
+
current_url =~ Regexp.new('^(https?://[^/]+)(/.*)?')
|
64
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
65
|
+
end
|
66
|
+
|
67
|
+
def absolute_path(current_path, url)
|
68
|
+
levels_up = url.split('/').find_all { |x| x == '..' }.size
|
69
|
+
ancestor = if current_path.nil?
|
70
|
+
""
|
71
|
+
else
|
72
|
+
current_path.split("/")[0..(-1 - levels_up)].join("/")
|
73
|
+
end
|
74
|
+
descendent = url.split("/")[levels_up..-1].join
|
75
|
+
"#{ancestor}/#{descendent}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "webrat/integrations/merb"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
class MerbAdapter < RackAdapter #:nodoc:
|
5
|
+
def initialize(context=nil)
|
6
|
+
app = context.respond_to?(:app) ?
|
7
|
+
context.app : Merb::Rack::Application.new
|
8
|
+
super(Rack::Test::Session.new(Rack::MockSession.new(app, "www.example.com")))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "rack/test"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
class RackAdapter
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators :@session, :get, :post, :put, :delete
|
8
|
+
|
9
|
+
def initialize(session) #:nodoc:
|
10
|
+
@session = session
|
11
|
+
end
|
12
|
+
|
13
|
+
def response_body
|
14
|
+
response.body
|
15
|
+
end
|
16
|
+
|
17
|
+
def response_code
|
18
|
+
response.status
|
19
|
+
end
|
20
|
+
|
21
|
+
def response
|
22
|
+
@session.last_response
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "webrat/integrations/rails"
|
2
|
+
require "action_controller/record_identifier"
|
3
|
+
|
4
|
+
module Webrat
|
5
|
+
class RailsAdapter #:nodoc:
|
6
|
+
include ActionController::RecordIdentifier
|
7
|
+
|
8
|
+
attr_reader :integration_session
|
9
|
+
|
10
|
+
def initialize(session)
|
11
|
+
@integration_session = session
|
12
|
+
end
|
13
|
+
|
14
|
+
def doc_root
|
15
|
+
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def saved_page_dir
|
19
|
+
File.expand_path(File.join(RAILS_ROOT, "tmp"))
|
20
|
+
end
|
21
|
+
|
22
|
+
def get(url, data, headers = nil)
|
23
|
+
do_request(:get, url, data, headers)
|
24
|
+
end
|
25
|
+
|
26
|
+
def post(url, data, headers = nil)
|
27
|
+
do_request(:post, url, data, headers)
|
28
|
+
end
|
29
|
+
|
30
|
+
def put(url, data, headers = nil)
|
31
|
+
do_request(:put, url, data, headers)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(url, data, headers = nil)
|
35
|
+
do_request(:delete, url, data, headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_body
|
39
|
+
response.body
|
40
|
+
end
|
41
|
+
|
42
|
+
def response_code
|
43
|
+
response.code.to_i
|
44
|
+
end
|
45
|
+
|
46
|
+
def xml_content_type?
|
47
|
+
response.headers["Content-Type"].to_s =~ /xml/
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
def do_request(http_method, url, data, headers) #:nodoc:
|
53
|
+
update_protocol(url)
|
54
|
+
integration_session.send(http_method, normalize_url(url), data, headers)
|
55
|
+
end
|
56
|
+
|
57
|
+
# remove protocol, host and anchor
|
58
|
+
def normalize_url(href) #:nodoc:
|
59
|
+
uri = URI.parse(href)
|
60
|
+
normalized_url = []
|
61
|
+
normalized_url << "#{uri.scheme}://" if uri.scheme
|
62
|
+
normalized_url << uri.host if uri.host
|
63
|
+
normalized_url << ":#{uri.port}" if uri.port && ![80,443].include?(uri.port)
|
64
|
+
normalized_url << uri.path if uri.path
|
65
|
+
normalized_url << "?#{uri.query}" if uri.query
|
66
|
+
normalized_url.join
|
67
|
+
end
|
68
|
+
|
69
|
+
def update_protocol(href) #:nodoc:
|
70
|
+
if href =~ /^https:/
|
71
|
+
integration_session.https!(true)
|
72
|
+
elsif href =~ /^http:/
|
73
|
+
integration_session.https!(false)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def response #:nodoc:
|
78
|
+
integration_session.response
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require "webrat/core_extensions/deprecate"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
|
5
|
+
# Configures Webrat. If this is not done, Webrat will be created
|
6
|
+
# with all of the default settings.
|
7
|
+
def self.configure(configuration = Webrat.configuration)
|
8
|
+
yield configuration if block_given?
|
9
|
+
@@configuration = configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.configuration # :nodoc:
|
13
|
+
@@configuration ||= Webrat::Configuration.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Webrat can be configured using the Webrat.configure method. For example:
|
17
|
+
#
|
18
|
+
# Webrat.configure do |config|
|
19
|
+
# config.mode = :sinatra
|
20
|
+
# end
|
21
|
+
class Configuration
|
22
|
+
|
23
|
+
# Webrat's mode, set automatically when requiring webrat/rails, webrat/merb, etc.
|
24
|
+
attr_reader :mode # :nodoc:
|
25
|
+
|
26
|
+
# Save and open pages with error status codes (500-599) in a browser? Defualts to true.
|
27
|
+
attr_writer :open_error_files
|
28
|
+
|
29
|
+
# Which rails environment should the selenium tests be run in? Defaults to selenium.
|
30
|
+
attr_accessor :application_environment
|
31
|
+
webrat_deprecate :selenium_environment, :application_environment
|
32
|
+
webrat_deprecate :selenium_environment=, :application_environment=
|
33
|
+
|
34
|
+
# Which port is the application running on for selenium testing? Defaults to 3001.
|
35
|
+
attr_accessor :application_port
|
36
|
+
webrat_deprecate :selenium_port, :application_port
|
37
|
+
webrat_deprecate :selenium_port=, :application_port=
|
38
|
+
|
39
|
+
# Which underlying app framework we're testing with selenium
|
40
|
+
attr_accessor :application_framework
|
41
|
+
|
42
|
+
# Which server the application is running on for selenium testing? Defaults to localhost
|
43
|
+
attr_accessor :application_address
|
44
|
+
|
45
|
+
# Which server Selenium server is running on. Defaults to nil(server starts in webrat process and runs locally)
|
46
|
+
attr_accessor :selenium_server_address
|
47
|
+
|
48
|
+
# Which server Selenium port is running on. Defaults to 4444
|
49
|
+
attr_accessor :selenium_server_port
|
50
|
+
|
51
|
+
# Set the key that Selenium uses to determine the browser running. Default *firefox
|
52
|
+
attr_accessor :selenium_browser_key
|
53
|
+
|
54
|
+
# Set the timeout for waiting for the browser process to start
|
55
|
+
attr_accessor :selenium_browser_startup_timeout
|
56
|
+
|
57
|
+
# How many redirects to the same URL should be halted as an infinite redirect
|
58
|
+
# loop? Defaults to 10
|
59
|
+
attr_accessor :infinite_redirect_limit
|
60
|
+
|
61
|
+
def initialize # :nodoc:
|
62
|
+
self.open_error_files = true
|
63
|
+
self.application_environment = :test
|
64
|
+
self.application_port = 3001
|
65
|
+
self.application_address = 'localhost'
|
66
|
+
self.application_framework = :rails
|
67
|
+
self.selenium_server_port = 4444
|
68
|
+
self.infinite_redirect_limit = 10
|
69
|
+
self.selenium_browser_key = '*firefox'
|
70
|
+
self.selenium_browser_startup_timeout = 5
|
71
|
+
end
|
72
|
+
|
73
|
+
def open_error_files? #:nodoc:
|
74
|
+
@open_error_files ? true : false
|
75
|
+
end
|
76
|
+
|
77
|
+
# Allows setting of webrat's mode, valid modes are:
|
78
|
+
# :rails, :selenium, :rack, :sinatra, :mechanize, :merb
|
79
|
+
def mode=(mode)
|
80
|
+
@mode = mode.to_sym
|
81
|
+
|
82
|
+
begin
|
83
|
+
require("webrat/integrations/#{mode}")
|
84
|
+
rescue LoadError
|
85
|
+
# Only some modes have integration code that needs to
|
86
|
+
# be loaded, so this is OK
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "webrat/core/elements/element"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
class Area < Element #:nodoc:
|
5
|
+
|
6
|
+
def self.xpath_search
|
7
|
+
[".//area"]
|
8
|
+
end
|
9
|
+
|
10
|
+
def click(method = nil, options = {})
|
11
|
+
@session.request_page(absolute_href, :get, {})
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def href
|
17
|
+
@element["href"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def absolute_href
|
21
|
+
if href =~ /^\?/
|
22
|
+
"#{@session.current_url}#{href}"
|
23
|
+
elsif href !~ %r{^https?://[\w|.]+(/.*)} && (href !~ /^\//)
|
24
|
+
"#{@session.current_url}/#{href}"
|
25
|
+
else
|
26
|
+
href
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Webrat
|
2
|
+
|
3
|
+
class Element # :nodoc:
|
4
|
+
|
5
|
+
def self.load_all(session, dom)
|
6
|
+
dom.xpath(*xpath_search).map do |element|
|
7
|
+
load(session, element)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load(session, element)
|
12
|
+
return nil if element.nil?
|
13
|
+
session.elements[element.path] ||= self.new(session, element)
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :element
|
17
|
+
|
18
|
+
def initialize(session, element)
|
19
|
+
@session = session
|
20
|
+
@element = element
|
21
|
+
end
|
22
|
+
|
23
|
+
def path
|
24
|
+
@element.path
|
25
|
+
end
|
26
|
+
|
27
|
+
def inspect
|
28
|
+
"#<#{self.class} @element=#{element.inspect}>"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|