mkuklis-webrat 0.5.1 → 0.6.rc1
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 +3 -3
- data/.gitignore +14 -14
- data/History.txt +413 -413
- data/MIT-LICENSE.txt +19 -19
- data/README.rdoc +84 -84
- data/Rakefile +187 -187
- data/VERSION +1 -1
- data/install.rb +1 -1
- data/lib/webrat/adapters/mechanize.rb +78 -78
- data/lib/webrat/adapters/merb.rb +11 -11
- data/lib/webrat/adapters/rack.rb +25 -25
- data/lib/webrat/adapters/rails.rb +81 -81
- data/lib/webrat/adapters/sinatra.rb +9 -9
- data/lib/webrat/core/configuration.rb +92 -92
- data/lib/webrat/core/elements/area.rb +31 -31
- data/lib/webrat/core/elements/element.rb +33 -33
- data/lib/webrat/core/elements/field.rb +487 -487
- data/lib/webrat/core/elements/form.rb +103 -103
- data/lib/webrat/core/elements/label.rb +31 -31
- data/lib/webrat/core/elements/link.rb +93 -93
- data/lib/webrat/core/elements/select_option.rb +48 -48
- data/lib/webrat/core/locators/area_locator.rb +38 -38
- data/lib/webrat/core/locators/button_locator.rb +54 -54
- data/lib/webrat/core/locators/field_by_id_locator.rb +37 -37
- data/lib/webrat/core/locators/field_labeled_locator.rb +56 -56
- data/lib/webrat/core/locators/field_locator.rb +25 -25
- data/lib/webrat/core/locators/field_named_locator.rb +41 -41
- data/lib/webrat/core/locators/form_locator.rb +19 -19
- data/lib/webrat/core/locators/label_locator.rb +34 -34
- data/lib/webrat/core/locators/link_locator.rb +74 -74
- data/lib/webrat/core/locators/locator.rb +20 -20
- data/lib/webrat/core/locators/select_option_locator.rb +59 -59
- data/lib/webrat/core/locators.rb +20 -20
- data/lib/webrat/core/logging.rb +23 -23
- data/lib/webrat/core/matchers/have_content.rb +68 -68
- data/lib/webrat/core/matchers/have_selector.rb +74 -74
- data/lib/webrat/core/matchers/have_tag.rb +21 -21
- data/lib/webrat/core/matchers/have_xpath.rb +122 -122
- data/lib/webrat/core/matchers.rb +4 -4
- data/lib/webrat/core/methods.rb +64 -64
- data/lib/webrat/core/mime.rb +18 -18
- data/lib/webrat/core/save_and_open_page.rb +48 -48
- data/lib/webrat/core/scope.rb +365 -365
- data/lib/webrat/core/session.rb +306 -306
- data/lib/webrat/core/xml.rb +72 -72
- data/lib/webrat/core.rb +13 -13
- data/lib/webrat/core_extensions/blank.rb +58 -58
- data/lib/webrat/core_extensions/deprecate.rb +8 -8
- data/lib/webrat/core_extensions/detect_mapped.rb +12 -12
- data/lib/webrat/core_extensions/meta_class.rb +6 -6
- data/lib/webrat/core_extensions/nil_to_param.rb +5 -5
- data/lib/webrat/core_extensions/tcp_socket.rb +27 -27
- data/lib/webrat/integrations/merb.rb +10 -10
- data/lib/webrat/integrations/rails.rb +25 -25
- data/lib/webrat/integrations/rspec-rails.rb +10 -10
- data/lib/webrat/integrations/selenium.rb +11 -11
- data/lib/webrat/merb.rb +9 -9
- data/lib/webrat/rspec-rails.rb +2 -2
- data/lib/webrat/selenium/application_server_factory.rb +40 -40
- data/lib/webrat/selenium/application_servers/external.rb +26 -26
- data/lib/webrat/selenium/application_servers/merb.rb +50 -50
- data/lib/webrat/selenium/application_servers/rails.rb +3 -6
- data/lib/webrat/selenium/application_servers/sinatra.rb +37 -37
- data/lib/webrat/selenium/application_servers.rb +5 -5
- data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -19
- data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -42
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -6
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -32
- data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -15
- data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -5
- data/lib/webrat/selenium/matchers/have_content.rb +66 -66
- data/lib/webrat/selenium/matchers/have_selector.rb +49 -49
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -72
- data/lib/webrat/selenium/matchers/have_xpath.rb +45 -45
- data/lib/webrat/selenium/matchers.rb +4 -4
- data/lib/webrat/selenium/selenium_extensions.js +5 -5
- data/lib/webrat/selenium/selenium_rc_server.rb +86 -86
- data/lib/webrat/selenium/selenium_session.rb +267 -272
- data/lib/webrat/selenium/silence_stream.rb +18 -18
- data/lib/webrat/selenium.rb +70 -70
- data/lib/webrat.rb +18 -18
- data/spec/fakes/test_adapter.rb +37 -37
- data/spec/integration/mechanize/Rakefile +6 -6
- data/spec/integration/mechanize/config.ru +1 -1
- data/spec/integration/mechanize/sample_app.rb +20 -20
- data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -22
- data/spec/integration/mechanize/spec/spec_helper.rb +27 -27
- data/spec/integration/merb/.gitignore +20 -20
- data/spec/integration/merb/Rakefile +35 -35
- data/spec/integration/merb/app/controllers/application.rb +2 -2
- data/spec/integration/merb/app/controllers/exceptions.rb +13 -13
- data/spec/integration/merb/app/controllers/testing.rb +27 -27
- data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -63
- data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -47
- data/spec/integration/merb/app/views/layout/application.html.erb +11 -11
- data/spec/integration/merb/app/views/testing/show_form.html.erb +26 -26
- data/spec/integration/merb/app/views/testing/upload.html.erb +8 -8
- data/spec/integration/merb/config/environments/development.rb +15 -15
- data/spec/integration/merb/config/environments/rake.rb +11 -11
- data/spec/integration/merb/config/environments/test.rb +14 -14
- data/spec/integration/merb/config/init.rb +25 -25
- data/spec/integration/merb/config/rack.rb +11 -11
- data/spec/integration/merb/config/router.rb +34 -34
- data/spec/integration/merb/spec/spec.opts +1 -1
- data/spec/integration/merb/spec/spec_helper.rb +26 -26
- data/spec/integration/merb/spec/webrat_spec.rb +39 -39
- data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -31
- data/spec/integration/merb/tasks/merb.thor/common.rb +64 -64
- data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -124
- data/spec/integration/merb/tasks/merb.thor/main.thor +149 -149
- data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -93
- data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -40
- data/spec/integration/rack/Rakefile +5 -5
- data/spec/integration/rack/app.rb +89 -89
- data/spec/integration/rack/test/helper.rb +21 -21
- data/spec/integration/rack/test/webrat_rack_test.rb +73 -73
- data/spec/integration/rails/.gitignore +3 -3
- data/spec/integration/rails/Rakefile +30 -30
- data/spec/integration/rails/app/controllers/application.rb +15 -15
- data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -7
- data/spec/integration/rails/app/controllers/fields_controller.rb +4 -4
- data/spec/integration/rails/app/controllers/links_controller.rb +7 -7
- data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -46
- data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -2
- data/spec/integration/rails/app/helpers/fields_helper.rb +2 -2
- data/spec/integration/rails/app/helpers/links_helper.rb +2 -2
- data/spec/integration/rails/app/views/buttons/show.html.erb +10 -10
- data/spec/integration/rails/app/views/fields/show.html.erb +8 -8
- data/spec/integration/rails/app/views/links/show.html.erb +5 -5
- data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +3 -3
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +10 -10
- data/spec/integration/rails/app/views/webrat/form.html.erb +27 -27
- data/spec/integration/rails/app/views/webrat/within.html.erb +2 -2
- data/spec/integration/rails/config/boot.rb +109 -109
- data/spec/integration/rails/config/environment.rb +12 -12
- data/spec/integration/rails/config/environments/development.rb +17 -17
- data/spec/integration/rails/config/environments/selenium.rb +22 -22
- data/spec/integration/rails/config/environments/test.rb +22 -22
- data/spec/integration/rails/config/initializers/inflections.rb +10 -10
- data/spec/integration/rails/config/initializers/mime_types.rb +5 -5
- data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -17
- data/spec/integration/rails/config/locales/en.yml +4 -4
- data/spec/integration/rails/config/routes.rb +19 -19
- data/spec/integration/rails/public/404.html +29 -29
- data/spec/integration/rails/public/422.html +29 -29
- data/spec/integration/rails/public/500.html +33 -33
- data/spec/integration/rails/script/about +3 -3
- data/spec/integration/rails/script/console +3 -3
- data/spec/integration/rails/script/dbconsole +3 -3
- data/spec/integration/rails/script/destroy +3 -3
- data/spec/integration/rails/script/generate +3 -3
- data/spec/integration/rails/script/performance/benchmarker +3 -3
- data/spec/integration/rails/script/performance/profiler +3 -3
- data/spec/integration/rails/script/performance/request +3 -3
- data/spec/integration/rails/script/plugin +3 -3
- data/spec/integration/rails/script/process/inspector +3 -3
- data/spec/integration/rails/script/process/reaper +3 -3
- data/spec/integration/rails/script/process/spawner +3 -3
- data/spec/integration/rails/script/runner +3 -3
- data/spec/integration/rails/script/server +3 -3
- data/spec/integration/rails/test/integration/button_click_test.rb +80 -80
- data/spec/integration/rails/test/integration/fill_in_test.rb +24 -24
- data/spec/integration/rails/test/integration/link_click_test.rb +27 -27
- data/spec/integration/rails/test/integration/webrat_test.rb +122 -122
- data/spec/integration/rails/test/test_helper.rb +26 -26
- data/spec/integration/sinatra/Rakefile +5 -5
- data/spec/integration/sinatra/classic_app.rb +64 -64
- data/spec/integration/sinatra/modular_app.rb +16 -16
- data/spec/integration/sinatra/test/classic_app_test.rb +37 -37
- data/spec/integration/sinatra/test/modular_app_test.rb +18 -18
- data/spec/integration/sinatra/test/test_helper.rb +17 -17
- data/spec/private/core/configuration_spec.rb +87 -87
- data/spec/private/core/field_spec.rb +85 -85
- data/spec/private/core/link_spec.rb +24 -24
- data/spec/private/core/session_spec.rb +200 -200
- data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -73
- data/spec/private/nokogiri_spec.rb +77 -77
- data/spec/private/rails/attaches_file_spec.rb +81 -81
- data/spec/private/rails/rails_adapter_spec.rb +86 -86
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -26
- data/spec/public/basic_auth_spec.rb +24 -24
- data/spec/public/check_spec.rb +191 -191
- data/spec/public/choose_spec.rb +118 -118
- data/spec/public/click_area_spec.rb +106 -106
- data/spec/public/click_button_spec.rb +494 -494
- data/spec/public/click_link_spec.rb +511 -511
- data/spec/public/fill_in_spec.rb +224 -224
- data/spec/public/locators/field_by_xpath_spec.rb +19 -19
- data/spec/public/locators/field_labeled_spec.rb +172 -172
- data/spec/public/locators/field_with_id_spec.rb +16 -16
- data/spec/public/matchers/contain_spec.rb +114 -114
- data/spec/public/matchers/have_selector_spec.rb +146 -146
- data/spec/public/matchers/have_tag_spec.rb +39 -39
- data/spec/public/matchers/have_xpath_spec.rb +136 -136
- data/spec/public/reload_spec.rb +10 -10
- data/spec/public/save_and_open_spec.rb +70 -70
- data/spec/public/select_date_spec.rb +112 -112
- data/spec/public/select_datetime_spec.rb +137 -137
- data/spec/public/select_spec.rb +455 -455
- data/spec/public/select_time_spec.rb +100 -100
- data/spec/public/selenium/application_server_factory_spec.rb +49 -49
- data/spec/public/selenium/application_servers/external_spec.rb +12 -12
- data/spec/public/selenium/selenium_session_spec.rb +37 -37
- data/spec/public/set_hidden_field_spec.rb +5 -5
- data/spec/public/submit_form_spec.rb +5 -5
- data/spec/public/visit_spec.rb +58 -58
- data/spec/public/within_spec.rb +177 -177
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +54 -54
- data/webrat.gemspec +360 -0
- metadata +6 -5
@@ -1,74 +1,74 @@
|
|
1
|
-
require "webrat/core/matchers/have_xpath"
|
2
|
-
|
3
|
-
module Webrat
|
4
|
-
module Matchers
|
5
|
-
|
6
|
-
class HaveSelector < HaveXpath #:nodoc:
|
7
|
-
# ==== Returns
|
8
|
-
# String:: The failure message.
|
9
|
-
def failure_message
|
10
|
-
"expected following output to contain a #{tag_inspect} tag:\n#{@document}"
|
11
|
-
end
|
12
|
-
|
13
|
-
# ==== Returns
|
14
|
-
# String:: The failure message to be displayed in negative matches.
|
15
|
-
def negative_failure_message
|
16
|
-
"expected following output to omit a #{tag_inspect}:\n#{@document}"
|
17
|
-
end
|
18
|
-
|
19
|
-
def tag_inspect
|
20
|
-
options = @options.dup
|
21
|
-
count = options.delete(:count)
|
22
|
-
content = options.delete(:content)
|
23
|
-
|
24
|
-
html = "<#{@expected}"
|
25
|
-
options.each do |k,v|
|
26
|
-
html << " #{k}='#{v}'"
|
27
|
-
end
|
28
|
-
|
29
|
-
if content
|
30
|
-
html << ">#{content}</#{@expected}>"
|
31
|
-
else
|
32
|
-
html << "/>"
|
33
|
-
end
|
34
|
-
|
35
|
-
html
|
36
|
-
end
|
37
|
-
|
38
|
-
def query
|
39
|
-
Nokogiri::CSS.parse(@expected.to_s).map do |ast|
|
40
|
-
ast.to_xpath
|
41
|
-
end.first
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
# Matches HTML content against a CSS 3 selector.
|
47
|
-
#
|
48
|
-
# ==== Parameters
|
49
|
-
# expected<String>:: The CSS selector to look for.
|
50
|
-
#
|
51
|
-
# ==== Returns
|
52
|
-
# HaveSelector:: A new have selector matcher.
|
53
|
-
def have_selector(name, attributes = {}, &block)
|
54
|
-
HaveSelector.new(name, attributes, &block)
|
55
|
-
end
|
56
|
-
alias_method :match_selector, :have_selector
|
57
|
-
|
58
|
-
|
59
|
-
# Asserts that the body of the response contains
|
60
|
-
# the supplied selector
|
61
|
-
def assert_have_selector(name, attributes = {}, &block)
|
62
|
-
matcher = HaveSelector.new(name, attributes, &block)
|
63
|
-
assert matcher.matches?(response_body), matcher.failure_message
|
64
|
-
end
|
65
|
-
|
66
|
-
# Asserts that the body of the response
|
67
|
-
# does not contain the supplied string or regepx
|
68
|
-
def assert_have_no_selector(name, attributes = {}, &block)
|
69
|
-
matcher = HaveSelector.new(name, attributes, &block)
|
70
|
-
assert !matcher.matches?(response_body), matcher.negative_failure_message
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
end
|
1
|
+
require "webrat/core/matchers/have_xpath"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
module Matchers
|
5
|
+
|
6
|
+
class HaveSelector < HaveXpath #:nodoc:
|
7
|
+
# ==== Returns
|
8
|
+
# String:: The failure message.
|
9
|
+
def failure_message
|
10
|
+
"expected following output to contain a #{tag_inspect} tag:\n#{@document}"
|
11
|
+
end
|
12
|
+
|
13
|
+
# ==== Returns
|
14
|
+
# String:: The failure message to be displayed in negative matches.
|
15
|
+
def negative_failure_message
|
16
|
+
"expected following output to omit a #{tag_inspect}:\n#{@document}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def tag_inspect
|
20
|
+
options = @options.dup
|
21
|
+
count = options.delete(:count)
|
22
|
+
content = options.delete(:content)
|
23
|
+
|
24
|
+
html = "<#{@expected}"
|
25
|
+
options.each do |k,v|
|
26
|
+
html << " #{k}='#{v}'"
|
27
|
+
end
|
28
|
+
|
29
|
+
if content
|
30
|
+
html << ">#{content}</#{@expected}>"
|
31
|
+
else
|
32
|
+
html << "/>"
|
33
|
+
end
|
34
|
+
|
35
|
+
html
|
36
|
+
end
|
37
|
+
|
38
|
+
def query
|
39
|
+
Nokogiri::CSS.parse(@expected.to_s).map do |ast|
|
40
|
+
ast.to_xpath
|
41
|
+
end.first
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
# Matches HTML content against a CSS 3 selector.
|
47
|
+
#
|
48
|
+
# ==== Parameters
|
49
|
+
# expected<String>:: The CSS selector to look for.
|
50
|
+
#
|
51
|
+
# ==== Returns
|
52
|
+
# HaveSelector:: A new have selector matcher.
|
53
|
+
def have_selector(name, attributes = {}, &block)
|
54
|
+
HaveSelector.new(name, attributes, &block)
|
55
|
+
end
|
56
|
+
alias_method :match_selector, :have_selector
|
57
|
+
|
58
|
+
|
59
|
+
# Asserts that the body of the response contains
|
60
|
+
# the supplied selector
|
61
|
+
def assert_have_selector(name, attributes = {}, &block)
|
62
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
63
|
+
assert matcher.matches?(response_body), matcher.failure_message
|
64
|
+
end
|
65
|
+
|
66
|
+
# Asserts that the body of the response
|
67
|
+
# does not contain the supplied string or regepx
|
68
|
+
def assert_have_no_selector(name, attributes = {}, &block)
|
69
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
70
|
+
assert !matcher.matches?(response_body), matcher.negative_failure_message
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
|
-
require "webrat/core/matchers/have_selector"
|
2
|
-
|
3
|
-
module Webrat
|
4
|
-
module HaveTagMatcher
|
5
|
-
|
6
|
-
def have_tag(*args, &block)
|
7
|
-
have_selector(*args, &block)
|
8
|
-
end
|
9
|
-
|
10
|
-
alias_method :match_tag, :have_tag
|
11
|
-
|
12
|
-
def assert_have_tag(*args, &block)
|
13
|
-
assert_have_selector(*args, &block)
|
14
|
-
end
|
15
|
-
|
16
|
-
def assert_have_no_tag(*args, &block)
|
17
|
-
assert_have_no_selector(*args, &block)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
1
|
+
require "webrat/core/matchers/have_selector"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
module HaveTagMatcher
|
5
|
+
|
6
|
+
def have_tag(*args, &block)
|
7
|
+
have_selector(*args, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method :match_tag, :have_tag
|
11
|
+
|
12
|
+
def assert_have_tag(*args, &block)
|
13
|
+
assert_have_selector(*args, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_have_no_tag(*args, &block)
|
17
|
+
assert_have_no_selector(*args, &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -1,122 +1,122 @@
|
|
1
|
-
require "webrat/core/xml"
|
2
|
-
|
3
|
-
module Webrat
|
4
|
-
module Matchers
|
5
|
-
|
6
|
-
class HaveXpath #:nodoc:
|
7
|
-
def initialize(expected, options = {}, &block)
|
8
|
-
@expected = expected
|
9
|
-
@options = options
|
10
|
-
@block = block
|
11
|
-
end
|
12
|
-
|
13
|
-
def matches?(stringlike, &block)
|
14
|
-
@block ||= block
|
15
|
-
matched = matches(stringlike)
|
16
|
-
|
17
|
-
if @options[:count]
|
18
|
-
matched.size == @options[:count].to_i && (!@block || @block.call(matched))
|
19
|
-
else
|
20
|
-
matched.any? && (!@block || @block.call(matched))
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def matches(stringlike)
|
25
|
-
nokogiri_matches(stringlike)
|
26
|
-
end
|
27
|
-
|
28
|
-
def nokogiri_matches(stringlike)
|
29
|
-
if Nokogiri::XML::NodeSet === stringlike
|
30
|
-
@query = query.gsub(%r'^//', './/')
|
31
|
-
else
|
32
|
-
@query = query
|
33
|
-
end
|
34
|
-
|
35
|
-
add_options_conditions_to(@query)
|
36
|
-
|
37
|
-
@document = Webrat::XML.document(stringlike)
|
38
|
-
@document.xpath(*@query)
|
39
|
-
end
|
40
|
-
|
41
|
-
def add_options_conditions_to(query)
|
42
|
-
add_attributes_conditions_to(query)
|
43
|
-
add_content_condition_to(query)
|
44
|
-
end
|
45
|
-
|
46
|
-
def add_attributes_conditions_to(query)
|
47
|
-
attribute_conditions = []
|
48
|
-
|
49
|
-
@options.each do |key, value|
|
50
|
-
next if [:content, :count].include?(key)
|
51
|
-
attribute_conditions << "@#{key} = #{xpath_escape(value)}"
|
52
|
-
end
|
53
|
-
|
54
|
-
if attribute_conditions.any?
|
55
|
-
query << "[#{attribute_conditions.join(' and ')}]"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def add_content_condition_to(query)
|
60
|
-
if @options[:content]
|
61
|
-
query << "[contains(., #{xpath_escape(@options[:content])})]"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def query
|
66
|
-
@expected
|
67
|
-
end
|
68
|
-
|
69
|
-
# ==== Returns
|
70
|
-
# String:: The failure message.
|
71
|
-
def failure_message
|
72
|
-
"expected following text to match xpath #{@expected}:\n#{@document}"
|
73
|
-
end
|
74
|
-
|
75
|
-
# ==== Returns
|
76
|
-
# String:: The failure message to be displayed in negative matches.
|
77
|
-
def negative_failure_message
|
78
|
-
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
|
83
|
-
def xpath_escape(string)
|
84
|
-
if string.include?("'") && string.include?('"')
|
85
|
-
parts = string.split("'").map do |part|
|
86
|
-
"'#{part}'"
|
87
|
-
end
|
88
|
-
|
89
|
-
"concat(" + parts.join(", \"'\", ") + ")"
|
90
|
-
elsif string.include?("'")
|
91
|
-
"\"#{string}\""
|
92
|
-
else
|
93
|
-
"'#{string}'"
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
# Matches HTML content against an XPath query
|
100
|
-
#
|
101
|
-
# ==== Parameters
|
102
|
-
# expected<String>:: The XPath query to look for.
|
103
|
-
#
|
104
|
-
# ==== Returns
|
105
|
-
# HaveXpath:: A new have xpath matcher.
|
106
|
-
def have_xpath(expected, options = {}, &block)
|
107
|
-
HaveXpath.new(expected, options, &block)
|
108
|
-
end
|
109
|
-
alias_method :match_xpath, :have_xpath
|
110
|
-
|
111
|
-
def assert_have_xpath(expected, options = {}, &block)
|
112
|
-
hs = HaveXpath.new(expected, options, &block)
|
113
|
-
assert hs.matches?(response_body), hs.failure_message
|
114
|
-
end
|
115
|
-
|
116
|
-
def assert_have_no_xpath(expected, options = {}, &block)
|
117
|
-
hs = HaveXpath.new(expected, options, &block)
|
118
|
-
assert !hs.matches?(response_body), hs.negative_failure_message
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
|
-
end
|
1
|
+
require "webrat/core/xml"
|
2
|
+
|
3
|
+
module Webrat
|
4
|
+
module Matchers
|
5
|
+
|
6
|
+
class HaveXpath #:nodoc:
|
7
|
+
def initialize(expected, options = {}, &block)
|
8
|
+
@expected = expected
|
9
|
+
@options = options
|
10
|
+
@block = block
|
11
|
+
end
|
12
|
+
|
13
|
+
def matches?(stringlike, &block)
|
14
|
+
@block ||= block
|
15
|
+
matched = matches(stringlike)
|
16
|
+
|
17
|
+
if @options[:count]
|
18
|
+
matched.size == @options[:count].to_i && (!@block || @block.call(matched))
|
19
|
+
else
|
20
|
+
matched.any? && (!@block || @block.call(matched))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def matches(stringlike)
|
25
|
+
nokogiri_matches(stringlike)
|
26
|
+
end
|
27
|
+
|
28
|
+
def nokogiri_matches(stringlike)
|
29
|
+
if Nokogiri::XML::NodeSet === stringlike
|
30
|
+
@query = query.gsub(%r'^//', './/')
|
31
|
+
else
|
32
|
+
@query = query
|
33
|
+
end
|
34
|
+
|
35
|
+
add_options_conditions_to(@query)
|
36
|
+
|
37
|
+
@document = Webrat::XML.document(stringlike)
|
38
|
+
@document.xpath(*@query)
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_options_conditions_to(query)
|
42
|
+
add_attributes_conditions_to(query)
|
43
|
+
add_content_condition_to(query)
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_attributes_conditions_to(query)
|
47
|
+
attribute_conditions = []
|
48
|
+
|
49
|
+
@options.each do |key, value|
|
50
|
+
next if [:content, :count].include?(key)
|
51
|
+
attribute_conditions << "@#{key} = #{xpath_escape(value)}"
|
52
|
+
end
|
53
|
+
|
54
|
+
if attribute_conditions.any?
|
55
|
+
query << "[#{attribute_conditions.join(' and ')}]"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_content_condition_to(query)
|
60
|
+
if @options[:content]
|
61
|
+
query << "[contains(., #{xpath_escape(@options[:content])})]"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def query
|
66
|
+
@expected
|
67
|
+
end
|
68
|
+
|
69
|
+
# ==== Returns
|
70
|
+
# String:: The failure message.
|
71
|
+
def failure_message
|
72
|
+
"expected following text to match xpath #{@expected}:\n#{@document}"
|
73
|
+
end
|
74
|
+
|
75
|
+
# ==== Returns
|
76
|
+
# String:: The failure message to be displayed in negative matches.
|
77
|
+
def negative_failure_message
|
78
|
+
"expected following text to not match xpath #{@expected}:\n#{@document}"
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
|
83
|
+
def xpath_escape(string)
|
84
|
+
if string.include?("'") && string.include?('"')
|
85
|
+
parts = string.split("'").map do |part|
|
86
|
+
"'#{part}'"
|
87
|
+
end
|
88
|
+
|
89
|
+
"concat(" + parts.join(", \"'\", ") + ")"
|
90
|
+
elsif string.include?("'")
|
91
|
+
"\"#{string}\""
|
92
|
+
else
|
93
|
+
"'#{string}'"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
# Matches HTML content against an XPath query
|
100
|
+
#
|
101
|
+
# ==== Parameters
|
102
|
+
# expected<String>:: The XPath query to look for.
|
103
|
+
#
|
104
|
+
# ==== Returns
|
105
|
+
# HaveXpath:: A new have xpath matcher.
|
106
|
+
def have_xpath(expected, options = {}, &block)
|
107
|
+
HaveXpath.new(expected, options, &block)
|
108
|
+
end
|
109
|
+
alias_method :match_xpath, :have_xpath
|
110
|
+
|
111
|
+
def assert_have_xpath(expected, options = {}, &block)
|
112
|
+
hs = HaveXpath.new(expected, options, &block)
|
113
|
+
assert hs.matches?(response_body), hs.failure_message
|
114
|
+
end
|
115
|
+
|
116
|
+
def assert_have_no_xpath(expected, options = {}, &block)
|
117
|
+
hs = HaveXpath.new(expected, options, &block)
|
118
|
+
assert !hs.matches?(response_body), hs.negative_failure_message
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
data/lib/webrat/core/matchers.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require "webrat/core/matchers/have_xpath"
|
2
|
-
require "webrat/core/matchers/have_selector"
|
3
|
-
require "webrat/core/matchers/have_tag"
|
4
|
-
require "webrat/core/matchers/have_content"
|
1
|
+
require "webrat/core/matchers/have_xpath"
|
2
|
+
require "webrat/core/matchers/have_selector"
|
3
|
+
require "webrat/core/matchers/have_tag"
|
4
|
+
require "webrat/core/matchers/have_content"
|
data/lib/webrat/core/methods.rb
CHANGED
@@ -1,64 +1,64 @@
|
|
1
|
-
module Webrat
|
2
|
-
module Methods #:nodoc:
|
3
|
-
|
4
|
-
def self.delegate_to_session(*meths)
|
5
|
-
meths.each do |meth|
|
6
|
-
self.class_eval <<-RUBY
|
7
|
-
def #{meth}(*args, &blk)
|
8
|
-
webrat_session.#{meth}(*args, &blk)
|
9
|
-
end
|
10
|
-
RUBY
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def webrat
|
15
|
-
webrat_session
|
16
|
-
end
|
17
|
-
|
18
|
-
def webrat_session
|
19
|
-
@_webrat_session ||= begin
|
20
|
-
session = Webrat.session_class.new
|
21
|
-
session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
|
22
|
-
session
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# all of these methods delegate to the @session, which should
|
27
|
-
# be created transparently.
|
28
|
-
#
|
29
|
-
# Note that when using Webrat, #request also uses @session, so
|
30
|
-
# that #request and webrat native functions behave interchangably
|
31
|
-
|
32
|
-
delegate_to_session \
|
33
|
-
:visits, :visit,
|
34
|
-
:within,
|
35
|
-
:header, :http_accept, :basic_auth,
|
36
|
-
:save_and_open_page,
|
37
|
-
:fills_in, :fill_in,
|
38
|
-
:checks, :check,
|
39
|
-
:unchecks, :uncheck,
|
40
|
-
:chooses, :choose,
|
41
|
-
:selects, :select,
|
42
|
-
:unselects, :unselect,
|
43
|
-
:attaches_file, :attach_file,
|
44
|
-
:current_page,
|
45
|
-
:current_url,
|
46
|
-
:clicks_link, :click_link,
|
47
|
-
:clicks_area, :click_area,
|
48
|
-
:clicks_button, :click_button,
|
49
|
-
:reload, :reloads,
|
50
|
-
:clicks_link_within, :click_link_within,
|
51
|
-
:field_labeled,
|
52
|
-
:select_option,
|
53
|
-
:set_hidden_field, :submit_form,
|
54
|
-
:request_page, :current_dom,
|
55
|
-
:response_body,
|
56
|
-
:selects_date, :selects_time, :selects_datetime,
|
57
|
-
:select_date, :select_time, :select_datetime,
|
58
|
-
:field_by_xpath,
|
59
|
-
:field_with_id,
|
60
|
-
:selenium,
|
61
|
-
:simulate, :automate,
|
62
|
-
:field_named
|
63
|
-
end
|
64
|
-
end
|
1
|
+
module Webrat
|
2
|
+
module Methods #:nodoc:
|
3
|
+
|
4
|
+
def self.delegate_to_session(*meths)
|
5
|
+
meths.each do |meth|
|
6
|
+
self.class_eval <<-RUBY
|
7
|
+
def #{meth}(*args, &blk)
|
8
|
+
webrat_session.#{meth}(*args, &blk)
|
9
|
+
end
|
10
|
+
RUBY
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def webrat
|
15
|
+
webrat_session
|
16
|
+
end
|
17
|
+
|
18
|
+
def webrat_session
|
19
|
+
@_webrat_session ||= begin
|
20
|
+
session = Webrat.session_class.new
|
21
|
+
session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
|
22
|
+
session
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# all of these methods delegate to the @session, which should
|
27
|
+
# be created transparently.
|
28
|
+
#
|
29
|
+
# Note that when using Webrat, #request also uses @session, so
|
30
|
+
# that #request and webrat native functions behave interchangably
|
31
|
+
|
32
|
+
delegate_to_session \
|
33
|
+
:visits, :visit,
|
34
|
+
:within,
|
35
|
+
:header, :http_accept, :basic_auth,
|
36
|
+
:save_and_open_page,
|
37
|
+
:fills_in, :fill_in,
|
38
|
+
:checks, :check,
|
39
|
+
:unchecks, :uncheck,
|
40
|
+
:chooses, :choose,
|
41
|
+
:selects, :select,
|
42
|
+
:unselects, :unselect,
|
43
|
+
:attaches_file, :attach_file,
|
44
|
+
:current_page,
|
45
|
+
:current_url,
|
46
|
+
:clicks_link, :click_link,
|
47
|
+
:clicks_area, :click_area,
|
48
|
+
:clicks_button, :click_button,
|
49
|
+
:reload, :reloads,
|
50
|
+
:clicks_link_within, :click_link_within,
|
51
|
+
:field_labeled,
|
52
|
+
:select_option,
|
53
|
+
:set_hidden_field, :submit_form,
|
54
|
+
:request_page, :current_dom,
|
55
|
+
:response_body,
|
56
|
+
:selects_date, :selects_time, :selects_datetime,
|
57
|
+
:select_date, :select_time, :select_datetime,
|
58
|
+
:field_by_xpath,
|
59
|
+
:field_with_id,
|
60
|
+
:selenium,
|
61
|
+
:simulate, :automate,
|
62
|
+
:field_named
|
63
|
+
end
|
64
|
+
end
|
data/lib/webrat/core/mime.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
module Webrat #:nodoc:
|
2
|
-
module MIME #:nodoc:
|
3
|
-
MIME_TYPES = Rack::Mime::MIME_TYPES.dup.merge(
|
4
|
-
".multipart_form" => "multipart/form-data",
|
5
|
-
".url_encoded_form" => "application/x-www-form-urlencoded"
|
6
|
-
).freeze
|
7
|
-
|
8
|
-
def mime_type(type)
|
9
|
-
return type if type.nil? || type.to_s.include?("/")
|
10
|
-
type = ".#{type}" unless type.to_s[0] == ?.
|
11
|
-
MIME_TYPES.fetch(type) { |type|
|
12
|
-
raise ArgumentError.new("Invalid Mime type: #{type}")
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
module_function :mime_type
|
17
|
-
end
|
18
|
-
end
|
1
|
+
module Webrat #:nodoc:
|
2
|
+
module MIME #:nodoc:
|
3
|
+
MIME_TYPES = Rack::Mime::MIME_TYPES.dup.merge(
|
4
|
+
".multipart_form" => "multipart/form-data",
|
5
|
+
".url_encoded_form" => "application/x-www-form-urlencoded"
|
6
|
+
).freeze
|
7
|
+
|
8
|
+
def mime_type(type)
|
9
|
+
return type if type.nil? || type.to_s.include?("/")
|
10
|
+
type = ".#{type}" unless type.to_s[0] == ?.
|
11
|
+
MIME_TYPES.fetch(type) { |type|
|
12
|
+
raise ArgumentError.new("Invalid Mime type: #{type}")
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
module_function :mime_type
|
17
|
+
end
|
18
|
+
end
|