selenium-client 1.2.10 → 1.2.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +66 -44
- data/examples/rspec/google_spec.rb +41 -0
- data/examples/script/google.rb +25 -0
- data/examples/testunit/google_test.rb +39 -0
- data/lib/selenium/client.rb +2 -0
- data/lib/selenium/client/base.rb +45 -11
- data/lib/selenium/client/driver.rb +1 -0
- data/lib/selenium/client/extensions.rb +80 -88
- data/lib/selenium/client/idiomatic.rb +71 -44
- data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
- data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
- data/lib/selenium/client/protocol.rb +2 -6
- data/lib/selenium/rake/remote_control_stop_task.rb +6 -2
- data/lib/tcp_socket_extension.rb +21 -12
- metadata +7 -3
- data/lib/selenium/client/generated_driver.rb +0 -1680
data/README.markdown
CHANGED
@@ -42,6 +42,8 @@ Features
|
|
42
42
|
* `click 'the_button_id', :wait_for => :no_text, :text => 'Disappearing Text'`
|
43
43
|
* `click 'the_button_id', :wait_for => :no_text, :element => 'notification_box', :text => 'Disappearing Text'`
|
44
44
|
* `click 'the_button_id', :wait_for => :effects`
|
45
|
+
* `click 'the_button_id', :wait_for => :value, :element => 'a_locator', :value => 'some value'`
|
46
|
+
* `click 'the_button_id', :wait_for => :no_value, :element => 'a_locator', :value => 'some value' # will wait for the field value of 'a_locator' to not be 'some value'`
|
45
47
|
* `click 'the_button_id', :wait_for => :condition, :javascript => "some arbitrary javascript expression"`
|
46
48
|
|
47
49
|
Check out the `click`, `go_back` and `wait_for` methods of the [Idiomatic Module](http://selenium-client.rubyforge.org/classes/Selenium/Client/Idiomatic.html)
|
@@ -76,19 +78,26 @@ Plain API
|
|
76
78
|
# Sample Ruby script using the Selenium client API
|
77
79
|
#
|
78
80
|
require "rubygems"
|
79
|
-
gem "selenium-client", ">=1.2.
|
81
|
+
gem "selenium-client", ">=1.2.11"
|
80
82
|
require "selenium/client"
|
81
|
-
|
83
|
+
|
82
84
|
begin
|
83
|
-
@browser = Selenium::Client::Driver.new
|
85
|
+
@browser = Selenium::Client::Driver.new \
|
86
|
+
:host => "localhost",
|
87
|
+
:port => 4444,
|
88
|
+
:browser => "*firefox",
|
89
|
+
:url => "http://www.google.com",
|
90
|
+
:timeout_in_second => 60
|
91
|
+
|
84
92
|
@browser.start_new_browser_session
|
85
93
|
@browser.open "/"
|
86
|
-
@browser.type "q", "Selenium"
|
94
|
+
@browser.type "q", "Selenium seleniumhq.org"
|
87
95
|
@browser.click "btnG", :wait_for => :page
|
88
|
-
puts @browser.text?("
|
96
|
+
puts @browser.text?("seleniumhq.org")
|
89
97
|
ensure
|
90
98
|
@browser.close_current_browser_session
|
91
99
|
end
|
100
|
+
|
92
101
|
|
93
102
|
Writing Tests
|
94
103
|
=============
|
@@ -102,70 +111,83 @@ Writing Tests
|
|
102
111
|
#
|
103
112
|
require "test/unit"
|
104
113
|
require "rubygems"
|
105
|
-
gem "selenium-client", ">=1.2.
|
114
|
+
gem "selenium-client", ">=1.2.11"
|
106
115
|
require "selenium/client"
|
107
|
-
|
116
|
+
|
108
117
|
class ExampleTest < Test::Unit::TestCase
|
109
118
|
attr_reader :browser
|
110
|
-
|
119
|
+
|
111
120
|
def setup
|
112
|
-
@browser = Selenium::Client::Driver.new
|
121
|
+
@browser = Selenium::Client::Driver.new \
|
122
|
+
:host => "localhost",
|
123
|
+
:port => 4444,
|
124
|
+
:browser => "*firefox",
|
125
|
+
:url => "http://www.google.com",
|
126
|
+
:timeout_in_second => 60
|
127
|
+
|
113
128
|
browser.start_new_browser_session
|
114
129
|
end
|
115
|
-
|
130
|
+
|
116
131
|
def teardown
|
117
132
|
browser.close_current_browser_session
|
118
133
|
end
|
119
|
-
|
134
|
+
|
120
135
|
def test_page_search
|
121
136
|
browser.open "/"
|
122
137
|
assert_equal "Google", browser.title
|
123
|
-
browser.type "q", "Selenium"
|
138
|
+
browser.type "q", "Selenium seleniumhq"
|
124
139
|
browser.click "btnG", :wait_for => :page
|
125
|
-
assert_equal "Selenium - Google Search", browser.title
|
126
|
-
assert_equal "Selenium", browser.field("q")
|
127
|
-
assert browser.text?("
|
140
|
+
assert_equal "Selenium seleniumhq - Google Search", browser.title
|
141
|
+
assert_equal "Selenium seleniumhq", browser.field("q")
|
142
|
+
assert browser.text?("seleniumhq.org")
|
128
143
|
assert browser.element?("link=Cached")
|
129
144
|
end
|
130
|
-
|
145
|
+
|
131
146
|
end
|
132
147
|
|
133
148
|
If BDD is more your style, here is how you can achieve the same thing using RSpec:
|
134
149
|
|
135
150
|
require 'rubygems'
|
136
|
-
gem "rspec", "=1.1.
|
137
|
-
gem "selenium-client", ">=1.2.
|
151
|
+
gem "rspec", "=1.1.12"
|
152
|
+
gem "selenium-client", ">=1.2.11"
|
138
153
|
require "selenium/client"
|
139
154
|
require "selenium/rspec/spec_helper"
|
140
|
-
|
155
|
+
|
141
156
|
describe "Google Search" do
|
142
157
|
attr_reader :selenium_driver
|
143
158
|
alias :page :selenium_driver
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
159
|
+
|
160
|
+
before(:all) do
|
161
|
+
@selenium_driver = Selenium::Client::Driver.new \
|
162
|
+
:host => "localhost",
|
163
|
+
:port => 4444,
|
164
|
+
:browser => "*firefox",
|
165
|
+
:url => "http://www.google.com",
|
166
|
+
:timeout_in_second => 60
|
167
|
+
end
|
168
|
+
|
169
|
+
before(:each) do
|
170
|
+
selenium_driver.start_new_browser_session
|
171
|
+
end
|
172
|
+
|
173
|
+
# The system capture need to happen BEFORE closing the Selenium session
|
174
|
+
append_after(:each) do
|
175
|
+
@selenium_driver.close_current_browser_session
|
176
|
+
end
|
177
|
+
|
178
|
+
it "can find Selenium" do
|
179
|
+
page.open "/"
|
180
|
+
page.title.should eql("Google")
|
181
|
+
page.type "q", "Selenium seleniumhq"
|
182
|
+
page.click "btnG", :wait_for => :page
|
183
|
+
page.value("q").should eql("Selenium seleniumhq")
|
184
|
+
page.text?("seleniumhq.org").should be_true
|
185
|
+
page.title.should eql("Selenium seleniumhq - Google Search")
|
186
|
+
page.text?("seleniumhq.org").should be_true
|
187
|
+
page.element?("link=Cached").should be_true
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
169
191
|
|
170
192
|
Start/Stop a Selenium Remote Control Server
|
171
193
|
===========================================
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem "rspec", "=1.1.12"
|
3
|
+
gem "selenium-client", ">=1.2.11"
|
4
|
+
require "selenium/client"
|
5
|
+
require "selenium/rspec/spec_helper"
|
6
|
+
|
7
|
+
describe "Google Search" do
|
8
|
+
attr_reader :selenium_driver
|
9
|
+
alias :page :selenium_driver
|
10
|
+
|
11
|
+
before(:all) do
|
12
|
+
@selenium_driver = Selenium::Client::Driver.new \
|
13
|
+
:host => "localhost",
|
14
|
+
:port => 4444,
|
15
|
+
:browser => "*firefox",
|
16
|
+
:url => "http://www.google.com",
|
17
|
+
:timeout_in_second => 60
|
18
|
+
end
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
selenium_driver.start_new_browser_session
|
22
|
+
end
|
23
|
+
|
24
|
+
# The system capture need to happen BEFORE closing the Selenium session
|
25
|
+
append_after(:each) do
|
26
|
+
@selenium_driver.close_current_browser_session
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can find Selenium" do
|
30
|
+
page.open "/"
|
31
|
+
page.title.should eql("Google")
|
32
|
+
page.type "q", "Selenium seleniumhq"
|
33
|
+
page.click "btnG", :wait_for => :page
|
34
|
+
page.value("q").should eql("Selenium seleniumhq")
|
35
|
+
page.text?("seleniumhq.org").should be_true
|
36
|
+
page.title.should eql("Selenium seleniumhq - Google Search")
|
37
|
+
page.text?("seleniumhq.org").should be_true
|
38
|
+
page.element?("link=Cached").should be_true
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Sample Ruby script using the Selenium client API
|
4
|
+
#
|
5
|
+
require "rubygems"
|
6
|
+
gem "selenium-client", ">=1.2.11"
|
7
|
+
require "selenium/client"
|
8
|
+
|
9
|
+
begin
|
10
|
+
@browser = Selenium::Client::Driver.new \
|
11
|
+
:host => "localhost",
|
12
|
+
:port => 4444,
|
13
|
+
:browser => "*firefox",
|
14
|
+
:url => "http://www.google.com",
|
15
|
+
:timeout_in_second => 60
|
16
|
+
|
17
|
+
@browser.start_new_browser_session
|
18
|
+
@browser.open "/"
|
19
|
+
@browser.type "q", "Selenium seleniumhq.org"
|
20
|
+
@browser.click "btnG", :wait_for => :page
|
21
|
+
puts @browser.text?("seleniumhq.org")
|
22
|
+
ensure
|
23
|
+
@browser.close_current_browser_session
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Sample Test:Unit based test case using the selenium-client API
|
4
|
+
#
|
5
|
+
require "test/unit"
|
6
|
+
require "rubygems"
|
7
|
+
gem "selenium-client", ">=1.2.11"
|
8
|
+
require "selenium/client"
|
9
|
+
|
10
|
+
class ExampleTest < Test::Unit::TestCase
|
11
|
+
attr_reader :browser
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@browser = Selenium::Client::Driver.new \
|
15
|
+
:host => "localhost",
|
16
|
+
:port => 4444,
|
17
|
+
:browser => "*firefox",
|
18
|
+
:url => "http://www.google.com",
|
19
|
+
:timeout_in_second => 60
|
20
|
+
|
21
|
+
browser.start_new_browser_session
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
browser.close_current_browser_session
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_page_search
|
29
|
+
browser.open "/"
|
30
|
+
assert_equal "Google", browser.title
|
31
|
+
browser.type "q", "Selenium seleniumhq"
|
32
|
+
browser.click "btnG", :wait_for => :page
|
33
|
+
assert_equal "Selenium seleniumhq - Google Search", browser.title
|
34
|
+
assert_equal "Selenium seleniumhq", browser.field("q")
|
35
|
+
assert browser.text?("seleniumhq.org")
|
36
|
+
assert browser.element?("link=Cached")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/selenium/client.rb
CHANGED
@@ -13,6 +13,8 @@ require File.expand_path(File.dirname(__FILE__) + '/command_error')
|
|
13
13
|
require File.expand_path(File.dirname(__FILE__) + '/protocol_error')
|
14
14
|
require File.expand_path(File.dirname(__FILE__) + '/client/protocol')
|
15
15
|
require File.expand_path(File.dirname(__FILE__) + '/client/generated_driver')
|
16
|
+
require File.expand_path(File.dirname(__FILE__) + '/client/javascript_frameworks/jquery')
|
17
|
+
require File.expand_path(File.dirname(__FILE__) + '/client/javascript_frameworks/prototype')
|
16
18
|
require File.expand_path(File.dirname(__FILE__) + '/client/extensions')
|
17
19
|
require File.expand_path(File.dirname(__FILE__) + '/client/idiomatic')
|
18
20
|
require File.expand_path(File.dirname(__FILE__) + '/client/base')
|
data/lib/selenium/client/base.rb
CHANGED
@@ -2,26 +2,60 @@ module Selenium
|
|
2
2
|
module Client
|
3
3
|
|
4
4
|
# Driver constructor and session management commands
|
5
|
-
#
|
6
|
-
# Original code by Aslak Hellesoy and Darren Hobbs
|
7
5
|
module Base
|
8
6
|
include Selenium::Client::Protocol
|
9
7
|
include Selenium::Client::GeneratedDriver
|
10
8
|
include Selenium::Client::Extensions
|
11
9
|
include Selenium::Client::Idiomatic
|
12
10
|
|
13
|
-
attr_reader :browser_string
|
11
|
+
attr_reader :host, :port, :browser_string, :browser_url,
|
12
|
+
:default_timeout_in_seconds, :default_javascript_framework
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
#
|
15
|
+
# Create a new client driver
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# Selenium::Client::Driver.new \
|
20
|
+
# :host => "localhost",
|
21
|
+
# :port => 4444,
|
22
|
+
# :browser => "*firefox",
|
23
|
+
# :timeout_in_seconds => 10,
|
24
|
+
# :url => "http://localhost:3000",
|
25
|
+
#
|
26
|
+
# You can also set the default javascript framework used for :wait_for
|
27
|
+
# AJAX and effects semantics (:prototype is the default value):
|
28
|
+
#
|
29
|
+
# Selenium::Client::Driver.new \
|
30
|
+
# :host => "localhost",
|
31
|
+
# :port => 4444,
|
32
|
+
# :browser => "*firefox",
|
33
|
+
# :timeout_in_seconds => 10,
|
34
|
+
# :url => "http://localhost:3000",
|
35
|
+
# :javascript_framework => :jquery
|
36
|
+
#
|
37
|
+
def initialize(*args)
|
38
|
+
if args[0].kind_of?(Hash)
|
39
|
+
options = args[0]
|
40
|
+
@host = options[:host]
|
41
|
+
@port = options[:port].to_i
|
42
|
+
@browser_string = options[:browser]
|
43
|
+
@browser_url = options[:url]
|
44
|
+
@default_timeout_in_seconds = (options[:timeout_in_seconds] || 300).to_i
|
45
|
+
@default_javascript_framework = options[:javascript_framework] || :prototype
|
46
|
+
else
|
47
|
+
@host = args[0]
|
48
|
+
@port = args[1].to_i
|
49
|
+
@browser_string = args[2]
|
50
|
+
@browser_url = args[3]
|
51
|
+
@default_timeout_in_seconds = (args[4] || 300).to_i
|
52
|
+
@default_javascript_framework = :prototype
|
53
|
+
end
|
54
|
+
|
21
55
|
@extension_js = ""
|
22
56
|
@session_id = nil
|
23
57
|
end
|
24
|
-
|
58
|
+
|
25
59
|
def session_started?
|
26
60
|
not @session_id.nil?
|
27
61
|
end
|
@@ -31,7 +65,7 @@ module Selenium
|
|
31
65
|
@session_id = result
|
32
66
|
# Consistent timeout on the remote control and driver side.
|
33
67
|
# Intuitive and this is what you want 90% of the time
|
34
|
-
self.remote_control_timeout_in_seconds = @
|
68
|
+
self.remote_control_timeout_in_seconds = @default_timeout_in_seconds
|
35
69
|
end
|
36
70
|
|
37
71
|
def close_current_browser_session
|
@@ -8,45 +8,30 @@ module Selenium
|
|
8
8
|
#
|
9
9
|
# See http://davidvollbracht.com/2008/6/4/30-days-of-tech-day-3-waitforajax for
|
10
10
|
# more background.
|
11
|
-
def wait_for_ajax(
|
12
|
-
|
11
|
+
def wait_for_ajax(options={})
|
12
|
+
framework = javascript_framework_for(options[:javascript_framework] || default_javascript_framework)
|
13
|
+
wait_for_condition window_script("#{framework.ajax_request_tracker} == 0"),
|
14
|
+
options[:timeout_in_seconds]
|
13
15
|
end
|
14
16
|
|
15
17
|
# Wait for all Prototype effects to be processed (the wait in happenning browser side).
|
16
18
|
#
|
17
19
|
# Credits to http://github.com/brynary/webrat/tree/master
|
18
|
-
def wait_for_effects(
|
19
|
-
wait_for_condition "
|
20
|
+
def wait_for_effects(options={})
|
21
|
+
wait_for_condition window_script("Effect.Queue.size() == 0"),
|
22
|
+
options[:timeout_in_seconds]
|
20
23
|
end
|
21
24
|
|
22
25
|
# Wait for an element to be present (the wait in happenning browser side).
|
23
|
-
def wait_for_element(locator,
|
24
|
-
|
25
|
-
|
26
|
-
try {
|
27
|
-
element = selenium.browserbot.findElement('#{locator}');
|
28
|
-
} catch(e) {
|
29
|
-
element = null;
|
30
|
-
}
|
31
|
-
element != null;
|
32
|
-
EOS
|
33
|
-
|
34
|
-
wait_for_condition script, timeout_in_seconds
|
26
|
+
def wait_for_element(locator, options={})
|
27
|
+
wait_for_condition find_element_script(locator, "element != null"),
|
28
|
+
options[:timeout_in_seconds]
|
35
29
|
end
|
36
30
|
|
37
31
|
# Wait for an element to NOT be present (the wait in happenning browser side).
|
38
|
-
def wait_for_no_element(locator,
|
39
|
-
|
40
|
-
|
41
|
-
try {
|
42
|
-
element = selenium.browserbot.findElement('#{locator}');
|
43
|
-
} catch(e) {
|
44
|
-
element = null;
|
45
|
-
}
|
46
|
-
element == null;
|
47
|
-
EOS
|
48
|
-
|
49
|
-
wait_for_condition script, timeout_in_seconds
|
32
|
+
def wait_for_no_element(locator, options={})
|
33
|
+
wait_for_condition find_element_script(locator, "element == null"),
|
34
|
+
options[:timeout_in_seconds]
|
50
35
|
end
|
51
36
|
|
52
37
|
# Wait for some text to be present (the wait in happenning browser side).
|
@@ -56,31 +41,13 @@ module Selenium
|
|
56
41
|
#
|
57
42
|
# If a non nil locator is provided, the text will be
|
58
43
|
# detected within the innerHTML of the element identified by the locator.
|
59
|
-
def wait_for_text(text,
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
try {
|
65
|
-
text = selenium.browserbot.getCurrentWindow().find('#{text}');
|
66
|
-
} catch(e) {
|
67
|
-
text = null;
|
68
|
-
}
|
69
|
-
text != null;
|
70
|
-
EOS
|
71
|
-
else
|
72
|
-
<<-EOS
|
73
|
-
var element;
|
74
|
-
try {
|
75
|
-
element = selenium.browserbot.getCurrentWindow().findElement('#{locator}');
|
76
|
-
} catch(e) {
|
77
|
-
element = null;
|
78
|
-
}
|
79
|
-
element != null && element.innerHTML == '#{text}'";
|
80
|
-
EOS
|
81
|
-
end
|
44
|
+
def wait_for_text(text, options={})
|
45
|
+
script = options[:element].nil? ?
|
46
|
+
find_text_script(text, "text != null && text != false") :
|
47
|
+
find_element_script(options[:element],
|
48
|
+
"element != null && element.innerHTML == '#{quote_escaped(text)}'")
|
82
49
|
|
83
|
-
wait_for_condition script, timeout_in_seconds
|
50
|
+
wait_for_condition script, options[:timeout_in_seconds]
|
84
51
|
end
|
85
52
|
|
86
53
|
# Wait for some text to NOT be present (the wait in happenning browser side).
|
@@ -90,46 +57,71 @@ module Selenium
|
|
90
57
|
#
|
91
58
|
# If a non nil locator is provided, the text will be
|
92
59
|
# detected within the innerHTML of the element identified by the locator.
|
93
|
-
def wait_for_no_text(original_text,
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
text = selenium.browserbot.getCurrentWindow().find('#{original_text}');
|
100
|
-
} catch(e) {
|
101
|
-
text = false;
|
102
|
-
}
|
103
|
-
text == false;
|
104
|
-
EOS
|
105
|
-
else
|
106
|
-
<<-EOS
|
107
|
-
var element;
|
108
|
-
|
109
|
-
try {
|
110
|
-
element = selenium.browserbot.findElement('#{locator}');
|
111
|
-
} catch(e) {
|
112
|
-
element = null;
|
113
|
-
}
|
114
|
-
alert(element);
|
115
|
-
element != null && element.innerHTML != '#{original_text}'";
|
116
|
-
EOS
|
117
|
-
end
|
118
|
-
wait_for_condition script, timeout_in_seconds
|
60
|
+
def wait_for_no_text(original_text, options={})
|
61
|
+
script = options[:element].nil? ?
|
62
|
+
find_text_script(original_text, "(text == false || text == null)") :
|
63
|
+
find_element_script(options[:element],
|
64
|
+
"(element == null || element.innerHTML != '#{quote_escaped(original_text)}')")
|
65
|
+
wait_for_condition script, options[:timeout_in_seconds]
|
119
66
|
end
|
120
67
|
|
121
68
|
# Wait for a field to get a specific value (the wait in happenning browser side).
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
element = null;
|
128
|
-
}
|
129
|
-
element != null && element.value == '#{expected_value}'";
|
69
|
+
def wait_for_field_value(locator, expected_value, options={})
|
70
|
+
script = find_element_script(locator,
|
71
|
+
"(element != null && element.value == '#{quote_escaped(expected_value)}')")
|
72
|
+
wait_for_condition script, options[:timeout_in_seconds]
|
73
|
+
end
|
130
74
|
|
131
|
-
|
132
|
-
|
75
|
+
def wait_for_no_field_value(locator, expected_value, options={})
|
76
|
+
script = find_element_script(locator,
|
77
|
+
"(element == null || element.value != '#{quote_escaped(expected_value)}')")
|
78
|
+
wait_for_condition script, options[:timeout_in_seconds]
|
79
|
+
end
|
80
|
+
|
81
|
+
def javascript_framework_for(framework_name)
|
82
|
+
case framework_name.to_sym
|
83
|
+
when :prototype
|
84
|
+
JavascriptFrameworks::Prototype
|
85
|
+
when :jquery
|
86
|
+
JavascriptFrameworks::JQuery
|
87
|
+
else
|
88
|
+
raise "Unsupported Javascript Framework: #{framework_name}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def find_element_script(locator, return_value)
|
93
|
+
script = <<-EOS
|
94
|
+
var element;
|
95
|
+
|
96
|
+
try {
|
97
|
+
element = selenium.browserbot.findElement('#{quote_escaped(locator)}');
|
98
|
+
} catch(e) {
|
99
|
+
element = null;
|
100
|
+
}
|
101
|
+
#{return_value};
|
102
|
+
EOS
|
103
|
+
end
|
104
|
+
|
105
|
+
def find_text_script(text, return_value)
|
106
|
+
script = <<-EOS
|
107
|
+
var text;
|
108
|
+
|
109
|
+
try {
|
110
|
+
text = selenium.browserbot.getCurrentWindow().find('#{quote_escaped(text)}');
|
111
|
+
} catch(e) {
|
112
|
+
text = null;
|
113
|
+
}
|
114
|
+
#{return_value};
|
115
|
+
EOS
|
116
|
+
end
|
117
|
+
|
118
|
+
def window_script(expression)
|
119
|
+
"selenium.browserbot.getCurrentWindow().#{expression};"
|
120
|
+
end
|
121
|
+
|
122
|
+
def quote_escaped(a_string)
|
123
|
+
a_string.gsub(/'/, %q<\\\'>)
|
124
|
+
end
|
133
125
|
|
134
126
|
end
|
135
127
|
end
|