indirect-webrat 0.7.4
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 +21 -0
- data/Gemfile +14 -0
- data/History.txt +470 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +85 -0
- data/Rakefile +143 -0
- data/Thorfile +118 -0
- data/install.rb +1 -0
- data/lib/webrat.rb +18 -0
- data/lib/webrat/adapters/mechanize.rb +94 -0
- data/lib/webrat/adapters/merb.rb +11 -0
- data/lib/webrat/adapters/rack.rb +30 -0
- data/lib/webrat/adapters/rails.rb +77 -0
- data/lib/webrat/adapters/sinatra.rb +9 -0
- data/lib/webrat/core.rb +13 -0
- data/lib/webrat/core/configuration.rb +114 -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 +438 -0
- data/lib/webrat/core/elements/form.rb +127 -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.rb +20 -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 +82 -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/logging.rb +23 -0
- data/lib/webrat/core/matchers.rb +4 -0
- data/lib/webrat/core/matchers/have_content.rb +68 -0
- data/lib/webrat/core/matchers/have_selector.rb +85 -0
- data/lib/webrat/core/matchers/have_tag.rb +21 -0
- data/lib/webrat/core/matchers/have_xpath.rb +124 -0
- data/lib/webrat/core/methods.rb +73 -0
- data/lib/webrat/core/mime.rb +18 -0
- data/lib/webrat/core/save_and_open_page.rb +28 -0
- data/lib/webrat/core/scope.rb +362 -0
- data/lib/webrat/core/session.rb +318 -0
- data/lib/webrat/core/xml.rb +44 -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_query_string.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/rack.rb +9 -0
- data/lib/webrat/integrations/rails.rb +25 -0
- data/lib/webrat/integrations/rspec-rails.rb +11 -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.rb +70 -0
- data/lib/webrat/selenium/application_server_factory.rb +43 -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/rack.rb +51 -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 +19 -0
- data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -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.rb +4 -0
- data/lib/webrat/selenium/matchers/have_content.rb +78 -0
- data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
- data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
- data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
- data/lib/webrat/selenium/selenium_extensions.js +6 -0
- data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
- data/lib/webrat/selenium/selenium_session.rb +276 -0
- data/lib/webrat/selenium/silence_stream.rb +18 -0
- data/spec/fakes/test_adapter.rb +33 -0
- data/spec/integration/mechanize/Rakefile +7 -0
- data/spec/integration/mechanize/config.ru +2 -0
- data/spec/integration/mechanize/sample_app.rb +35 -0
- data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
- data/spec/integration/mechanize/spec/spec_helper.rb +29 -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 +20 -0
- data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
- data/spec/integration/rails/.gitignore +3 -0
- data/spec/integration/rails/Rakefile +30 -0
- data/spec/integration/rails/app/controllers/application_controller.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 +9 -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 +9 -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 +66 -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 +123 -0
- data/spec/integration/rails/test/test_helper.rb +27 -0
- data/spec/integration/sinatra/Rakefile +5 -0
- data/spec/integration/sinatra/classic_app.rb +63 -0
- data/spec/integration/sinatra/modular_app.rb +15 -0
- data/spec/integration/sinatra/test/classic_app_test.rb +38 -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 +87 -0
- data/spec/private/core/field_spec.rb +83 -0
- data/spec/private/core/form_spec.rb +51 -0
- data/spec/private/core/link_spec.rb +24 -0
- data/spec/private/core/session_spec.rb +182 -0
- data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
- data/spec/private/nokogiri_spec.rb +77 -0
- data/spec/private/rails/attaches_file_spec.rb +114 -0
- data/spec/private/rails/rails_adapter_spec.rb +79 -0
- data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
- data/spec/public/basic_auth_spec.rb +35 -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 +544 -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 +118 -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 +165 -0
- data/spec/public/reload_spec.rb +10 -0
- data/spec/public/save_and_open_spec.rb +49 -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 +474 -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 +56 -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 +53 -0
- data/vendor/selenium-server.jar +0 -0
- data/webrat.gemspec +355 -0
- metadata +424 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require "webrat/core_extensions/detect_mapped"
|
|
2
|
+
require "webrat/core/locators/locator"
|
|
3
|
+
|
|
4
|
+
module Webrat
|
|
5
|
+
module Locators
|
|
6
|
+
|
|
7
|
+
class FieldLabeledLocator < Locator # :nodoc:
|
|
8
|
+
|
|
9
|
+
def locate
|
|
10
|
+
matching_labels.any? && matching_labels.detect_mapped { |label| label.field }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def matching_labels
|
|
14
|
+
matching_label_elements.sort_by do |label_element|
|
|
15
|
+
text(label_element).length
|
|
16
|
+
end.map do |label_element|
|
|
17
|
+
Label.load(@session, label_element)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def matching_label_elements
|
|
22
|
+
label_elements.select do |label_element|
|
|
23
|
+
text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def label_elements
|
|
28
|
+
@dom.xpath(*Label.xpath_search)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def error_message
|
|
32
|
+
"Could not find field labeled #{@value.inspect}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def text(element)
|
|
36
|
+
str = element.inner_text
|
|
37
|
+
str.gsub!("\n","")
|
|
38
|
+
str.strip!
|
|
39
|
+
str.squeeze!(" ")
|
|
40
|
+
str
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Locates a form field based on a <tt>label</tt> element in the HTML source.
|
|
46
|
+
# This can be useful in order to verify that a field is pre-filled with the
|
|
47
|
+
# correct value.
|
|
48
|
+
#
|
|
49
|
+
# Example:
|
|
50
|
+
# field_labeled("First name").value.should == "Bryan"
|
|
51
|
+
def field_labeled(label, *field_types)
|
|
52
|
+
FieldLabeledLocator.new(@session, dom, label, *field_types).locate!
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require "webrat/core/locators/locator"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Locators
|
|
5
|
+
|
|
6
|
+
class FieldLocator < Locator # :nodoc:
|
|
7
|
+
|
|
8
|
+
def locate
|
|
9
|
+
FieldByIdLocator.new(@session, @dom, @value).locate ||
|
|
10
|
+
FieldNamedLocator.new(@session, @dom, @value, *@field_types).locate ||
|
|
11
|
+
FieldLabeledLocator.new(@session, @dom, @value, *@field_types).locate
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def error_message
|
|
15
|
+
"Could not find field: #{@value.inspect}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def field(*args) # :nodoc:
|
|
21
|
+
FieldLocator.new(@session, dom, *args).locate!
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require "webrat/core/locators/locator"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Locators
|
|
5
|
+
|
|
6
|
+
class FieldNamedLocator < Locator # :nodoc:
|
|
7
|
+
|
|
8
|
+
def locate
|
|
9
|
+
Field.load(@session, field_element)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def field_element
|
|
13
|
+
field_elements.detect do |field_element|
|
|
14
|
+
field_element["name"] == @value.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def field_elements
|
|
19
|
+
@dom.xpath(*xpath_searches)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def xpath_searches
|
|
23
|
+
if @field_types.any?
|
|
24
|
+
@field_types.map { |field_type| field_type.xpath_search }.flatten
|
|
25
|
+
else
|
|
26
|
+
Field.xpath_search
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def error_message
|
|
31
|
+
"Could not find field named #{@value.inspect}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def field_named(name, *field_types)
|
|
37
|
+
FieldNamedLocator.new(@session, dom, name, *field_types).locate!
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "webrat/core/locators/locator"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Locators
|
|
5
|
+
|
|
6
|
+
class FormLocator < Locator # :nodoc:
|
|
7
|
+
|
|
8
|
+
def locate
|
|
9
|
+
Form.load(@session, form_element)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def form_element
|
|
13
|
+
@dom.css("#" + @value).first || @dom.css(@value).first
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require "webrat/core_extensions/detect_mapped"
|
|
2
|
+
require "webrat/core/locators/locator"
|
|
3
|
+
|
|
4
|
+
module Webrat
|
|
5
|
+
module Locators
|
|
6
|
+
|
|
7
|
+
class LabelLocator < Locator # :nodoc:
|
|
8
|
+
|
|
9
|
+
def locate
|
|
10
|
+
Label.load(@session, label_element)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def label_element
|
|
14
|
+
label_elements.detect do |label_element|
|
|
15
|
+
text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def label_elements
|
|
20
|
+
@dom.xpath(*Label.xpath_search)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def text(label_element)
|
|
24
|
+
str = label_element.inner_text
|
|
25
|
+
str.gsub!("\n","")
|
|
26
|
+
str.strip!
|
|
27
|
+
str.squeeze!(" ")
|
|
28
|
+
str
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require "webrat/core/locators/locator"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Locators
|
|
5
|
+
|
|
6
|
+
class LinkLocator < Locator # :nodoc:
|
|
7
|
+
|
|
8
|
+
def locate
|
|
9
|
+
Link.load(@session, link_element)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def link_element
|
|
13
|
+
matching_links.min { |a, b|
|
|
14
|
+
a_score = a.inner_text =~ matcher ? a.inner_text.length : 100
|
|
15
|
+
b_score = b.inner_text =~ matcher ? b.inner_text.length : 100
|
|
16
|
+
a_score <=> b_score
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def matching_links
|
|
21
|
+
@matching_links ||= link_elements.select do |link_element|
|
|
22
|
+
matches_text?(link_element) ||
|
|
23
|
+
matches_id?(link_element)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def matches_text?(link)
|
|
28
|
+
replace_nbsp(link.inner_text) =~ matcher ||
|
|
29
|
+
replace_nbsp_ref(link.inner_html) =~ matcher ||
|
|
30
|
+
link["title"] =~ matcher
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def matcher
|
|
34
|
+
@matcher ||= begin
|
|
35
|
+
if @value.is_a?(Regexp)
|
|
36
|
+
@value
|
|
37
|
+
else
|
|
38
|
+
/#{Regexp.escape(@value.to_s)}/i
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def matches_id?(link)
|
|
44
|
+
if @value.is_a?(Regexp)
|
|
45
|
+
link["id"] =~ @value ? true : false
|
|
46
|
+
else
|
|
47
|
+
link["id"] == @value ? true : false
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def link_elements
|
|
52
|
+
@dom.xpath(*Link.xpath_search)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def replace_nbsp(str)
|
|
56
|
+
if str.respond_to?(:valid_encoding?)
|
|
57
|
+
if str.valid_encoding?
|
|
58
|
+
str.gsub(/\xc2\xa0/u, ' ')
|
|
59
|
+
else
|
|
60
|
+
str.force_encoding('UTF-8').gsub(/\xc2\xa0/u, ' ')
|
|
61
|
+
end
|
|
62
|
+
else
|
|
63
|
+
str.gsub(/\xc2\xa0/u, ' ')
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def replace_nbsp_ref(str)
|
|
68
|
+
str.gsub(' ',' ').gsub(' ', ' ')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def error_message
|
|
72
|
+
"Could not find link with text or title or id #{@value.inspect}"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def find_link(text_or_title_or_id) #:nodoc:
|
|
78
|
+
LinkLocator.new(@session, dom, text_or_title_or_id).locate!
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
module Locators
|
|
3
|
+
|
|
4
|
+
class Locator # :nodoc:
|
|
5
|
+
|
|
6
|
+
def initialize(session, dom, value, *field_types)
|
|
7
|
+
@session = session
|
|
8
|
+
@dom = dom
|
|
9
|
+
@value = value
|
|
10
|
+
@field_types = field_types
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def locate!
|
|
14
|
+
locate || raise(NotFoundError.new(error_message))
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require "webrat/core_extensions/detect_mapped"
|
|
2
|
+
require "webrat/core/locators/locator"
|
|
3
|
+
|
|
4
|
+
module Webrat
|
|
5
|
+
module Locators
|
|
6
|
+
|
|
7
|
+
class SelectOptionLocator < Locator # :nodoc:
|
|
8
|
+
|
|
9
|
+
def initialize(session, dom, option_text, id_or_name_or_label)
|
|
10
|
+
@session = session
|
|
11
|
+
@dom = dom
|
|
12
|
+
@option_text = option_text
|
|
13
|
+
@id_or_name_or_label = id_or_name_or_label
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def locate
|
|
17
|
+
if @id_or_name_or_label
|
|
18
|
+
field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField, MultipleSelectField).locate!
|
|
19
|
+
|
|
20
|
+
field.options.detect do |o|
|
|
21
|
+
if @option_text.is_a?(Regexp)
|
|
22
|
+
o.element.inner_text =~ @option_text
|
|
23
|
+
else
|
|
24
|
+
o.inner_text == @option_text.to_s
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
option_element = option_elements.detect do |o|
|
|
29
|
+
if @option_text.is_a?(Regexp)
|
|
30
|
+
o.inner_text =~ @option_text
|
|
31
|
+
else
|
|
32
|
+
o.inner_text == @option_text.to_s
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
SelectOption.load(@session, option_element)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def option_elements
|
|
41
|
+
@dom.xpath(*SelectOption.xpath_search)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def error_message
|
|
45
|
+
if @id_or_name_or_label
|
|
46
|
+
"The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
|
|
47
|
+
else
|
|
48
|
+
"Could not find option #{@option_text.inspect}"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
|
|
55
|
+
SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require "logger"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Logging #:nodoc:
|
|
5
|
+
|
|
6
|
+
def debug_log(message) # :nodoc:
|
|
7
|
+
return unless logger
|
|
8
|
+
logger.debug message
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def logger # :nodoc:
|
|
12
|
+
case Webrat.configuration.mode
|
|
13
|
+
when :rails
|
|
14
|
+
defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil
|
|
15
|
+
when :merb
|
|
16
|
+
::Merb.logger
|
|
17
|
+
else
|
|
18
|
+
@logger ||= ::Logger.new("webrat.log")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Webrat
|
|
2
|
+
module Matchers
|
|
3
|
+
|
|
4
|
+
class HasContent #:nodoc:
|
|
5
|
+
def initialize(content)
|
|
6
|
+
@content = content
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def matches?(stringlike)
|
|
10
|
+
@document = Webrat::XML.document(stringlike)
|
|
11
|
+
@element = @document.inner_text
|
|
12
|
+
|
|
13
|
+
case @content
|
|
14
|
+
when String
|
|
15
|
+
@element.gsub(/\s+/, ' ').include?(@content)
|
|
16
|
+
when Regexp
|
|
17
|
+
@element.match(@content)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# ==== Returns
|
|
22
|
+
# String:: The failure message.
|
|
23
|
+
def failure_message
|
|
24
|
+
"expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# ==== Returns
|
|
28
|
+
# String:: The failure message to be displayed in negative matches.
|
|
29
|
+
def negative_failure_message
|
|
30
|
+
"expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def squeeze_space(inner_text)
|
|
34
|
+
inner_text.gsub(/^\s*$/, "").squeeze("\n")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def content_message
|
|
38
|
+
case @content
|
|
39
|
+
when String
|
|
40
|
+
"include \"#{@content}\""
|
|
41
|
+
when Regexp
|
|
42
|
+
"match #{@content.inspect}"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Matches the contents of an HTML document with
|
|
48
|
+
# whatever string is supplied
|
|
49
|
+
def contain(content)
|
|
50
|
+
HasContent.new(content)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Asserts that the body of the response contain
|
|
54
|
+
# the supplied string or regexp
|
|
55
|
+
def assert_contain(content)
|
|
56
|
+
hc = HasContent.new(content)
|
|
57
|
+
assert hc.matches?(current_dom), hc.failure_message
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Asserts that the body of the response
|
|
61
|
+
# does not contain the supplied string or regepx
|
|
62
|
+
def assert_not_contain(content)
|
|
63
|
+
hc = HasContent.new(content)
|
|
64
|
+
assert !hc.matches?(current_dom), hc.negative_failure_message
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require "webrat/core/matchers/have_xpath"
|
|
2
|
+
|
|
3
|
+
module Webrat
|
|
4
|
+
module Matchers
|
|
5
|
+
|
|
6
|
+
class HaveSelector < HaveXpath #:nodoc:
|
|
7
|
+
|
|
8
|
+
# ==== Returns
|
|
9
|
+
# String:: The default description for the spec when it is not provided.
|
|
10
|
+
def description
|
|
11
|
+
"have selector #{@expected.inspect}" + if @options && @options.any?
|
|
12
|
+
" with #{@options.inspect}"
|
|
13
|
+
else
|
|
14
|
+
''
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# ==== Returns
|
|
19
|
+
# String:: The failure message.
|
|
20
|
+
def failure_message
|
|
21
|
+
"expected following output to contain a #{tag_inspect} tag:\n#{@document}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# ==== Returns
|
|
25
|
+
# String:: The failure message to be displayed in negative matches.
|
|
26
|
+
def negative_failure_message
|
|
27
|
+
"expected following output to omit a #{tag_inspect}:\n#{@document}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def tag_inspect
|
|
31
|
+
options = @options.dup
|
|
32
|
+
count = options.delete(:count)
|
|
33
|
+
content = options.delete(:content)
|
|
34
|
+
|
|
35
|
+
html = "<#{@expected}"
|
|
36
|
+
options.each do |k,v|
|
|
37
|
+
html << " #{k}='#{v}'"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if content
|
|
41
|
+
html << ">#{content}</#{@expected}>"
|
|
42
|
+
else
|
|
43
|
+
html << "/>"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
html
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def query
|
|
50
|
+
Nokogiri::CSS.parse(@expected.to_s).map do |ast|
|
|
51
|
+
ast.to_xpath
|
|
52
|
+
end.first
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Matches HTML content against a CSS 3 selector.
|
|
58
|
+
#
|
|
59
|
+
# ==== Parameters
|
|
60
|
+
# expected<String>:: The CSS selector to look for.
|
|
61
|
+
#
|
|
62
|
+
# ==== Returns
|
|
63
|
+
# HaveSelector:: A new have selector matcher.
|
|
64
|
+
def have_selector(name, attributes = {}, &block)
|
|
65
|
+
HaveSelector.new(name, attributes, &block)
|
|
66
|
+
end
|
|
67
|
+
alias_method :match_selector, :have_selector
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# Asserts that the body of the response contains
|
|
71
|
+
# the supplied selector
|
|
72
|
+
def assert_have_selector(name, attributes = {}, &block)
|
|
73
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
|
74
|
+
assert matcher.matches?(response_body), matcher.failure_message
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Asserts that the body of the response
|
|
78
|
+
# does not contain the supplied string or regepx
|
|
79
|
+
def assert_have_no_selector(name, attributes = {}, &block)
|
|
80
|
+
matcher = HaveSelector.new(name, attributes, &block)
|
|
81
|
+
assert !matcher.matches?(response_body), matcher.negative_failure_message
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
end
|