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
@@ -0,0 +1,272 @@
|
|
1
|
+
require "webrat/core/save_and_open_page"
|
2
|
+
require "webrat/selenium/selenium_rc_server"
|
3
|
+
require "webrat/selenium/application_server_factory"
|
4
|
+
require "webrat/selenium/application_servers/base"
|
5
|
+
|
6
|
+
require "selenium"
|
7
|
+
|
8
|
+
module Webrat
|
9
|
+
class TimeoutError < WebratError
|
10
|
+
end
|
11
|
+
|
12
|
+
class SeleniumResponse
|
13
|
+
attr_reader :body
|
14
|
+
attr_reader :session
|
15
|
+
|
16
|
+
def initialize(session, body)
|
17
|
+
@session = session
|
18
|
+
@body = body
|
19
|
+
end
|
20
|
+
|
21
|
+
def selenium
|
22
|
+
session.selenium
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SeleniumSession
|
27
|
+
include Webrat::SaveAndOpenPage
|
28
|
+
include Webrat::Selenium::SilenceStream
|
29
|
+
|
30
|
+
def initialize(*args) # :nodoc:
|
31
|
+
end
|
32
|
+
|
33
|
+
def simulate
|
34
|
+
end
|
35
|
+
|
36
|
+
def automate
|
37
|
+
yield
|
38
|
+
end
|
39
|
+
|
40
|
+
def visit(url)
|
41
|
+
selenium.open(url)
|
42
|
+
end
|
43
|
+
|
44
|
+
webrat_deprecate :visits, :visit
|
45
|
+
|
46
|
+
def fill_in(field_identifier, options)
|
47
|
+
locator = "webrat=#{field_identifier}"
|
48
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
49
|
+
selenium.type(locator, "#{options[:with]}")
|
50
|
+
end
|
51
|
+
|
52
|
+
webrat_deprecate :fills_in, :fill_in
|
53
|
+
|
54
|
+
def response
|
55
|
+
SeleniumResponse.new(self, response_body)
|
56
|
+
end
|
57
|
+
|
58
|
+
def response_body #:nodoc:
|
59
|
+
selenium.get_html_source
|
60
|
+
end
|
61
|
+
|
62
|
+
def current_url
|
63
|
+
selenium.location
|
64
|
+
end
|
65
|
+
|
66
|
+
def click_button(button_text_or_regexp = nil, options = {})
|
67
|
+
if button_text_or_regexp.is_a?(Hash) && options == {}
|
68
|
+
pattern, options = nil, button_text_or_regexp
|
69
|
+
elsif button_text_or_regexp
|
70
|
+
pattern = adjust_if_regexp(button_text_or_regexp)
|
71
|
+
end
|
72
|
+
pattern ||= '*'
|
73
|
+
locator = "button=#{pattern}"
|
74
|
+
|
75
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
76
|
+
selenium.click locator
|
77
|
+
end
|
78
|
+
|
79
|
+
webrat_deprecate :clicks_button, :click_button
|
80
|
+
|
81
|
+
def click_link(link_text_or_regexp, options = {})
|
82
|
+
if link_text_or_regexp.is_a?(Regexp)
|
83
|
+
pattern = "evalregex:#{link_text_or_regexp.inspect}"
|
84
|
+
else
|
85
|
+
pattern = link_text_or_regexp.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
locator = "webratlink=#{pattern}"
|
89
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
90
|
+
selenium.click locator
|
91
|
+
end
|
92
|
+
|
93
|
+
webrat_deprecate :clicks_link, :click_link
|
94
|
+
|
95
|
+
def click_link_within(selector, link_text, options = {})
|
96
|
+
locator = "webratlinkwithin=#{selector}|#{link_text}"
|
97
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
98
|
+
selenium.click locator
|
99
|
+
end
|
100
|
+
|
101
|
+
webrat_deprecate :clicks_link_within, :click_link_within
|
102
|
+
|
103
|
+
def select(option_text, options = {})
|
104
|
+
id_or_name_or_label = options[:from]
|
105
|
+
|
106
|
+
if id_or_name_or_label
|
107
|
+
select_locator = "webrat=#{id_or_name_or_label}"
|
108
|
+
else
|
109
|
+
select_locator = "webratselectwithoption=#{option_text}"
|
110
|
+
end
|
111
|
+
|
112
|
+
selenium.wait_for_element select_locator, :timeout_in_seconds => 5
|
113
|
+
selenium.select(select_locator, option_text)
|
114
|
+
end
|
115
|
+
|
116
|
+
webrat_deprecate :selects, :select
|
117
|
+
|
118
|
+
def choose(label_text)
|
119
|
+
locator = "webrat=#{label_text}"
|
120
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
121
|
+
selenium.click locator
|
122
|
+
end
|
123
|
+
|
124
|
+
webrat_deprecate :chooses, :choose
|
125
|
+
|
126
|
+
def attach_file(field_locator, path, content_type = nil)
|
127
|
+
fill_in(field_locator, :with => path)
|
128
|
+
end
|
129
|
+
|
130
|
+
def check(label_text)
|
131
|
+
locator = "webrat=#{label_text}"
|
132
|
+
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
133
|
+
selenium.click locator
|
134
|
+
end
|
135
|
+
|
136
|
+
alias_method :uncheck, :check
|
137
|
+
|
138
|
+
webrat_deprecate :checks, :check
|
139
|
+
|
140
|
+
def fire_event(field_identifier, event)
|
141
|
+
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
142
|
+
selenium.fire_event(locator, "#{event}")
|
143
|
+
end
|
144
|
+
|
145
|
+
def key_down(field_identifier, key_code)
|
146
|
+
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
147
|
+
selenium.key_down(locator, key_code)
|
148
|
+
end
|
149
|
+
|
150
|
+
def key_up(field_identifier, key_code)
|
151
|
+
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
152
|
+
selenium.key_up(locator, key_code)
|
153
|
+
end
|
154
|
+
|
155
|
+
def wait_for(params={})
|
156
|
+
timeout = params[:timeout] || 5
|
157
|
+
message = params[:message] || "Timeout exceeded"
|
158
|
+
|
159
|
+
begin_time = Time.now
|
160
|
+
|
161
|
+
while (Time.now - begin_time) < timeout
|
162
|
+
value = nil
|
163
|
+
|
164
|
+
begin
|
165
|
+
value = yield
|
166
|
+
rescue Exception => e
|
167
|
+
unless is_ignorable_wait_for_exception?(e)
|
168
|
+
raise e
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
return value if value
|
173
|
+
|
174
|
+
sleep 0.25
|
175
|
+
end
|
176
|
+
|
177
|
+
error_message = "#{message} (after #{timeout} sec)"
|
178
|
+
|
179
|
+
if $browser
|
180
|
+
error_message += <<-EOS
|
181
|
+
|
182
|
+
|
183
|
+
HTML of the page was:
|
184
|
+
|
185
|
+
#{selenium.get_html_source}"
|
186
|
+
EOS
|
187
|
+
end
|
188
|
+
|
189
|
+
raise Webrat::TimeoutError.new(error_message)
|
190
|
+
true
|
191
|
+
end
|
192
|
+
|
193
|
+
def selenium
|
194
|
+
return $browser if $browser
|
195
|
+
setup
|
196
|
+
$browser
|
197
|
+
end
|
198
|
+
|
199
|
+
webrat_deprecate :browser, :selenium
|
200
|
+
|
201
|
+
|
202
|
+
def save_and_open_screengrab
|
203
|
+
return unless File.exist?(saved_page_dir)
|
204
|
+
|
205
|
+
filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
|
206
|
+
|
207
|
+
if $browser.chrome_backend?
|
208
|
+
$browser.capture_entire_page_screenshot(filename, '')
|
209
|
+
else
|
210
|
+
$browser.capture_screenshot(filename)
|
211
|
+
end
|
212
|
+
open_in_browser(filename)
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
protected
|
217
|
+
def is_ignorable_wait_for_exception?(exception) #:nodoc:
|
218
|
+
if defined?(::Spec::Expectations::ExpectationNotMetError)
|
219
|
+
return true if exception.class == ::Spec::Expectations::ExpectationNotMetError
|
220
|
+
end
|
221
|
+
return true if [::Selenium::CommandError, Webrat::WebratError].include?(exception.class)
|
222
|
+
return false
|
223
|
+
end
|
224
|
+
|
225
|
+
def setup #:nodoc:
|
226
|
+
Webrat::Selenium::SeleniumRCServer.boot
|
227
|
+
Webrat::Selenium::ApplicationServerFactory.app_server_instance.boot
|
228
|
+
|
229
|
+
create_browser
|
230
|
+
$browser.start
|
231
|
+
|
232
|
+
extend_selenium
|
233
|
+
define_location_strategies
|
234
|
+
$browser.window_maximize
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
def create_browser
|
239
|
+
$browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
|
240
|
+
Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
|
241
|
+
$browser.set_speed(0) unless Webrat.configuration.selenium_server_address
|
242
|
+
|
243
|
+
at_exit do
|
244
|
+
silence_stream(STDOUT) do
|
245
|
+
$browser.stop
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
def adjust_if_regexp(text_or_regexp) #:nodoc:
|
251
|
+
if text_or_regexp.is_a?(Regexp)
|
252
|
+
"evalregex:#{text_or_regexp.inspect}"
|
253
|
+
else
|
254
|
+
"evalregex:/#{text_or_regexp}/"
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def extend_selenium #:nodoc:
|
259
|
+
extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
|
260
|
+
extenions_js = File.read(extensions_file)
|
261
|
+
selenium.get_eval(extenions_js)
|
262
|
+
end
|
263
|
+
|
264
|
+
def define_location_strategies #:nodoc:
|
265
|
+
Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
|
266
|
+
strategy_js = File.read(file)
|
267
|
+
strategy_name = File.basename(file, '.js')
|
268
|
+
selenium.add_location_strategy(strategy_name, strategy_js)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Webrat
|
2
|
+
module Selenium
|
3
|
+
module SilenceStream
|
4
|
+
# active_support already defines silence_stream, no need to do that again if it's already present.
|
5
|
+
# http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
|
6
|
+
unless Kernel.respond_to?(:silence_stream)
|
7
|
+
def silence_stream(stream)
|
8
|
+
old_stream = stream.dup
|
9
|
+
stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
10
|
+
stream.sync = true
|
11
|
+
yield
|
12
|
+
ensure
|
13
|
+
stream.reopen(old_stream)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "webrat"
|
2
|
+
require "selenium/client"
|
3
|
+
require "webrat/selenium/silence_stream"
|
4
|
+
require "webrat/selenium/selenium_session"
|
5
|
+
require "webrat/selenium/matchers"
|
6
|
+
require "webrat/core_extensions/tcp_socket"
|
7
|
+
|
8
|
+
module Webrat
|
9
|
+
# To use Webrat's Selenium support, you'll need the selenium-client gem installed.
|
10
|
+
# Activate it with (for example, in your <tt>env.rb</tt>):
|
11
|
+
#
|
12
|
+
# require "webrat"
|
13
|
+
#
|
14
|
+
# Webrat.configure do |config|
|
15
|
+
# config.mode = :selenium
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# == Dropping down to the selenium-client API
|
19
|
+
#
|
20
|
+
# If you ever need to do something with Selenium not provided in the Webrat API,
|
21
|
+
# you can always drop down to the selenium-client API using the <tt>selenium</tt> method.
|
22
|
+
# For example:
|
23
|
+
#
|
24
|
+
# When "I drag the photo to the left" do
|
25
|
+
# selenium.dragdrop("id=photo_123", "+350, 0")
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# == Choosing the underlying framework to test
|
29
|
+
#
|
30
|
+
# Webrat assumes you're using rails by default but it can also work with sinatra
|
31
|
+
# and merb. To take advantage of this you can use the configuration block to
|
32
|
+
# set the application_framework variable.
|
33
|
+
# require "webrat"
|
34
|
+
#
|
35
|
+
# Webrat.configure do |config|
|
36
|
+
# config.mode = :selenium
|
37
|
+
# config.application_port = 4567
|
38
|
+
# config.application_framework = :sinatra # could also be :merb
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# == Auto-starting of the appserver and java server
|
42
|
+
#
|
43
|
+
# Webrat will automatically start the Selenium Java server process and an instance
|
44
|
+
# of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
|
45
|
+
# instead of "test", so ensure you've got that defined, and will run on port
|
46
|
+
# Webrat.configuration.application_port.
|
47
|
+
#
|
48
|
+
# == Waiting
|
49
|
+
#
|
50
|
+
# In order to make writing Selenium tests as easy as possible, Webrat will automatically
|
51
|
+
# wait for the correct elements to exist on the page when trying to manipulate them
|
52
|
+
# with methods like <tt>fill_in</tt>, etc. In general, this means you should be able to write
|
53
|
+
# your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
|
54
|
+
# testing, so long as you're using the Webrat API.
|
55
|
+
module Selenium
|
56
|
+
module Methods
|
57
|
+
def response
|
58
|
+
webrat_session.response
|
59
|
+
end
|
60
|
+
|
61
|
+
def wait_for(*args, &block)
|
62
|
+
webrat_session.wait_for(*args, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
def save_and_open_screengrab
|
66
|
+
webrat_session.save_and_open_screengrab
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/webrat.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "rack"
|
2
|
+
require "nokogiri"
|
3
|
+
|
4
|
+
module Webrat
|
5
|
+
VERSION = "0.6.rc1"
|
6
|
+
|
7
|
+
autoload :MechanizeAdapter, "webrat/adapters/mechanize"
|
8
|
+
autoload :MerbAdapter, "webrat/adapters/merb"
|
9
|
+
autoload :RackAdapter, "webrat/adapters/rack"
|
10
|
+
autoload :RailsAdapter, "webrat/adapters/rails"
|
11
|
+
autoload :SinatraAdapter, "webrat/adapters/sinatra"
|
12
|
+
|
13
|
+
# The common base class for all exceptions raised by Webrat.
|
14
|
+
class WebratError < StandardError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
require "webrat/core"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Webrat #:nodoc:
|
2
|
+
def self.adapter_class #:nodoc:
|
3
|
+
TestAdapter
|
4
|
+
end
|
5
|
+
|
6
|
+
class TestAdapter #:nodoc:
|
7
|
+
attr_accessor :response_body
|
8
|
+
attr_writer :response_code
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
end
|
12
|
+
|
13
|
+
def doc_root
|
14
|
+
File.expand_path(File.join(".", "public"))
|
15
|
+
end
|
16
|
+
|
17
|
+
def response
|
18
|
+
@response ||= Object.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def response_code
|
22
|
+
@response_code || 200
|
23
|
+
end
|
24
|
+
|
25
|
+
def get(url, data, headers = nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
def post(url, data, headers = nil)
|
29
|
+
end
|
30
|
+
|
31
|
+
def put(url, data, headers = nil)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(url, data, headers = nil)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "sinatra/base"
|
3
|
+
|
4
|
+
class SampleApp < Sinatra::Default
|
5
|
+
get "/" do
|
6
|
+
"Hello World"
|
7
|
+
end
|
8
|
+
|
9
|
+
get "/internal_redirect" do
|
10
|
+
redirect URI.join(request.url, "redirected").to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
get "/external_redirect" do
|
14
|
+
redirect "http://example.tst/"
|
15
|
+
end
|
16
|
+
|
17
|
+
get "/redirected" do
|
18
|
+
"Redirected"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
|
3
|
+
describe "Webrat's Mechanize mode" do
|
4
|
+
it "should work" do
|
5
|
+
response = visit("http://localhost:9292/")
|
6
|
+
response.should contain("Hello World")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should follow redirects" do
|
10
|
+
response = visit("http://localhost:9292/internal_redirect")
|
11
|
+
response.should contain("Redirected")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should follow links"
|
15
|
+
it "should submit forms"
|
16
|
+
it "should not follow external redirects" do
|
17
|
+
pending do
|
18
|
+
response = visit("http://localhost:9292/external_redirect")
|
19
|
+
response.should contain("Foo")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "spec"
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + "/../../../../lib"
|
5
|
+
require "webrat"
|
6
|
+
|
7
|
+
Webrat.configure do |config|
|
8
|
+
config.mode = :mechanize
|
9
|
+
end
|
10
|
+
|
11
|
+
Spec::Runner.configure do |config|
|
12
|
+
config.include Webrat::Methods
|
13
|
+
config.include Webrat::Matchers
|
14
|
+
|
15
|
+
config.before :suite do
|
16
|
+
if File.exists?("rack.pid")
|
17
|
+
Process.kill("TERM", File.read("rack.pid").to_i)
|
18
|
+
end
|
19
|
+
|
20
|
+
system "rackup --daemonize --pid rack.pid config.ru"
|
21
|
+
end
|
22
|
+
|
23
|
+
config.after :suite do
|
24
|
+
Process.kill("TERM", File.read("rack.pid").to_i)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.DS_Store
|
2
|
+
log/*
|
3
|
+
tmp/*
|
4
|
+
TAGS
|
5
|
+
*~
|
6
|
+
.#*
|
7
|
+
schema/schema.rb
|
8
|
+
schema/*_structure.sql
|
9
|
+
schema/*.sqlite3
|
10
|
+
schema/*.sqlite
|
11
|
+
schema/*.db
|
12
|
+
*.sqlite
|
13
|
+
*.sqlite3
|
14
|
+
*.db
|
15
|
+
src/*
|
16
|
+
.hgignore
|
17
|
+
.hg/*
|
18
|
+
.svn/*
|
19
|
+
gems/gems/*
|
20
|
+
gems/specifications/*
|
21
|
+
merb_profile_results
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
|
4
|
+
require 'merb-core'
|
5
|
+
require 'merb-core/tasks/merb'
|
6
|
+
|
7
|
+
include FileUtils
|
8
|
+
|
9
|
+
# Load the basic runtime dependencies; this will include
|
10
|
+
# any plugins and therefore plugin rake tasks.
|
11
|
+
init_env = ENV['MERB_ENV'] || 'rake'
|
12
|
+
Merb.load_dependencies(:environment => init_env)
|
13
|
+
|
14
|
+
# Get Merb plugins and dependencies
|
15
|
+
Merb::Plugins.rakefiles.each { |r| require r }
|
16
|
+
|
17
|
+
# Load any app level custom rakefile extensions from lib/tasks
|
18
|
+
tasks_path = File.join(File.dirname(__FILE__), "lib", "tasks")
|
19
|
+
rake_files = Dir["#{tasks_path}/*.rake"]
|
20
|
+
rake_files.each{|rake_file| load rake_file }
|
21
|
+
|
22
|
+
desc "Start runner environment"
|
23
|
+
task :merb_env do
|
24
|
+
Merb.start_environment(:environment => init_env, :adapter => 'runner')
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'spec/rake/spectask'
|
28
|
+
require 'merb-core/test/tasks/spectasks'
|
29
|
+
desc 'Default: run spec examples'
|
30
|
+
task :default => 'spec'
|
31
|
+
|
32
|
+
##############################################################################
|
33
|
+
# ADD YOUR CUSTOM TASKS IN /lib/tasks
|
34
|
+
# NAME YOUR RAKE FILES file_name.rake
|
35
|
+
##############################################################################
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Testing < Application
|
2
|
+
|
3
|
+
def show_form
|
4
|
+
render
|
5
|
+
end
|
6
|
+
|
7
|
+
def upload
|
8
|
+
case request.method
|
9
|
+
when :get then render
|
10
|
+
when :post then
|
11
|
+
uploaded_file = params[:uploaded_file]
|
12
|
+
render [uploaded_file[:filename], uploaded_file[:tempfile].class.name].inspect
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def submit_form
|
17
|
+
end
|
18
|
+
|
19
|
+
def internal_redirect
|
20
|
+
redirect "/"
|
21
|
+
end
|
22
|
+
|
23
|
+
def external_redirect
|
24
|
+
redirect "http://google.com"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<div id="container">
|
2
|
+
<div id="header-container">
|
3
|
+
<img src="/images/merb.jpg" />
|
4
|
+
<!-- <h1>Mongrel + Erb</h1> -->
|
5
|
+
<h2>pocket rocket web framework</h2>
|
6
|
+
<hr />
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div id="left-container">
|
10
|
+
<h3>Exception:</h3>
|
11
|
+
<p><%= request.exceptions.first.message %></p>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div id="main-container">
|
15
|
+
<h3>Why am I seeing this page?</h3>
|
16
|
+
<p>Merb couldn't find an appropriate content_type to return,
|
17
|
+
based on what you said was available via provides() and
|
18
|
+
what the client requested.</p>
|
19
|
+
|
20
|
+
<h3>How to add a mime-type</h3>
|
21
|
+
<pre><code>
|
22
|
+
Merb.add_mime_type :pdf, :to_pdf, %w[application/pdf], "Content-Encoding" => "gzip"
|
23
|
+
</code></pre>
|
24
|
+
<h3>What this means is:</h3>
|
25
|
+
<ul>
|
26
|
+
<li>Add a mime-type for :pdf</li>
|
27
|
+
<li>Register the method for converting objects to PDF as <code>#to_pdf</code>.</li>
|
28
|
+
<li>Register the incoming mime-type "Accept" header as <code>application/pdf</code>.</li>
|
29
|
+
<li>Specify a new header for PDF types so it will set <code>Content-Encoding</code> to gzip.</li>
|
30
|
+
</ul>
|
31
|
+
|
32
|
+
<h3>You can then do:</h3>
|
33
|
+
<pre><code>
|
34
|
+
class Foo < Application
|
35
|
+
provides :pdf
|
36
|
+
end
|
37
|
+
</code></pre>
|
38
|
+
|
39
|
+
<h3>Where can I find help?</h3>
|
40
|
+
<p>If you have any questions or if you can't figure something out, please take a
|
41
|
+
look at our <a href="http://merbivore.com/"> project page</a>,
|
42
|
+
feel free to come chat at irc.freenode.net, channel #merb,
|
43
|
+
or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
|
44
|
+
on Google Groups.</p>
|
45
|
+
|
46
|
+
<h3>What if I've found a bug?</h3>
|
47
|
+
<p>If you want to file a bug or make your own contribution to Merb,
|
48
|
+
feel free to register and create a ticket at our
|
49
|
+
<a href="http://merb.lighthouseapp.com/">project development page</a>
|
50
|
+
on Lighthouse.</p>
|
51
|
+
|
52
|
+
<h3>How do I edit this page?</h3>
|
53
|
+
<p>You can change what people see when this happens by editing <tt>app/views/exceptions/not_acceptable.html.erb</tt>.</p>
|
54
|
+
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div id="footer-container">
|
58
|
+
<hr />
|
59
|
+
<div class="left"></div>
|
60
|
+
<div class="right">© 2008 the merb dev team</div>
|
61
|
+
<p> </p>
|
62
|
+
</div>
|
63
|
+
</div>
|