kbaum-webrat 0.5.1 → 0.6.1.pre
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/.gitignore +4 -1
- data/Gemfile +19 -0
- data/History.txt +11 -1
- data/Rakefile +25 -66
- data/Thorfile +117 -0
- data/lib/webrat/adapters/rails.rb +1 -16
- data/lib/webrat/core/elements/link.rb +1 -1
- data/lib/webrat/core/session.rb +1 -1
- data/lib/webrat/integrations/merb.rb +1 -1
- data/lib/webrat/integrations/rails.rb +16 -0
- data/lib/webrat/integrations/rspec-rails.rb +2 -1
- data/lib/webrat/integrations/selenium.rb +1 -1
- data/lib/webrat/rspec-rails.rb +1 -1
- data/lib/webrat/selenium/application_servers/external.rb +1 -1
- data/lib/webrat/selenium/application_servers.rb +1 -1
- data/lib/webrat/selenium/location_strategy_javascript/label.js +31 -13
- data/lib/webrat/selenium/location_strategy_javascript/webrat.js +1 -0
- data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +24 -4
- data/lib/webrat/selenium/selenium_rc_server.rb +2 -2
- data/lib/webrat/selenium/selenium_session.rb +19 -2
- data/lib/webrat/selenium/silence_stream.rb +1 -1
- data/lib/webrat.rb +1 -1
- data/spec/integration/mechanize/spec/spec_helper.rb +3 -1
- data/spec/integration/rails/app/controllers/{application.rb → application_controller.rb} +0 -0
- data/spec/integration/rails/app/controllers/webrat_controller.rb +3 -0
- data/spec/integration/rails/app/views/buttons/show.html.erb +0 -2
- data/spec/integration/rails/app/views/webrat/buttons.html.erb +0 -2
- data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
- data/spec/integration/rails/config/environment.rb +1 -1
- data/spec/integration/rails/config/routes.rb +1 -0
- data/spec/integration/rails/test/integration/button_click_test.rb +12 -26
- data/spec/integration/rails/test/integration/fill_in_test.rb +1 -1
- data/spec/integration/rails/test/integration/link_click_test.rb +1 -1
- data/spec/integration/rails/test/integration/webrat_test.rb +35 -9
- data/spec/integration/rails/test/test_helper.rb +1 -0
- data/spec/private/core/field_spec.rb +9 -11
- data/spec/private/rails/rails_adapter_spec.rb +0 -24
- data/spec/public/basic_auth_spec.rb +13 -2
- data/spec/public/click_link_spec.rb +21 -0
- data/spec/public/fill_in_spec.rb +1 -1
- data/spec/public/matchers/have_selector_spec.rb +1 -1
- data/webrat.gemspec +307 -315
- metadata +13 -42
- data/VERSION +0 -1
- data/selenium_rc_server.patch +0 -20
data/.gitignore
CHANGED
data/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
clear_sources
|
2
|
+
source 'http://gemcutter.org'
|
3
|
+
|
4
|
+
disable_system_gems
|
5
|
+
|
6
|
+
gem "git", "1.2.5"
|
7
|
+
gem "rake", "0.8.7"
|
8
|
+
gem "rspec", "1.2.9"
|
9
|
+
gem "diff-lcs", "1.1.2"
|
10
|
+
gem "rack", "1.0.1"
|
11
|
+
gem "nokogiri", "1.4.0"
|
12
|
+
gem "merb-core", "1.0.15"
|
13
|
+
gem "selenium-client", "1.2.17"
|
14
|
+
gem "mechanize", "0.9.3"
|
15
|
+
gem "rails", "2.3.4"
|
16
|
+
gem "launchy", "0.3.3"
|
17
|
+
gem "rack-test", "0.5.2"
|
18
|
+
gem "sinatra", "0.9.4"
|
19
|
+
gem "mongrel", "1.1.5"
|
data/History.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
==
|
1
|
+
== 0.6.0 / 2009-11-28
|
2
2
|
|
3
3
|
REMOVED: Support for Hpricot + REXML as an alternative to Nokogiri.
|
4
4
|
|
@@ -12,17 +12,27 @@ CHANGED: Due to a reorganization, if you're currently requiring "webrat/rspec-ra
|
|
12
12
|
|
13
13
|
* Minor enhancements
|
14
14
|
|
15
|
+
* Support Rails 2.3.4 JavaScript form authenticity tokens in simulated mode (Jonathan Weiss)
|
16
|
+
* When a timeout occurs in wait_for, include the HTML from Selenium in the exception
|
15
17
|
* Update the Merb support to be based directly on Rack (Simon Rozet)
|
16
18
|
* Support multiple select fields (Kieran P)
|
17
19
|
* When locating select options, always match against text, not HTML
|
18
20
|
|
19
21
|
* Bug fixes
|
20
22
|
|
23
|
+
* Remove newlines from HTTP Basic authentication credentials (Michael Klett)
|
24
|
+
* Require nokogiri form rspec-rails.rb (David Chelimsky)
|
21
25
|
* Fix logger issue when running inside Cucumber (Damian Janowski)
|
22
26
|
* Fix various issues related to submitting values with HTML entities (Kieran P)
|
23
27
|
* Call #to_i on the :count option in matchers (Michael Christenson II)
|
24
28
|
* Fix bug where multiline param values were getting truncated
|
25
29
|
|
30
|
+
== 0.5.3 / 2009-08-27
|
31
|
+
|
32
|
+
* Minor enhancements
|
33
|
+
|
34
|
+
* Remove unnecessary requires which are to the wrong paths on Edge Rails
|
35
|
+
|
26
36
|
== 0.5.1 / 2009-08-18
|
27
37
|
|
28
38
|
* Minor enhancements
|
data/Rakefile
CHANGED
@@ -1,62 +1,26 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
|
3
3
|
begin
|
4
|
-
require '
|
5
|
-
|
6
|
-
Jeweler::Tasks.new do |s|
|
7
|
-
s.name = "kbaum-webrat"
|
8
|
-
s.author = "Bryan Helmkamp"
|
9
|
-
s.email = "bryan" + "@" + "brynary.com"
|
10
|
-
s.homepage = "http://github.com/brynary/webrat"
|
11
|
-
s.summary = "Ruby Acceptance Testing for Web applications"
|
12
|
-
s.description = <<-EOS.strip
|
13
|
-
Webrat lets you quickly write expressive and robust acceptance tests
|
14
|
-
for a Ruby web application. It supports simulating a browser inside
|
15
|
-
a Ruby process to avoid the performance hit and browser dependency of
|
16
|
-
Selenium or Watir, but the same API can also be used to drive real
|
17
|
-
Selenium tests when necessary (eg. for testing AJAX interactions).
|
18
|
-
Most Ruby web frameworks and testing frameworks are supported.
|
19
|
-
EOS
|
20
|
-
|
21
|
-
s.rubyforge_project = "webrat"
|
22
|
-
s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
|
23
|
-
|
24
|
-
# Dependencies
|
25
|
-
s.add_dependency "nokogiri", ">= 1.2.0"
|
26
|
-
s.add_dependency "rack", ">= 1.0"
|
27
|
-
|
28
|
-
s.add_development_dependency "rails", ">= 2.3"
|
29
|
-
s.add_development_dependency "merb-core", ">= 1.0"
|
30
|
-
s.add_development_dependency "launchy"
|
31
|
-
end
|
32
|
-
|
33
|
-
Jeweler::RubyforgeTasks.new
|
4
|
+
require 'spec/rake/spectask'
|
34
5
|
rescue LoadError
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
desc "Run API and Core specs"
|
43
|
-
Spec::Rake::SpecTask.new do |t|
|
44
|
-
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
45
|
-
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
46
|
-
end
|
47
|
-
|
48
|
-
desc "Run all specs in spec directory with RCov"
|
49
|
-
Spec::Rake::SpecTask.new(:rcov) do |t|
|
50
|
-
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
51
|
-
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
52
|
-
t.rcov = true
|
53
|
-
t.rcov_opts = lambda do
|
54
|
-
IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
6
|
+
desc "Run specs"
|
7
|
+
task(:spec) { $stderr.puts '`gem install rspec` to run specs' }
|
8
|
+
else
|
9
|
+
desc "Run API and Core specs"
|
10
|
+
Spec::Rake::SpecTask.new do |t|
|
11
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
12
|
+
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
55
13
|
end
|
56
|
-
end
|
57
14
|
|
58
|
-
|
59
|
-
|
15
|
+
desc "Run all specs in spec directory with RCov"
|
16
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
17
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""]
|
18
|
+
t.spec_files = FileList['spec/public/**/*_spec.rb'] + FileList['spec/private/**/*_spec.rb']
|
19
|
+
t.rcov = true
|
20
|
+
t.rcov_opts = lambda do
|
21
|
+
IO.readlines(File.dirname(__FILE__) + "/spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
22
|
+
end
|
23
|
+
end
|
60
24
|
end
|
61
25
|
|
62
26
|
desc "Run everything against multiruby"
|
@@ -111,18 +75,18 @@ task :spec_deps do
|
|
111
75
|
end
|
112
76
|
end
|
113
77
|
|
114
|
-
task :prepare do
|
115
|
-
system "ln -s ../../../../.. ./spec/integration/rails/vendor/plugins/webrat"
|
116
|
-
end
|
117
|
-
|
118
78
|
namespace :spec do
|
119
79
|
desc "Run the integration specs"
|
120
|
-
task :integration => [
|
80
|
+
task :integration => [
|
81
|
+
"integration:rack",
|
82
|
+
"integration:sinatra",
|
83
|
+
"integration:merb",
|
84
|
+
"integration:mechanize",
|
85
|
+
"integration:rails:webrat",
|
86
|
+
"integration:rails:selenium",
|
87
|
+
]
|
121
88
|
|
122
89
|
namespace :integration do
|
123
|
-
desc "Run the Rails integration specs"
|
124
|
-
task :rails => ['rails:webrat'] #,'rails:selenium'] currently not running selenium as it doesn't pass.
|
125
|
-
|
126
90
|
namespace :rails do
|
127
91
|
task :selenium do
|
128
92
|
Dir.chdir "spec/integration/rails" do
|
@@ -178,9 +142,4 @@ task :whitespace do
|
|
178
142
|
sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;}
|
179
143
|
end
|
180
144
|
|
181
|
-
if defined?(Jeweler)
|
182
|
-
task :spec => :check_dependencies
|
183
|
-
task :build => :gemspec
|
184
|
-
end
|
185
|
-
|
186
145
|
task :default => :spec
|
data/Thorfile
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
module GemHelpers
|
2
|
+
|
3
|
+
def generate_gemspec
|
4
|
+
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
|
5
|
+
require "webrat"
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "webrat"
|
9
|
+
s.version = Webrat::VERSION
|
10
|
+
s.author = "Bryan Helmkamp"
|
11
|
+
s.email = "bryan@brynary.com"
|
12
|
+
s.homepage = "http://github.com/brynary/webrat"
|
13
|
+
s.summary = "Ruby Acceptance Testing for Web applications"
|
14
|
+
s.description = <<-EOS.strip
|
15
|
+
Webrat lets you quickly write expressive and robust acceptance tests
|
16
|
+
for a Ruby web application. It supports simulating a browser inside
|
17
|
+
a Ruby process to avoid the performance hit and browser dependency of
|
18
|
+
Selenium or Watir, but the same API can also be used to drive real
|
19
|
+
Selenium tests when necessary (eg. for testing AJAX interactions).
|
20
|
+
Most Ruby web frameworks and testing frameworks are supported.
|
21
|
+
EOS
|
22
|
+
s.rubyforge_project = "webrat"
|
23
|
+
|
24
|
+
require "git"
|
25
|
+
repo = Git.open(".")
|
26
|
+
|
27
|
+
s.files = normalize_files(repo.ls_files.keys - repo.lib.ignored_files)
|
28
|
+
s.test_files = normalize_files(Dir['spec/**/*.rb'] - repo.lib.ignored_files)
|
29
|
+
|
30
|
+
s.has_rdoc = true
|
31
|
+
s.extra_rdoc_files = %w[README.rdoc MIT-LICENSE.txt History.txt]
|
32
|
+
|
33
|
+
s.add_dependency "nokogiri", ">= 1.2.0"
|
34
|
+
s.add_dependency "rack", ">= 1.0"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def normalize_files(array)
|
39
|
+
# only keep files, no directories, and sort
|
40
|
+
array.select do |path|
|
41
|
+
File.file?(path)
|
42
|
+
end.sort
|
43
|
+
end
|
44
|
+
|
45
|
+
# Adds extra space when outputting an array. This helps create better version
|
46
|
+
# control diffs, because otherwise it is all on the same line.
|
47
|
+
def prettyify_array(gemspec_ruby, array_name)
|
48
|
+
gemspec_ruby.gsub(/s\.#{array_name.to_s} = \[.+?\]/) do |match|
|
49
|
+
leadin, files = match[0..-2].split("[")
|
50
|
+
leadin + "[\n #{files.split(",").join(",\n ")}\n ]"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_gemspec
|
55
|
+
@read_gemspec ||= eval(File.read("webrat.gemspec"))
|
56
|
+
end
|
57
|
+
|
58
|
+
def sh(command)
|
59
|
+
puts command
|
60
|
+
system command
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class Default < Thor
|
65
|
+
include GemHelpers
|
66
|
+
|
67
|
+
desc "gemspec", "Regenerate webrat.gemspec"
|
68
|
+
def gemspec
|
69
|
+
File.open("webrat.gemspec", "w") do |file|
|
70
|
+
gemspec_ruby = generate_gemspec.to_ruby
|
71
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :files)
|
72
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :test_files)
|
73
|
+
gemspec_ruby = prettyify_array(gemspec_ruby, :extra_rdoc_files)
|
74
|
+
|
75
|
+
file.write gemspec_ruby
|
76
|
+
end
|
77
|
+
|
78
|
+
puts "Wrote gemspec to webrat.gemspec"
|
79
|
+
read_gemspec.validate
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "build", "Build a webrat gem"
|
83
|
+
def build
|
84
|
+
sh "gem build webrat.gemspec"
|
85
|
+
FileUtils.mkdir_p "pkg"
|
86
|
+
FileUtils.mv read_gemspec.file_name, "pkg"
|
87
|
+
end
|
88
|
+
|
89
|
+
desc "install", "Install the latest built gem"
|
90
|
+
def install
|
91
|
+
sh "gem install --local pkg/#{read_gemspec.file_name}"
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "release", "Release the current branch to GitHub and Gemcutter"
|
95
|
+
def release
|
96
|
+
gemspec
|
97
|
+
build
|
98
|
+
Release.new.tag
|
99
|
+
Release.new.gem
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class Release < Thor
|
104
|
+
include GemHelpers
|
105
|
+
|
106
|
+
desc "tag", "Tag the gem on the origin server"
|
107
|
+
def tag
|
108
|
+
release_tag = "v#{read_gemspec.version}"
|
109
|
+
sh "git tag -a #{release_tag} -m 'Tagging #{release_tag}'"
|
110
|
+
sh "git push origin #{release_tag}"
|
111
|
+
end
|
112
|
+
|
113
|
+
desc "gem", "Push the gem to Gemcutter"
|
114
|
+
def gem
|
115
|
+
sh "gem push pkg/#{read_gemspec.file_name}"
|
116
|
+
end
|
117
|
+
end
|
@@ -11,21 +11,6 @@ module Webrat
|
|
11
11
|
@integration_session = session
|
12
12
|
end
|
13
13
|
|
14
|
-
# The Rails version of within supports passing in a model and Webrat
|
15
|
-
# will apply a scope based on Rails' dom_id for that model.
|
16
|
-
#
|
17
|
-
# Example:
|
18
|
-
# within User.last do
|
19
|
-
# click_link "Delete"
|
20
|
-
# end
|
21
|
-
def within(selector_or_object, &block)
|
22
|
-
if selector_or_object.is_a?(String)
|
23
|
-
super
|
24
|
-
else
|
25
|
-
super('#' + dom_id(selector_or_object), &block)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
14
|
def doc_root
|
30
15
|
File.expand_path(File.join(RAILS_ROOT, 'public'))
|
31
16
|
end
|
@@ -93,4 +78,4 @@ module Webrat
|
|
93
78
|
integration_session.response
|
94
79
|
end
|
95
80
|
end
|
96
|
-
end
|
81
|
+
end
|
@@ -53,7 +53,7 @@ module Webrat
|
|
53
53
|
|
54
54
|
def authenticity_token
|
55
55
|
return unless onclick && onclick.include?("s.setAttribute('name', 'authenticity_token');") &&
|
56
|
-
onclick =~ /s\.setAttribute\('value', '([a-f0-9]{40})'\);/
|
56
|
+
( onclick =~ /s\.setAttribute\('value', '([a-f0-9]{40})'\);/ || onclick =~ /s\.setAttribute\('value', '(.{44})'\);/ )
|
57
57
|
$LAST_MATCH_INFO.captures.first
|
58
58
|
end
|
59
59
|
|
data/lib/webrat/core/session.rb
CHANGED
@@ -5,5 +5,21 @@ module ActionController #:nodoc:
|
|
5
5
|
IntegrationTest.class_eval do
|
6
6
|
include Webrat::Methods
|
7
7
|
include Webrat::Matchers
|
8
|
+
|
9
|
+
# The Rails version of within supports passing in a model and Webrat
|
10
|
+
# will apply a scope based on Rails' dom_id for that model.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
# within User.last do
|
14
|
+
# click_link "Delete"
|
15
|
+
# end
|
16
|
+
def within(selector_or_object, &block)
|
17
|
+
if selector_or_object.is_a?(String)
|
18
|
+
super
|
19
|
+
else
|
20
|
+
super('#' + RecordIdentifier.dom_id(selector_or_object), &block)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
8
24
|
end
|
9
25
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# Supports using the matchers in controller, helper, and view specs if you're
|
2
2
|
# using rspec-rails. Just add a require statement to spec/spec_helper.rb or env.rb:
|
3
3
|
#
|
4
|
-
# require 'webrat/rspec-rails'
|
4
|
+
# require 'webrat/integrations/rspec-rails'
|
5
5
|
#
|
6
|
+
require "nokogiri"
|
6
7
|
require "webrat/core/matchers"
|
7
8
|
|
8
9
|
Spec::Runner.configure do |config|
|
data/lib/webrat/rspec-rails.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
warn("Requiring 'webrat/rspec-rails' is deprecated. Please require 'webrat/integrations/rspec-rails' instead")
|
2
|
-
require "webrat/integrations/rspec-rails"
|
2
|
+
require "webrat/integrations/rspec-rails"
|
@@ -2,4 +2,4 @@ require "webrat/selenium/application_servers/base"
|
|
2
2
|
require "webrat/selenium/application_servers/sinatra"
|
3
3
|
require "webrat/selenium/application_servers/merb"
|
4
4
|
require "webrat/selenium/application_servers/rails"
|
5
|
-
require "webrat/selenium/application_servers/external"
|
5
|
+
require "webrat/selenium/application_servers/external"
|
@@ -1,24 +1,42 @@
|
|
1
|
+
// Credit to: http://simonwillison.net/2006/Jan/20/escape/
|
2
|
+
RegExp.escape = function(text) {
|
3
|
+
if (!arguments.callee.sRE) {
|
4
|
+
var specials = [
|
5
|
+
'/', '.', '*', '+', '?', '|',
|
6
|
+
'(', ')', '[', ']', '{', '}', '\\'
|
7
|
+
];
|
8
|
+
arguments.callee.sRE = new RegExp(
|
9
|
+
'(\\' + specials.join('|\\') + ')', 'g'
|
10
|
+
);
|
11
|
+
}
|
12
|
+
return text.replace(arguments.callee.sRE, '\\$1');
|
13
|
+
}
|
14
|
+
|
1
15
|
var allLabels = inDocument.getElementsByTagName("label");
|
16
|
+
var regExp = new RegExp('^\\W*' + RegExp.escape(locator) + '(\\b|$)', 'i');
|
17
|
+
|
2
18
|
var candidateLabels = $A(allLabels).select(function(candidateLabel){
|
3
|
-
var regExp = new RegExp('^' + locator + '\\b', 'i');
|
4
19
|
var labelText = getText(candidateLabel).strip();
|
5
20
|
return (labelText.search(regExp) >= 0);
|
6
21
|
});
|
22
|
+
|
7
23
|
if (candidateLabels.length == 0) {
|
8
24
|
return null;
|
9
25
|
}
|
10
|
-
|
26
|
+
|
27
|
+
//reverse length sort
|
28
|
+
candidateLabels = candidateLabels.sortBy(function(s) {
|
29
|
+
return s.length * -1;
|
30
|
+
});
|
31
|
+
|
11
32
|
var locatedLabel = candidateLabels.first();
|
12
|
-
var labelFor = locatedLabel.getAttribute('for')
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
return textAreaTags[0];
|
20
|
-
} else {
|
21
|
-
return null;
|
22
|
-
}
|
33
|
+
var labelFor = locatedLabel.getAttribute('for');
|
34
|
+
|
35
|
+
if ((labelFor == null) && (locatedLabel.hasChildNodes())) {
|
36
|
+
return locatedLabel.getElementsByTagName('button')[0]
|
37
|
+
|| locatedLabel.getElementsByTagName('input')[0]
|
38
|
+
|| locatedLabel.getElementsByTagName('textarea')[0]
|
39
|
+
|| locatedLabel.getElementsByTagName('select')[0];
|
23
40
|
}
|
41
|
+
|
24
42
|
return selenium.browserbot.locationStrategies['id'].call(this, labelFor, inDocument, inWindow);
|
@@ -1,4 +1,5 @@
|
|
1
1
|
var locationStrategies = selenium.browserbot.locationStrategies;
|
2
|
+
|
2
3
|
return locationStrategies['id'].call(this, locator, inDocument, inWindow)
|
3
4
|
|| locationStrategies['name'].call(this, locator, inDocument, inWindow)
|
4
5
|
|| locationStrategies['label'].call(this, locator, inDocument, inWindow)
|
@@ -1,12 +1,32 @@
|
|
1
1
|
var links = inDocument.getElementsByTagName('a');
|
2
|
+
|
2
3
|
var candidateLinks = $A(links).select(function(candidateLink) {
|
3
|
-
var textMatched =
|
4
|
-
var
|
5
|
-
var
|
4
|
+
var textMatched = false;
|
5
|
+
var titleMatched = false;
|
6
|
+
var idMatched = false;
|
7
|
+
|
8
|
+
if (getText(candidateLink).toLowerCase().indexOf(locator.toLowerCase()) != -1) {
|
9
|
+
textMatched = true;
|
10
|
+
}
|
11
|
+
|
12
|
+
if (candidateLink.title.toLowerCase().indexOf(locator.toLowerCase()) != -1) {
|
13
|
+
titleMatched = true;
|
14
|
+
}
|
15
|
+
|
16
|
+
if (candidateLink.id.toLowerCase().indexOf(locator.toLowerCase()) != -1) {
|
17
|
+
idMatched = true;
|
18
|
+
}
|
19
|
+
|
6
20
|
return textMatched || idMatched || titleMatched;
|
7
21
|
});
|
22
|
+
|
8
23
|
if (candidateLinks.length == 0) {
|
9
24
|
return null;
|
10
25
|
}
|
11
|
-
|
26
|
+
|
27
|
+
//reverse length sort
|
28
|
+
candidateLinks = candidateLinks.sortBy(function(s) {
|
29
|
+
return s.length * -1;
|
30
|
+
});
|
31
|
+
|
12
32
|
return candidateLinks.first();
|
@@ -74,8 +74,8 @@ module Webrat
|
|
74
74
|
|
75
75
|
def stop
|
76
76
|
silence_stream(STDOUT) do
|
77
|
-
::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
|
78
|
-
Webrat.configuration.selenium_server_port,
|
77
|
+
::Selenium::RemoteControl::RemoteControl.new("0.0.0.0",
|
78
|
+
Webrat.configuration.selenium_server_port,
|
79
79
|
:timeout => 5).stop
|
80
80
|
end
|
81
81
|
end
|
@@ -79,7 +79,12 @@ module Webrat
|
|
79
79
|
webrat_deprecate :clicks_button, :click_button
|
80
80
|
|
81
81
|
def click_link(link_text_or_regexp, options = {})
|
82
|
-
|
82
|
+
if link_text_or_regexp.is_a?(Regexp)
|
83
|
+
pattern = "evalregex:#{link_text_or_regexp.inspect}"
|
84
|
+
else
|
85
|
+
pattern = link_text_or_regexp.to_s
|
86
|
+
end
|
87
|
+
|
83
88
|
locator = "webratlink=#{pattern}"
|
84
89
|
selenium.wait_for_element locator, :timeout_in_seconds => Webrat.configuration.selenium_response_wait_time
|
85
90
|
selenium.click locator
|
@@ -164,7 +169,19 @@ module Webrat
|
|
164
169
|
sleep 0.25
|
165
170
|
end
|
166
171
|
|
167
|
-
|
172
|
+
error_message = "#{message} (after #{timeout} sec)"
|
173
|
+
|
174
|
+
if $browser
|
175
|
+
error_message += <<-EOS
|
176
|
+
|
177
|
+
|
178
|
+
HTML of the page was:
|
179
|
+
|
180
|
+
#{selenium.get_html_source}"
|
181
|
+
EOS
|
182
|
+
end
|
183
|
+
|
184
|
+
raise Webrat::TimeoutError.new(error_message)
|
168
185
|
true
|
169
186
|
end
|
170
187
|
|
data/lib/webrat.rb
CHANGED
File without changes
|
@@ -1,11 +1,9 @@
|
|
1
1
|
<h1 id='form_title' class='form title'>Webrat Buttons Form</h1>
|
2
2
|
|
3
3
|
<% form_tag "/buttons" do %>
|
4
|
-
<input type="button" id="input_button_id" value="input_button_value" />
|
5
4
|
<input type="submit" id="input_submit_id" value="input_submit_value" />
|
6
5
|
<input type="image" id="input_image_id" value="input_image_value" alt="input_image_alt" src="" />
|
7
6
|
|
8
|
-
<button type="button" id="button_button_id" value="button_button_value">button_button_text</button>
|
9
7
|
<button type="submit" id="button_submit_id" value="button_submit_value">button_submit_text</button>
|
10
8
|
<button type="image" id="button_image_id" value="button_image_value">button_image_text</button>
|
11
9
|
<% end %>
|
@@ -1,11 +1,9 @@
|
|
1
1
|
<h1 id='form_title' class='form title'>Webrat Buttons Form</h1>
|
2
2
|
|
3
3
|
<% form_tag submit_path do %>
|
4
|
-
<input type="button" id="input_button_id" value="input_button_value">
|
5
4
|
<input type="submit" id="input_submit_id" value="input_submit_value">
|
6
5
|
<input type="image" id="input_image_id" value="input_image_value" alt="input_image_alt" src="">
|
7
6
|
|
8
|
-
<button type="button" id="button_button_id" value="button_button_value">button_button_text</button>
|
9
7
|
<button type="submit" id="button_submit_id" value="button_submit_value">button_submit_text</button>
|
10
8
|
<button type="image" id="button_image_id" value="button_image_value">button_image_text</button>
|
11
9
|
<% end %>
|
@@ -12,6 +12,7 @@ ActionController::Routing::Routes.draw do |map|
|
|
12
12
|
webrat.before_redirect_form "/before_redirect_form", :action => "before_redirect_form"
|
13
13
|
webrat.redirect_to_show_params "/redirect_to_show_params", :action => "redirect_to_show_params"
|
14
14
|
webrat.show_params "/show_params", :action => "show_params"
|
15
|
+
webrat.within "/within", :action => "within"
|
15
16
|
|
16
17
|
webrat.root :action => "form"
|
17
18
|
end
|