kbaum-webrat 0.5.1 → 0.6.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|