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.
- data/.document +4 -0
- data/.gitignore +15 -0
- data/History.txt +44 -8
- data/Rakefile +80 -66
- data/VERSION +1 -0
- data/lib/webrat.rb +7 -12
- data/lib/webrat/core/configuration.rb +7 -3
- data/lib/webrat/core/elements/area.rb +7 -7
- data/lib/webrat/core/elements/element.rb +11 -11
- data/lib/webrat/core/elements/field.rb +63 -55
- data/lib/webrat/core/elements/form.rb +17 -17
- data/lib/webrat/core/elements/label.rb +6 -6
- data/lib/webrat/core/elements/link.rb +13 -12
- data/lib/webrat/core/elements/select_option.rb +9 -9
- data/lib/webrat/core/locators.rb +2 -2
- data/lib/webrat/core/locators/area_locator.rb +10 -10
- data/lib/webrat/core/locators/button_locator.rb +13 -13
- data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
- data/lib/webrat/core/locators/field_labeled_locator.rb +11 -11
- data/lib/webrat/core/locators/field_locator.rb +7 -7
- data/lib/webrat/core/locators/field_named_locator.rb +10 -10
- data/lib/webrat/core/locators/form_locator.rb +6 -6
- data/lib/webrat/core/locators/label_locator.rb +9 -9
- data/lib/webrat/core/locators/link_locator.rb +21 -13
- data/lib/webrat/core/locators/locator.rb +5 -5
- data/lib/webrat/core/locators/select_option_locator.rb +11 -11
- data/lib/webrat/core/logging.rb +7 -4
- data/lib/webrat/core/matchers/have_content.rb +12 -12
- data/lib/webrat/core/matchers/have_selector.rb +9 -9
- data/lib/webrat/core/matchers/have_tag.rb +4 -4
- data/lib/webrat/core/matchers/have_xpath.rb +26 -26
- data/lib/webrat/core/methods.rb +13 -11
- data/lib/webrat/core/mime.rb +3 -3
- data/lib/webrat/core/save_and_open_page.rb +14 -16
- data/lib/webrat/core/scope.rb +53 -53
- data/lib/webrat/core/session.rb +23 -14
- data/lib/webrat/core/xml.rb +16 -16
- data/lib/webrat/core/xml/hpricot.rb +3 -3
- data/lib/webrat/core/xml/nokogiri.rb +11 -11
- data/lib/webrat/core/xml/rexml.rb +3 -3
- data/lib/webrat/core_extensions/blank.rb +1 -1
- data/lib/webrat/core_extensions/deprecate.rb +1 -1
- data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
- data/lib/webrat/core_extensions/meta_class.rb +1 -1
- data/lib/webrat/core_extensions/tcp_socket.rb +8 -8
- data/lib/webrat/mechanize.rb +9 -9
- data/lib/webrat/merb.rb +1 -1
- data/lib/webrat/merb_multipart_support.rb +27 -0
- data/lib/webrat/merb_session.rb +39 -24
- data/lib/webrat/rack_test.rb +32 -0
- data/lib/webrat/rails.rb +2 -2
- data/lib/webrat/rspec-rails.rb +3 -6
- data/lib/webrat/selenium.rb +2 -1
- data/lib/webrat/selenium/application_server_factory.rb +40 -0
- data/lib/webrat/selenium/application_servers.rb +5 -0
- data/lib/webrat/selenium/application_servers/base.rb +46 -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 +44 -0
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
- data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
- data/lib/webrat/selenium/matchers.rb +1 -1
- data/lib/webrat/selenium/matchers/have_content.rb +4 -4
- data/lib/webrat/selenium/matchers/have_selector.rb +4 -4
- data/lib/webrat/selenium/matchers/have_tag.rb +16 -16
- data/lib/webrat/selenium/matchers/have_xpath.rb +4 -4
- data/lib/webrat/selenium/selenium_rc_server.rb +25 -19
- data/lib/webrat/selenium/selenium_session.rb +24 -17
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/spec/fakes/test_session.rb +34 -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 +24 -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/rack_app.rb +16 -0
- data/spec/integration/rack/test/test_helper.rb +20 -0
- data/spec/integration/rack/test/webrat_rack_test.rb +67 -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 +43 -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/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 +18 -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 +97 -0
- data/spec/integration/rails/test/test_helper.rb +25 -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 +16 -0
- data/spec/private/core/configuration_spec.rb +116 -0
- data/spec/private/core/field_spec.rb +85 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/logging_spec.rb +10 -0
- data/spec/private/core/session_spec.rb +195 -0
- data/spec/private/mechanize/mechanize_session_spec.rb +81 -0
- data/spec/private/merb/attaches_file_spec.rb +93 -0
- data/spec/private/merb/merb_session_spec.rb +61 -0
- data/spec/private/nokogiri_spec.rb +77 -0
- data/spec/private/rails/attaches_file_spec.rb +81 -0
- data/spec/private/rails/rails_session_spec.rb +110 -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 +496 -0
- data/spec/public/click_link_spec.rb +511 -0
- data/spec/public/fill_in_spec.rb +209 -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 +142 -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 +249 -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 +50 -0
- data/vendor/selenium-server.jar +0 -0
- data/webrat.gemspec +340 -0
- metadata +248 -33
- data/lib/webrat/selenium/application_server.rb +0 -71
- data/lib/webrat/selenium/merb_application_server.rb +0 -48
- data/lib/webrat/selenium/rails_application_server.rb +0 -42
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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",
|
|
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",
|
|
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/
|
|
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=#{
|
|
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
|
|
149
|
-
|
|
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
|
-
|
|
188
|
+
open_in_browser(filename)
|
|
189
|
+
|
|
181
190
|
end
|
|
182
191
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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::
|
|
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
|
-
|
|
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
|