webrat 0.4.4 → 0.4.5

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.
Files changed (203) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +44 -8
  4. data/Rakefile +80 -66
  5. data/VERSION +1 -0
  6. data/lib/webrat.rb +7 -12
  7. data/lib/webrat/core/configuration.rb +7 -3
  8. data/lib/webrat/core/elements/area.rb +7 -7
  9. data/lib/webrat/core/elements/element.rb +11 -11
  10. data/lib/webrat/core/elements/field.rb +63 -55
  11. data/lib/webrat/core/elements/form.rb +17 -17
  12. data/lib/webrat/core/elements/label.rb +6 -6
  13. data/lib/webrat/core/elements/link.rb +13 -12
  14. data/lib/webrat/core/elements/select_option.rb +9 -9
  15. data/lib/webrat/core/locators.rb +2 -2
  16. data/lib/webrat/core/locators/area_locator.rb +10 -10
  17. data/lib/webrat/core/locators/button_locator.rb +13 -13
  18. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  19. data/lib/webrat/core/locators/field_labeled_locator.rb +11 -11
  20. data/lib/webrat/core/locators/field_locator.rb +7 -7
  21. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  22. data/lib/webrat/core/locators/form_locator.rb +6 -6
  23. data/lib/webrat/core/locators/label_locator.rb +9 -9
  24. data/lib/webrat/core/locators/link_locator.rb +21 -13
  25. data/lib/webrat/core/locators/locator.rb +5 -5
  26. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  27. data/lib/webrat/core/logging.rb +7 -4
  28. data/lib/webrat/core/matchers/have_content.rb +12 -12
  29. data/lib/webrat/core/matchers/have_selector.rb +9 -9
  30. data/lib/webrat/core/matchers/have_tag.rb +4 -4
  31. data/lib/webrat/core/matchers/have_xpath.rb +26 -26
  32. data/lib/webrat/core/methods.rb +13 -11
  33. data/lib/webrat/core/mime.rb +3 -3
  34. data/lib/webrat/core/save_and_open_page.rb +14 -16
  35. data/lib/webrat/core/scope.rb +53 -53
  36. data/lib/webrat/core/session.rb +23 -14
  37. data/lib/webrat/core/xml.rb +16 -16
  38. data/lib/webrat/core/xml/hpricot.rb +3 -3
  39. data/lib/webrat/core/xml/nokogiri.rb +11 -11
  40. data/lib/webrat/core/xml/rexml.rb +3 -3
  41. data/lib/webrat/core_extensions/blank.rb +1 -1
  42. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  43. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  44. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  45. data/lib/webrat/core_extensions/tcp_socket.rb +8 -8
  46. data/lib/webrat/mechanize.rb +9 -9
  47. data/lib/webrat/merb.rb +1 -1
  48. data/lib/webrat/merb_multipart_support.rb +27 -0
  49. data/lib/webrat/merb_session.rb +39 -24
  50. data/lib/webrat/rack_test.rb +32 -0
  51. data/lib/webrat/rails.rb +2 -2
  52. data/lib/webrat/rspec-rails.rb +3 -6
  53. data/lib/webrat/selenium.rb +2 -1
  54. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  55. data/lib/webrat/selenium/application_servers.rb +5 -0
  56. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  57. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  58. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  59. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  60. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  61. data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
  62. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
  63. data/lib/webrat/selenium/matchers.rb +1 -1
  64. data/lib/webrat/selenium/matchers/have_content.rb +4 -4
  65. data/lib/webrat/selenium/matchers/have_selector.rb +4 -4
  66. data/lib/webrat/selenium/matchers/have_tag.rb +16 -16
  67. data/lib/webrat/selenium/matchers/have_xpath.rb +4 -4
  68. data/lib/webrat/selenium/selenium_rc_server.rb +25 -19
  69. data/lib/webrat/selenium/selenium_session.rb +24 -17
  70. data/lib/webrat/selenium/silence_stream.rb +18 -0
  71. data/spec/fakes/test_session.rb +34 -0
  72. data/spec/integration/merb/.gitignore +21 -0
  73. data/spec/integration/merb/Rakefile +35 -0
  74. data/spec/integration/merb/app/controllers/application.rb +2 -0
  75. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  76. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  77. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  78. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  79. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  80. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  81. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  82. data/spec/integration/merb/config/environments/development.rb +15 -0
  83. data/spec/integration/merb/config/environments/rake.rb +11 -0
  84. data/spec/integration/merb/config/environments/test.rb +14 -0
  85. data/spec/integration/merb/config/init.rb +25 -0
  86. data/spec/integration/merb/config/rack.rb +11 -0
  87. data/spec/integration/merb/config/router.rb +34 -0
  88. data/spec/integration/merb/spec/spec.opts +1 -0
  89. data/spec/integration/merb/spec/spec_helper.rb +24 -0
  90. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  91. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  92. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  93. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  94. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  95. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  96. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  97. data/spec/integration/rack/Rakefile +5 -0
  98. data/spec/integration/rack/rack_app.rb +16 -0
  99. data/spec/integration/rack/test/test_helper.rb +20 -0
  100. data/spec/integration/rack/test/webrat_rack_test.rb +67 -0
  101. data/spec/integration/rails/.gitignore +3 -0
  102. data/spec/integration/rails/Rakefile +30 -0
  103. data/spec/integration/rails/app/controllers/application.rb +15 -0
  104. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  105. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  106. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  107. data/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  108. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  109. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  110. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  111. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  112. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  113. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  114. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  115. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  116. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  117. data/spec/integration/rails/config/boot.rb +109 -0
  118. data/spec/integration/rails/config/environment.rb +12 -0
  119. data/spec/integration/rails/config/environments/development.rb +17 -0
  120. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  121. data/spec/integration/rails/config/environments/test.rb +22 -0
  122. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  123. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  124. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  125. data/spec/integration/rails/config/locales/en.yml +5 -0
  126. data/spec/integration/rails/config/routes.rb +18 -0
  127. data/spec/integration/rails/public/404.html +30 -0
  128. data/spec/integration/rails/public/422.html +30 -0
  129. data/spec/integration/rails/public/500.html +33 -0
  130. data/spec/integration/rails/script/about +4 -0
  131. data/spec/integration/rails/script/console +3 -0
  132. data/spec/integration/rails/script/dbconsole +3 -0
  133. data/spec/integration/rails/script/destroy +3 -0
  134. data/spec/integration/rails/script/generate +3 -0
  135. data/spec/integration/rails/script/performance/benchmarker +3 -0
  136. data/spec/integration/rails/script/performance/profiler +3 -0
  137. data/spec/integration/rails/script/performance/request +3 -0
  138. data/spec/integration/rails/script/plugin +3 -0
  139. data/spec/integration/rails/script/process/inspector +3 -0
  140. data/spec/integration/rails/script/process/reaper +3 -0
  141. data/spec/integration/rails/script/process/spawner +3 -0
  142. data/spec/integration/rails/script/runner +3 -0
  143. data/spec/integration/rails/script/server +3 -0
  144. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  145. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  146. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  147. data/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  148. data/spec/integration/rails/test/test_helper.rb +25 -0
  149. data/spec/integration/sinatra/Rakefile +5 -0
  150. data/spec/integration/sinatra/classic_app.rb +64 -0
  151. data/spec/integration/sinatra/modular_app.rb +16 -0
  152. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  153. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  154. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  155. data/spec/private/core/configuration_spec.rb +116 -0
  156. data/spec/private/core/field_spec.rb +85 -0
  157. data/spec/private/core/link_spec.rb +24 -0
  158. data/spec/private/core/logging_spec.rb +10 -0
  159. data/spec/private/core/session_spec.rb +195 -0
  160. data/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  161. data/spec/private/merb/attaches_file_spec.rb +93 -0
  162. data/spec/private/merb/merb_session_spec.rb +61 -0
  163. data/spec/private/nokogiri_spec.rb +77 -0
  164. data/spec/private/rails/attaches_file_spec.rb +81 -0
  165. data/spec/private/rails/rails_session_spec.rb +110 -0
  166. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  167. data/spec/public/basic_auth_spec.rb +24 -0
  168. data/spec/public/check_spec.rb +191 -0
  169. data/spec/public/choose_spec.rb +118 -0
  170. data/spec/public/click_area_spec.rb +106 -0
  171. data/spec/public/click_button_spec.rb +496 -0
  172. data/spec/public/click_link_spec.rb +511 -0
  173. data/spec/public/fill_in_spec.rb +209 -0
  174. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  175. data/spec/public/locators/field_labeled_spec.rb +172 -0
  176. data/spec/public/locators/field_with_id_spec.rb +16 -0
  177. data/spec/public/matchers/contain_spec.rb +114 -0
  178. data/spec/public/matchers/have_selector_spec.rb +142 -0
  179. data/spec/public/matchers/have_tag_spec.rb +39 -0
  180. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  181. data/spec/public/reload_spec.rb +10 -0
  182. data/spec/public/save_and_open_spec.rb +70 -0
  183. data/spec/public/select_date_spec.rb +112 -0
  184. data/spec/public/select_datetime_spec.rb +137 -0
  185. data/spec/public/select_spec.rb +249 -0
  186. data/spec/public/select_time_spec.rb +100 -0
  187. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  188. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  189. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  190. data/spec/public/set_hidden_field_spec.rb +5 -0
  191. data/spec/public/submit_form_spec.rb +5 -0
  192. data/spec/public/visit_spec.rb +58 -0
  193. data/spec/public/within_spec.rb +177 -0
  194. data/spec/rcov.opts +1 -0
  195. data/spec/spec.opts +2 -0
  196. data/spec/spec_helper.rb +50 -0
  197. data/vendor/selenium-server.jar +0 -0
  198. data/webrat.gemspec +340 -0
  199. metadata +248 -33
  200. data/lib/webrat/selenium/application_server.rb +0 -71
  201. data/lib/webrat/selenium/merb_application_server.rb +0 -48
  202. data/lib/webrat/selenium/rails_application_server.rb +0 -42
  203. data/lib/webrat/selenium/sinatra_application_server.rb +0 -35
@@ -1,12 +1,19 @@
1
1
  if (locator == '*') {
2
2
  return selenium.browserbot.locationStrategies['xpath'].call(this, "//input[@type='submit']", inDocument, inWindow)
3
3
  }
4
+ var buttons = inDocument.getElementsByTagName('button');
4
5
  var inputs = inDocument.getElementsByTagName('input');
5
- return $A(inputs).find(function(candidate){
6
- inputType = candidate.getAttribute('type');
7
- if (inputType == 'submit' || inputType == 'image') {
8
- var buttonText = $F(candidate);
9
- return (PatternMatcher.matches(locator, buttonText));
10
- }
11
- return false;
6
+ var result = $A(inputs).concat($A(buttons)).find(function(candidate){
7
+ var type = candidate.getAttribute('type');
8
+ if (type == 'submit' || type == 'image' || type == 'button') {
9
+ var matches_id = PatternMatcher.matches(locator, candidate.id);
10
+ var matches_value = PatternMatcher.matches(locator, candidate.value);
11
+ var matches_html = PatternMatcher.matches(locator, candidate.innerHTML);
12
+ var matches_alt = PatternMatcher.matches(locator, candidate.alt);
13
+ if (matches_id || matches_value || matches_html || matches_alt) {
14
+ return true;
15
+ }
16
+ }
17
+ return false;
12
18
  });
19
+ return result;
@@ -1,6 +1,9 @@
1
1
  var links = inDocument.getElementsByTagName('a');
2
2
  var candidateLinks = $A(links).select(function(candidateLink) {
3
- return PatternMatcher.matches(locator, getText(candidateLink));
3
+ var textMatched = PatternMatcher.matches(locator, getText(candidateLink));
4
+ var idMatched = PatternMatcher.matches(locator, candidateLink.id);
5
+ var titleMatched = PatternMatcher.matches(locator, candidateLink.title);
6
+ return textMatched || idMatched || titleMatched;
4
7
  });
5
8
  if (candidateLinks.length == 0) {
6
9
  return null;
@@ -1,4 +1,4 @@
1
1
  require "webrat/selenium/matchers/have_xpath"
2
2
  require "webrat/selenium/matchers/have_selector"
3
3
  # require "webrat/selenium/matchers/have_tag"
4
- require "webrat/selenium/matchers/have_content"
4
+ require "webrat/selenium/matchers/have_content"
@@ -5,14 +5,14 @@ module Webrat
5
5
  def initialize(content)
6
6
  @content = content
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  if @content.is_a?(Regexp)
11
11
  text_finder = "regexp:#{@content.source}"
12
12
  else
13
13
  text_finder = @content
14
14
  end
15
-
15
+
16
16
  response.session.wait_for do
17
17
  response.selenium.is_text_present(text_finder)
18
18
  end
@@ -47,7 +47,7 @@ module Webrat
47
47
  def contain(content)
48
48
  HasContent.new(content)
49
49
  end
50
-
50
+
51
51
  # Asserts that the body of the response contain
52
52
  # the supplied string or regexp
53
53
  def assert_contain(content)
@@ -63,4 +63,4 @@ module Webrat
63
63
  end
64
64
  end
65
65
  end
66
- end
66
+ end
@@ -5,7 +5,7 @@ module Webrat
5
5
  def initialize(expected)
6
6
  @expected = expected
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  response.session.wait_for do
11
11
  response.selenium.is_element_present("css=#{@expected}")
@@ -26,11 +26,11 @@ module Webrat
26
26
  "expected following text to not match selector #{@expected}:\n#{@document}"
27
27
  end
28
28
  end
29
-
29
+
30
30
  def have_selector(content)
31
31
  HaveSelector.new(content)
32
32
  end
33
-
33
+
34
34
  # Asserts that the body of the response contains
35
35
  # the supplied selector
36
36
  def assert_have_selector(expected)
@@ -46,4 +46,4 @@ module Webrat
46
46
  end
47
47
  end
48
48
  end
49
- end
49
+ end
@@ -1,72 +1,72 @@
1
1
  module Webrat
2
2
  module Selenium
3
3
  module Matchers
4
-
4
+
5
5
  class HaveTag < HaveSelector #:nodoc:
6
6
  # ==== Returns
7
7
  # String:: The failure message.
8
8
  def failure_message
9
9
  "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
10
10
  end
11
-
11
+
12
12
  # ==== Returns
13
13
  # String:: The failure message to be displayed in negative matches.
14
14
  def negative_failure_message
15
15
  "expected following output to omit a #{tag_inspect}:\n#{@document}"
16
16
  end
17
-
17
+
18
18
  def tag_inspect
19
19
  options = @expected.last.dup
20
20
  content = options.delete(:content)
21
-
21
+
22
22
  html = "<#{@expected.first}"
23
23
  options.each do |k,v|
24
24
  html << " #{k}='#{v}'"
25
25
  end
26
-
26
+
27
27
  if content
28
28
  html << ">#{content}</#{@expected.first}>"
29
29
  else
30
30
  html << "/>"
31
31
  end
32
-
32
+
33
33
  html
34
34
  end
35
-
35
+
36
36
  def query
37
37
  options = @expected.last.dup
38
38
  selector = @expected.first.to_s
39
-
39
+
40
40
  selector << ":contains('#{options.delete(:content)}')" if options[:content]
41
-
41
+
42
42
  options.each do |key, value|
43
43
  selector << "[#{key}='#{value}']"
44
44
  end
45
-
45
+
46
46
  Nokogiri::CSS.parse(selector).map { |ast| ast.to_xpath }
47
47
  end
48
48
  end
49
-
49
+
50
50
  def have_tag(name, attributes = {}, &block)
51
51
  HaveTag.new([name, attributes], &block)
52
52
  end
53
-
53
+
54
54
  alias_method :match_tag, :have_tag
55
-
55
+
56
56
  # Asserts that the body of the response contains
57
57
  # the supplied tag with the associated selectors
58
58
  def assert_have_tag(name, attributes = {})
59
59
  ht = HaveTag.new([name, attributes])
60
60
  assert ht.matches?(response), ht.failure_message
61
61
  end
62
-
62
+
63
63
  # Asserts that the body of the response
64
64
  # does not contain the supplied string or regepx
65
65
  def assert_have_no_tag(name, attributes = {})
66
66
  ht = HaveTag.new([name, attributes])
67
67
  assert !ht.matches?(response), ht.negative_failure_message
68
68
  end
69
-
69
+
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -5,7 +5,7 @@ module Webrat
5
5
  def initialize(expected)
6
6
  @expected = expected
7
7
  end
8
-
8
+
9
9
  def matches?(response)
10
10
  response.session.wait_for do
11
11
  response.selenium.is_element_present("xpath=#{@expected}")
@@ -26,11 +26,11 @@ module Webrat
26
26
  "expected following text to not match xpath #{@expected}:\n#{@document}"
27
27
  end
28
28
  end
29
-
29
+
30
30
  def have_xpath(xpath)
31
31
  HaveXpath.new(xpath)
32
32
  end
33
-
33
+
34
34
  def assert_have_xpath(expected)
35
35
  hs = HaveXpath.new(expected)
36
36
  assert hs.matches?(response), hs.failure_message
@@ -42,4 +42,4 @@ module Webrat
42
42
  end
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -1,49 +1,53 @@
1
1
  module Webrat
2
2
  module Selenium
3
-
3
+
4
4
  class SeleniumRCServer
5
-
5
+
6
+ include Webrat::Selenium::SilenceStream
7
+
6
8
  def self.boot
7
9
  new.boot
8
10
  end
9
-
11
+
10
12
  def boot
11
13
  return if selenium_grid?
12
-
14
+
13
15
  start
14
16
  wait
15
17
  stop_at_exit
16
18
  end
17
-
19
+
18
20
  def start
19
21
  silence_stream(STDOUT) do
20
22
  remote_control.start :background => true
21
23
  end
22
24
  end
23
-
25
+
24
26
  def stop_at_exit
25
27
  at_exit do
26
28
  stop
27
29
  end
28
30
  end
29
-
31
+
30
32
  def remote_control
31
33
  return @remote_control if @remote_control
32
-
33
- @remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5)
34
+
35
+ @remote_control = ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
36
+ Webrat.configuration.selenium_server_port,
37
+ :timeout => Webrat.configuration.selenium_browser_startup_timeout)
34
38
  @remote_control.jar_file = jar_path
35
-
39
+
36
40
  return @remote_control
37
41
  end
38
-
42
+
39
43
  def jar_path
40
44
  File.expand_path(__FILE__ + "../../../../../vendor/selenium-server.jar")
41
45
  end
42
-
46
+
43
47
  def selenium_grid?
44
48
  Webrat.configuration.selenium_server_address
45
49
  end
46
-
50
+
47
51
  def wait
48
52
  $stderr.print "==> Waiting for Selenium RC server on port #{Webrat.configuration.selenium_server_port}... "
49
53
  wait_for_socket
@@ -51,7 +55,7 @@ module Webrat
51
55
  rescue SocketError
52
56
  fail
53
57
  end
54
-
58
+
55
59
  def wait_for_socket
56
60
  silence_stream(STDOUT) do
57
61
  TCPSocket.wait_for_service_with_timeout \
@@ -60,21 +64,23 @@ module Webrat
60
64
  :timeout => 15 # seconds
61
65
  end
62
66
  end
63
-
67
+
64
68
  def fail
65
69
  $stderr.puts
66
70
  $stderr.puts
67
71
  $stderr.puts "==> Failed to boot the Selenium RC server... exiting!"
68
72
  exit
69
73
  end
70
-
74
+
71
75
  def stop
72
76
  silence_stream(STDOUT) do
73
- ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0", Webrat.configuration.selenium_server_port, 5).stop
77
+ ::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
78
+ Webrat.configuration.selenium_server_port,
79
+ :timeout => 5).stop
74
80
  end
75
81
  end
76
-
82
+
77
83
  end
78
-
84
+
79
85
  end
80
86
  end
@@ -1,6 +1,7 @@
1
1
  require "webrat/core/save_and_open_page"
2
2
  require "webrat/selenium/selenium_rc_server"
3
- require "webrat/selenium/application_server"
3
+ require "webrat/selenium/application_server_factory"
4
+ require "webrat/selenium/application_servers/base"
4
5
 
5
6
  module Webrat
6
7
  class TimeoutError < WebratError
@@ -22,6 +23,7 @@ module Webrat
22
23
 
23
24
  class SeleniumSession
24
25
  include Webrat::SaveAndOpenPage
26
+ include Webrat::Selenium::SilenceStream
25
27
 
26
28
  def initialize(*args) # :nodoc:
27
29
  end
@@ -40,7 +42,7 @@ module Webrat
40
42
  webrat_deprecate :visits, :visit
41
43
 
42
44
  def fill_in(field_identifier, options)
43
- locator = "webrat=#{Regexp.escape(field_identifier)}"
45
+ locator = "webrat=#{field_identifier}"
44
46
  selenium.wait_for_element locator, :timeout_in_seconds => 5
45
47
  selenium.type(locator, "#{options[:with]}")
46
48
  end
@@ -55,6 +57,10 @@ module Webrat
55
57
  selenium.get_html_source
56
58
  end
57
59
 
60
+ def current_url
61
+ selenium.location
62
+ end
63
+
58
64
  def click_button(button_text_or_regexp = nil, options = {})
59
65
  if button_text_or_regexp.is_a?(Hash) && options == {}
60
66
  pattern, options = nil, button_text_or_regexp
@@ -145,8 +151,10 @@ module Webrat
145
151
 
146
152
  begin
147
153
  value = yield
148
- rescue ::Spec::Expectations::ExpectationNotMetError, ::Selenium::CommandError, Webrat::WebratError
149
- value = nil
154
+ rescue Exception => e
155
+ unless is_ignorable_wait_for_exception?(e)
156
+ raise e
157
+ end
150
158
  end
151
159
 
152
160
  return value if value
@@ -177,23 +185,22 @@ module Webrat
177
185
  else
178
186
  $browser.capture_screenshot(filename)
179
187
  end
180
- open_in_browser(filename)
188
+ open_in_browser(filename)
189
+
181
190
  end
182
191
 
183
- protected
184
-
185
- def silence_stream(stream)
186
- old_stream = stream.dup
187
- stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
188
- stream.sync = true
189
- yield
190
- ensure
191
- stream.reopen(old_stream)
192
+ protected
193
+ def is_ignorable_wait_for_exception?(exception) #:nodoc:
194
+ if defined?(::Spec::Expectations::ExpectationNotMetError)
195
+ return true if exception.class == ::Spec::Expectations::ExpectationNotMetError
196
+ end
197
+ return true if [::Selenium::CommandError, Webrat::WebratError].include?(exception.class)
198
+ return false
192
199
  end
193
200
 
194
201
  def setup #:nodoc:
195
202
  Webrat::Selenium::SeleniumRCServer.boot
196
- Webrat::Selenium::ApplicationServer.boot
203
+ Webrat::Selenium::ApplicationServerFactory.app_server_instance.boot
197
204
 
198
205
  create_browser
199
206
  $browser.start
@@ -206,9 +213,9 @@ module Webrat
206
213
 
207
214
  def create_browser
208
215
  $browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
209
- Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
216
+ Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
210
217
  $browser.set_speed(0) unless Webrat.configuration.selenium_server_address
211
-
218
+
212
219
  at_exit do
213
220
  silence_stream(STDOUT) do
214
221
  $browser.stop
@@ -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,34 @@
1
+ module Webrat #:nodoc:
2
+ def self.session_class #:nodoc:
3
+ TestSession
4
+ end
5
+
6
+ class TestSession < Session #:nodoc:
7
+ attr_accessor :response_body
8
+ attr_writer :response_code
9
+
10
+ def doc_root
11
+ File.expand_path(File.join(".", "public"))
12
+ end
13
+
14
+ def response
15
+ @response ||= Object.new
16
+ end
17
+
18
+ def response_code
19
+ @response_code || 200
20
+ end
21
+
22
+ def get(url, data, headers = nil)
23
+ end
24
+
25
+ def post(url, data, headers = nil)
26
+ end
27
+
28
+ def put(url, data, headers = nil)
29
+ end
30
+
31
+ def delete(url, data, headers = nil)
32
+ end
33
+ end
34
+ end