selenium-client 1.2.16 → 1.2.17
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/README.markdown +12 -3
- data/examples/rspec/google_spec.rb +2 -2
- data/examples/script/google.rb +1 -1
- data/examples/testunit/google_test.rb +1 -1
- data/lib/selenium/client/extensions.rb +29 -16
- data/lib/selenium/client/idiomatic.rb +22 -6
- data/lib/selenium/client/javascript_expression_builder.rb +9 -1
- data/lib/selenium/rake/default_tasks.rb +16 -0
- data/lib/selenium/rake/remote_control_start_task.rb +4 -1
- data/lib/selenium/rspec/reporting/selenium_test_report_formatter.rb +1 -1
- data/lib/selenium/rspec/rspec_extensions.rb +1 -1
- metadata +4 -3
data/README.markdown
CHANGED
@@ -46,7 +46,9 @@ Features
|
|
46
46
|
* `click 'the_button_id', :wait_for => :no_text, :element => 'notification_box', :text => 'Disappearing Text'`
|
47
47
|
* `click 'the_button_id', :wait_for => :effects`
|
48
48
|
* `click 'the_button_id', :wait_for => :value, :element => 'a_locator', :value => 'some value'`
|
49
|
-
* `click 'the_button_id', :wait_for => :no_value, :element => 'a_locator', :value => 'some value'
|
49
|
+
* `click 'the_button_id', :wait_for => :no_value, :element => 'a_locator', :value => 'some value'`
|
50
|
+
* `click 'the_button_id', :wait_for => :visible, :element => 'a_locator'`
|
51
|
+
* `click 'the_button_id', :wait_for => :not_visible, :element => 'a_locator'`
|
50
52
|
* `click 'the_button_id', :wait_for => :condition, :javascript => "some arbitrary javascript expression"`
|
51
53
|
|
52
54
|
Check out the `click`, `go_back` and `wait_for` methods of the [Idiomatic Module](http://selenium-client.rubyforge.org/classes/Selenium/Client/Idiomatic.html)
|
@@ -151,7 +153,7 @@ Writing Tests
|
|
151
153
|
If BDD is more your style, here is how you can achieve the same thing using RSpec:
|
152
154
|
|
153
155
|
require 'rubygems'
|
154
|
-
gem "rspec", "=1.2.
|
156
|
+
gem "rspec", "=1.2.8"
|
155
157
|
gem "selenium-client", ">=1.2.16"
|
156
158
|
require "selenium/client"
|
157
159
|
require "selenium/rspec/spec_helper"
|
@@ -316,4 +318,11 @@ Contributors
|
|
316
318
|
* [Adam Greene](http://blog.sweetspot.dm) (`skippy`)
|
317
319
|
- Added the ability to redirect output to a log file, when
|
318
320
|
launching Selenium Remote Control with the Rake task
|
319
|
-
|
321
|
+
|
322
|
+
* [Eliot Sykes](http://blog.eliotsykes.com) (`eliotsykes`)
|
323
|
+
- wait_for_visibility [patch](http://github.com/eliotsykes/selenium-client/commit/4c7f3d01aa75a6b1917fbf71335b0069392ed546)
|
324
|
+
|
325
|
+
* [Frederik Fix](http://github.com/derfred)(`derfred`)
|
326
|
+
- Fix escaping bug when dealing with embedded regexes such as
|
327
|
+
"webratlink=evalregex:/Pastry Lovers \\(Organizer\\)/"
|
328
|
+
[patch](http://github.com/derfred/selenium-client/commit/4342cbb39d1a92b8db8f26ee0dc6c1a8f3287737)
|
data/examples/script/google.rb
CHANGED
@@ -4,7 +4,7 @@ module Selenium
|
|
4
4
|
# Convenience methods not explicitely part of the protocol
|
5
5
|
module Extensions
|
6
6
|
|
7
|
-
# These for all Ajax request to finish (Only works if you are using prototype, the wait in
|
7
|
+
# These for all Ajax request to finish (Only works if you are using prototype, the wait happens in the browser)
|
8
8
|
#
|
9
9
|
# See http://davidvollbracht.com/2008/6/4/30-days-of-tech-day-3-waitforajax for
|
10
10
|
# more background.
|
@@ -14,7 +14,7 @@ module Selenium
|
|
14
14
|
options[:timeout_in_seconds]
|
15
15
|
end
|
16
16
|
|
17
|
-
# Wait for all Prototype effects to be processed (the wait in
|
17
|
+
# Wait for all Prototype effects to be processed (the wait happens in the browser).
|
18
18
|
#
|
19
19
|
# Credits to http://github.com/brynary/webrat/tree/master
|
20
20
|
def wait_for_effects(options={})
|
@@ -23,19 +23,19 @@ module Selenium
|
|
23
23
|
options[:timeout_in_seconds]
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
# Wait for an element to be present (the wait happens in the browser).
|
27
|
+
def wait_for_element(locator, options={})
|
28
|
+
builder = JavascriptExpressionBuilder.new
|
29
|
+
builder.find_element(locator).append("element != null;")
|
30
|
+
wait_for_condition builder.script, options[:timeout_in_seconds]
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
# Wait for an element to NOT be present (the wait happens in the browser).
|
34
|
+
def wait_for_no_element(locator, options={})
|
35
|
+
builder = JavascriptExpressionBuilder.new
|
36
|
+
builder.find_element(locator).append("element == null;")
|
37
|
+
wait_for_condition builder.script, options[:timeout_in_seconds]
|
38
|
+
end
|
39
39
|
|
40
40
|
# Wait for some text to be present (the wait is happening browser side).
|
41
41
|
#
|
@@ -73,7 +73,7 @@ module Selenium
|
|
73
73
|
wait_for_condition builder.script, options[:timeout_in_seconds]
|
74
74
|
end
|
75
75
|
|
76
|
-
# Wait for some text to NOT be present (the wait in
|
76
|
+
# Wait for some text to NOT be present (the wait happens in the browser).
|
77
77
|
#
|
78
78
|
# See wait_for_text for usage details.
|
79
79
|
def wait_for_no_text(pattern, options={})
|
@@ -82,19 +82,32 @@ module Selenium
|
|
82
82
|
wait_for_condition builder.script, options[:timeout_in_seconds]
|
83
83
|
end
|
84
84
|
|
85
|
-
|
85
|
+
# Wait for a field to get a specific value (the wait happens in the browser).
|
86
86
|
def wait_for_field_value(locator, expected_value, options={})
|
87
87
|
builder = JavascriptExpressionBuilder.new
|
88
88
|
builder.find_element(locator).element_value_is(expected_value)
|
89
89
|
wait_for_condition builder.script, options[:timeout_in_seconds]
|
90
90
|
end
|
91
91
|
|
92
|
+
# Wait for a field to not have a specific value (the wait happens in the browser).
|
92
93
|
def wait_for_no_field_value(locator, expected_value, options={})
|
93
94
|
builder = JavascriptExpressionBuilder.new
|
94
95
|
builder.find_element(locator).element_value_is_not(expected_value)
|
95
96
|
wait_for_condition builder.script, options[:timeout_in_seconds]
|
96
97
|
end
|
97
98
|
|
99
|
+
# Wait for something to be visible (the wait happens in the browser).
|
100
|
+
def wait_for_visible(locator, options={})
|
101
|
+
builder = JavascriptExpressionBuilder.new
|
102
|
+
wait_for_condition builder.visible(locator).script, options[:timeout_in_seconds]
|
103
|
+
end
|
104
|
+
|
105
|
+
# Wait for something to not be visible (the wait happens in the browser).
|
106
|
+
def wait_for_not_visible(locator, options={})
|
107
|
+
builder = JavascriptExpressionBuilder.new
|
108
|
+
wait_for_condition builder.not_visible(locator).script, options[:timeout_in_seconds]
|
109
|
+
end
|
110
|
+
|
98
111
|
def active_javascript_framework(options)
|
99
112
|
options[:javascript_framework] || default_javascript_framework
|
100
113
|
end
|
@@ -42,8 +42,8 @@ module Selenium
|
|
42
42
|
# * 'timeout_in_seconds' is a timeout in seconds, after which this
|
43
43
|
# command will return with an error
|
44
44
|
def wait_for_page(timeout_in_seconds=nil)
|
45
|
-
|
46
|
-
|
45
|
+
remote_control_command "waitForPageToLoad",
|
46
|
+
[actual_timeout_in_milliseconds(timeout_in_seconds),]
|
47
47
|
end
|
48
48
|
alias_method :wait_for_page_to_load, :wait_for_page
|
49
49
|
|
@@ -52,8 +52,8 @@ module Selenium
|
|
52
52
|
# window_id is the JavaScript window "name" of the window that will appear (not the text of the title bar)
|
53
53
|
# timeout_in_seconds is a timeout in seconds, after which the action will return with an error
|
54
54
|
def wait_for_popup(window_id, timeout_in_seconds=nil)
|
55
|
-
|
56
|
-
|
55
|
+
remote_control_command "waitForPopUp",
|
56
|
+
[window_id, actual_timeout_in_milliseconds(timeout_in_seconds) ,]
|
57
57
|
end
|
58
58
|
|
59
59
|
# Flexible wait semantics. ait is happening browser side. Useful for testing AJAX application.
|
@@ -74,6 +74,8 @@ module Selenium
|
|
74
74
|
# * wait :wait_for => :no_text, :element => 'a_locator', :text => 'some text' # will wait for the content of 'a_locator' to not be 'some text'
|
75
75
|
# * wait :wait_for => :value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to be 'some value'
|
76
76
|
# * wait :wait_for => :no_value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to not be 'some value'
|
77
|
+
# * wait :wait_for => :visible, :element => 'a_locator' # will wait for element to be visible
|
78
|
+
# * wait :wait_for => :not_visible, :element => 'a_locator' # will wait for element to not be visible
|
77
79
|
# * wait :wait_for => :condition, :javascript => 'some expression' # will wait for the javascript expression to be true
|
78
80
|
#
|
79
81
|
# Using options you can also define an explicit timeout (:timeout_in_seconds key). Otherwise the default driver timeout
|
@@ -100,6 +102,10 @@ module Selenium
|
|
100
102
|
wait_for_field_value options[:element], options[:value], options
|
101
103
|
elsif options[:wait_for] == :no_value
|
102
104
|
wait_for_no_field_value options[:element], options[:value], options
|
105
|
+
elsif options[:wait_for] == :visible
|
106
|
+
wait_for_visible options[:element], options
|
107
|
+
elsif options[:wait_for] == :not_visible
|
108
|
+
wait_for_not_visible options[:element], options
|
103
109
|
elsif options[:wait_for] == :condition
|
104
110
|
wait_for_condition options[:javascript], options[:timeout_in_seconds]
|
105
111
|
end
|
@@ -133,6 +139,8 @@ module Selenium
|
|
133
139
|
# * click "a_locator", :wait_for => :no_text, :element => 'a_locator', :text => 'some text' # will wait for the content of 'a_locator' to not be 'some text'
|
134
140
|
# * click "a_locator", :wait_for => :value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to be 'some value'
|
135
141
|
# * click "a_locator", :wait_for => :no_value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to not be 'some value'
|
142
|
+
# * click "a_locator", :wait_for => :visible, :element => 'a_locator' # will wait for element to be visible
|
143
|
+
# * click "a_locator", :wait_for => :not_visible, :element => 'a_locator' # will wait for element to not be visible
|
136
144
|
# * click "a_locator", :wait_for => :condition, :javascript => 'some expression' # will wait for the javascript expression to be true
|
137
145
|
#
|
138
146
|
# Using options you can also define an explicit timeout (:timeout_in_seconds key). Otherwise the default driver timeout
|
@@ -284,7 +292,7 @@ module Selenium
|
|
284
292
|
#
|
285
293
|
# Actions that require waiting include "open" and the "waitFor*" actions.
|
286
294
|
def remote_control_timeout_in_seconds=(timeout_in_seconds)
|
287
|
-
|
295
|
+
remote_control_command "setTimeout", [actual_timeout_in_milliseconds(timeout_in_seconds),]
|
288
296
|
end
|
289
297
|
|
290
298
|
# Returns the text from a cell of a table. The cellAddress syntax
|
@@ -308,7 +316,8 @@ module Selenium
|
|
308
316
|
# * 'script' is the JavaScript snippet to run
|
309
317
|
# * 'timeout_in_seconds' is a timeout in seconds, after which this command will return with an error
|
310
318
|
def wait_for_condition(script, timeout_in_seconds = nil)
|
311
|
-
remote_control_command "waitForCondition",
|
319
|
+
remote_control_command "waitForCondition",
|
320
|
+
[script, actual_timeout_in_milliseconds(timeout_in_seconds),]
|
312
321
|
end
|
313
322
|
|
314
323
|
# Simulates the user clicking the "back" button on their browser.
|
@@ -331,6 +340,8 @@ module Selenium
|
|
331
340
|
# * go_back :wait_for => :no_text, :element => 'a_locator', :text => 'some text' # will wait for the content of 'a_locator' to not be 'some text'
|
332
341
|
# * go_back :wait_for => :condition, :javascript => 'some expression' # will wait for the javascript expression to be true
|
333
342
|
# * go_back :wait_for => :value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to be 'some value'
|
343
|
+
# * go_back :wait_for => :visible, :element => 'a_locator' # will wait for element to be visible
|
344
|
+
# * go_back :wait_for => :not_visible, :element => 'a_locator' # will wait for element to not be visible
|
334
345
|
# * go_back :wait_for => :no_value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to not be 'some value'
|
335
346
|
#
|
336
347
|
# Using options you can also define an explicit timeout (:timeout_in_seconds key). Otherwise the default driver timeout
|
@@ -466,6 +477,11 @@ module Selenium
|
|
466
477
|
remote_control_command "setSpeed", [delay_in_milliseconds]
|
467
478
|
end
|
468
479
|
|
480
|
+
def actual_timeout_in_milliseconds(timeout_in_seconds)
|
481
|
+
actual_timeout = (timeout_in_seconds ||
|
482
|
+
default_timeout_in_seconds).to_i
|
483
|
+
actual_timeout * 1000
|
484
|
+
end
|
469
485
|
end
|
470
486
|
|
471
487
|
end
|
@@ -22,6 +22,14 @@ module Selenium
|
|
22
22
|
append window_script("Effect.Queue.size() == 0")
|
23
23
|
end
|
24
24
|
|
25
|
+
def visible(locator)
|
26
|
+
append "selenium.isVisible('#{quote_escaped(locator)}')"
|
27
|
+
end
|
28
|
+
|
29
|
+
def not_visible(locator)
|
30
|
+
append "!selenium.isVisible('#{quote_escaped(locator)}')"
|
31
|
+
end
|
32
|
+
|
25
33
|
def find_element(locator)
|
26
34
|
append <<-EOS
|
27
35
|
var element;
|
@@ -101,7 +109,7 @@ module Selenium
|
|
101
109
|
end
|
102
110
|
|
103
111
|
def quote_escaped(a_string)
|
104
|
-
a_string.gsub(/'/, %q<\\\'>)
|
112
|
+
a_string.gsub(/\\/, "\\\\\\").gsub(/'/, %q<\\\'>)
|
105
113
|
end
|
106
114
|
end
|
107
115
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'selenium/rake/tasks'
|
2
|
+
|
3
|
+
Selenium::Rake::RemoteControlStartTask.new do |rc|
|
4
|
+
rc.timeout_in_seconds = 3 * 60
|
5
|
+
rc.background = true
|
6
|
+
rc.wait_until_up_and_running = true
|
7
|
+
rc.additional_args << "-singleWindow"
|
8
|
+
end
|
9
|
+
|
10
|
+
Selenium::Rake::RemoteControlStopTask.new
|
11
|
+
|
12
|
+
desc "Restart Selenium Remote Control"
|
13
|
+
task :'selenium:rc:restart' do
|
14
|
+
Rake::Task[:'selenium:rc:stop'].execute [] rescue nil
|
15
|
+
Rake::Task[:'selenium:rc:start'].execute []
|
16
|
+
end
|
@@ -28,11 +28,13 @@ module Selenium
|
|
28
28
|
:log_to
|
29
29
|
attr_reader :jar_file
|
30
30
|
|
31
|
+
JAR_FILE_PATTERN = "vendor/selenium-remote-control/selenium-server-*.jar"
|
32
|
+
|
31
33
|
def initialize(name = :'selenium:rc:start')
|
32
34
|
@name = name
|
33
35
|
@port = 4444
|
34
36
|
@timeout_in_seconds = 5
|
35
|
-
project_specific_jar = Dir[
|
37
|
+
project_specific_jar = Dir[JAR_FILE_PATTERN].first
|
36
38
|
@jar_file = project_specific_jar
|
37
39
|
@additional_args = []
|
38
40
|
@background = false
|
@@ -49,6 +51,7 @@ module Selenium
|
|
49
51
|
desc "Launch Selenium Remote Control"
|
50
52
|
task @name do
|
51
53
|
puts "Starting Selenium Remote Control at 0.0.0.0:#{@port}..."
|
54
|
+
raise "Could not find jar file '#{@jar_file}'. Expected it under #{JAR_FILE_PATTERN}" unless @jar_file && File.exists?(@jar_file)
|
52
55
|
remote_control = Selenium::RemoteControl::RemoteControl.new("0.0.0.0", @port, :timeout => @timeout_in_seconds)
|
53
56
|
remote_control.jar_file = @jar_file
|
54
57
|
remote_control.additional_args = @additional_args
|
@@ -7,7 +7,7 @@ require "digest/md5"
|
|
7
7
|
require "base64"
|
8
8
|
require 'tmpdir'
|
9
9
|
require "rubygems"
|
10
|
-
gem "rspec", "1.2.
|
10
|
+
gem "rspec", "1.2.8"
|
11
11
|
require "spec"
|
12
12
|
require 'spec/runner/formatter/html_formatter'
|
13
13
|
require File.expand_path(File.dirname(__FILE__) + "/file_path_strategy")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- OpenQA
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-28 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/selenium/client.rb
|
37
37
|
- lib/selenium/command_error.rb
|
38
38
|
- lib/selenium/protocol_error.rb
|
39
|
+
- lib/selenium/rake/default_tasks.rb
|
39
40
|
- lib/selenium/rake/remote_control_start_task.rb
|
40
41
|
- lib/selenium/rake/remote_control_stop_task.rb
|
41
42
|
- lib/selenium/rake/tasks.rb
|
@@ -80,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
81
|
requirements: []
|
81
82
|
|
82
83
|
rubyforge_project: selenium-client
|
83
|
-
rubygems_version: 1.3.
|
84
|
+
rubygems_version: 1.3.5
|
84
85
|
signing_key:
|
85
86
|
specification_version: 3
|
86
87
|
summary: Official Ruby Client for Selenium RC.
|