selenium-client 1.2 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/selenium.rb CHANGED
@@ -27,8 +27,9 @@ require File.expand_path(File.dirname(__FILE__) + '/tcp_socket_extension')
27
27
  require File.expand_path(File.dirname(__FILE__) + '/nautilus/shell')
28
28
  require File.expand_path(File.dirname(__FILE__) + '/selenium/command_error')
29
29
  require File.expand_path(File.dirname(__FILE__) + '/selenium/protocol_error')
30
- require File.expand_path(File.dirname(__FILE__) + '/selenium/client/selenese_client')
30
+ require File.expand_path(File.dirname(__FILE__) + '/selenium/client/protocol')
31
31
  require File.expand_path(File.dirname(__FILE__) + '/selenium/client/generated_driver')
32
+ require File.expand_path(File.dirname(__FILE__) + '/selenium/client/extensions')
32
33
  require File.expand_path(File.dirname(__FILE__) + '/selenium/client/idiomatic')
33
34
  require File.expand_path(File.dirname(__FILE__) + '/selenium/client/base')
34
35
  require File.expand_path(File.dirname(__FILE__) + '/selenium/client/driver')
@@ -1,27 +1,14 @@
1
- # Copyright 2006 ThoughtWorks, Inc
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #
15
- #
16
- #
17
- # Original code by Aslak Hellesoy and Darren Hobbs
18
- #
19
1
  module Selenium
20
2
  module Client
21
3
 
4
+ # Driver constructor and session management commands
5
+ #
6
+ # Original code by Aslak Hellesoy and Darren Hobbs
22
7
  module Base
23
- include Selenium::Client::SeleneseClient
8
+ include Selenium::Client::Protocol
24
9
  include Selenium::Client::GeneratedDriver
10
+ include Selenium::Client::Extensions
11
+ include Selenium::Client::Idiomatic
25
12
 
26
13
  def initialize(server_host, server_port, browser_string, browser_url, timeout_in_seconds=300)
27
14
  @server_host = server_host
@@ -33,39 +20,42 @@ module Selenium
33
20
  @session_id = nil
34
21
  end
35
22
 
36
- def set_extension_js(extension_js)
37
- @extension_js = extension_js
38
- end
39
-
40
- def start()
41
- result = get_string("getNewBrowserSession", [@browser_string, @browser_url, @extension_js])
42
- @session_id = result
43
- end
44
-
45
- def stop()
46
- do_command("testComplete", [])
47
- @session_id = nil
23
+ def session_started?
24
+ not @session_id.nil?
48
25
  end
49
26
 
50
27
  def start_new_browser_session
51
- start
28
+ result = string_command "getNewBrowserSession", [@browser_string, @browser_url, @extension_js]
29
+ @session_id = result
30
+ # Consistent timeout on the remote control and driver side.
31
+ # Intuitive and this is what you want 90% of the time
32
+ self.remote_control_timeout_in_seconds = @timeout
52
33
  end
53
34
 
54
35
  def close_current_browser_session
55
- stop
36
+ remote_control_command "testComplete"
37
+ @session_id = nil
56
38
  end
57
39
 
58
- def session_started?
59
- not @session_id.nil?
40
+ def start
41
+ start_new_browser_session
60
42
  end
61
43
 
62
- def default_timeout_in_seconds
63
- @timeout
44
+ def stop
45
+ close_current_browser_session
64
46
  end
65
-
47
+
66
48
  def chrome_backend?
67
49
  ["*chrome", "*firefox", "*firefox2", "*firefox3"].include?(@browser_string)
68
50
  end
51
+
52
+ def javascript_extension=(new_javascript_extension)
53
+ @extension_js = new_javascript_extension
54
+ end
55
+
56
+ def set_extension_js(new_javascript_extension)
57
+ javascript_extension = new_javascript_extension
58
+ end
69
59
 
70
60
  end
71
61
 
@@ -1,9 +1,9 @@
1
1
  module Selenium
2
2
  module Client
3
-
3
+
4
+ # Client driver providing the complete API to drive a Selenium Remote Control
4
5
  class Driver
5
6
  include Selenium::Client::Base
6
- include Selenium::Client::Idiomatic
7
7
  end
8
8
 
9
9
  end
@@ -0,0 +1,75 @@
1
+ module Selenium
2
+ module Client
3
+
4
+ # Convenience methods not explicitely part of the protocol
5
+ module Extensions
6
+
7
+ # These for all Ajax request to finish (Only works if you are using prototype)
8
+ #
9
+ # See http://davidvollbracht.com/2008/6/4/30-days-of-tech-day-3-waitforajax for
10
+ # more background.
11
+ def wait_for_ajax(timeout=nil)
12
+ selenium.wait_for_condition "selenium.browserbot.getCurrentWindow().Ajax.activeRequestCount == 0",
13
+ timeout || default_timeout_in_seconds
14
+ end
15
+
16
+ # Wait for all Prototype effects to be processed
17
+ #
18
+ # Credits to http://github.com/brynary/webrat/tree/master
19
+ def wait_for_effects(timeout=nil)
20
+ selenium.wait_for_condition "window.Effect.Queue.size() == 0", timeout || default_timeout_in_seconds
21
+ end
22
+
23
+ def wait_for_element(field_name, time=60000)
24
+ script = <<-EOS
25
+ var element;
26
+ try {
27
+ element = selenium.browserbot.findElement('#{field_name}');
28
+ } catch(e) {
29
+ element = null;
30
+ }
31
+ element != null
32
+ EOS
33
+
34
+ wait_for_condition script, time
35
+ end
36
+
37
+ def wait_for_text(field_name, text, time=60000)
38
+ script = "var element;
39
+ try {
40
+ element = selenium.browserbot.findElement('#{field_name}');
41
+ } catch(e) {
42
+ element = null;
43
+ }
44
+ element != null && element.innerHTML == '#{text}'"
45
+
46
+ wait_for_condition script, time
47
+ end
48
+
49
+ def wait_for_text_change(field_name, original_text, time=60000)
50
+ script = "var element;
51
+ try {
52
+ element = selenium.browserbot.findElement('#{field_name}');
53
+ } catch(e) {
54
+ element = null;
55
+ }
56
+ element != null && element.innerHTML != '#{original_text}'"
57
+
58
+ wait_for_condition script, time
59
+ end
60
+
61
+ def wait_for_field_value(field_name, value, time=60000)
62
+ script = "var element;
63
+ try {
64
+ element = selenium.browserbot.findElement('#{field_name}');
65
+ } catch(e) {
66
+ element = null;
67
+ }
68
+ element != null && element.value == '#{value}'"
69
+
70
+ wait_for_condition script, time
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -1,11 +1,9 @@
1
- #
2
- # Provide a more idiomatic API than the generated Ruby driver.
3
- #
4
- # Work on progress...
5
- #
6
1
  module Selenium
7
2
  module Client
8
3
 
4
+ # Provide a more idiomatic API than the generated Ruby driver.
5
+ #
6
+ # Work in progress...
9
7
  module Idiomatic
10
8
 
11
9
  # Return the text content of an HTML element (rendered text shown to
@@ -18,17 +16,17 @@ module Selenium
18
16
  #
19
17
  # 'locator' is an Selenium element locator
20
18
  def text_content(locator)
21
- get_string "getText", [locator,]
19
+ string_command"getText", [locator,]
22
20
  end
23
21
 
24
22
  # Return the title of the current HTML page.
25
23
  def title
26
- get_string "getTitle"
24
+ string_command"getTitle"
27
25
  end
28
26
 
29
27
  # Returns the absolute URL of the current page.
30
28
  def location
31
- get_string "getLocation"
29
+ string_command"getLocation"
32
30
  end
33
31
 
34
32
  # Waits for a new page to load.
@@ -43,12 +41,12 @@ module Selenium
43
41
  # command will return with an error
44
42
  def wait_for_page(timeout_in_seconds=nil)
45
43
  actual_timeout = timeout_in_seconds || default_timeout_in_seconds
46
- do_command "waitForPageToLoad", [actual_timeout * 1000,]
44
+ remote_control_command "waitForPageToLoad", [actual_timeout * 1000,]
47
45
  end
48
46
 
49
47
  # Gets the entire text of the page.
50
48
  def body_text
51
- get_string "getBodyText"
49
+ string_command"getBodyText"
52
50
  end
53
51
 
54
52
  # Clicks on a link, button, checkbox or radio button. If the click action
@@ -57,9 +55,13 @@ module Selenium
57
55
  #
58
56
  # 'locator' is an element locator
59
57
  def click(locator, options={})
60
- do_command("click", [locator,])
58
+ remote_control_command("click", [locator,])
61
59
  if options[:wait_for] == :page
62
60
  wait_for_page options[:timeout_in_seconds]
61
+ elsif options[:wait_for] == :ajax
62
+ wait_for_ajax options[:timeout_in_seconds]
63
+ elsif options[:wait_for] == :effects
64
+ wait_for_effects options[:timeout_in_seconds]
63
65
  end
64
66
  end
65
67
 
@@ -67,14 +69,14 @@ module Selenium
67
69
  #
68
70
  # 'pattern' is a pattern to match with the text of the page
69
71
  def text_present?(pattern)
70
- get_boolean "isTextPresent", [pattern,]
72
+ boolean_command "isTextPresent", [pattern,]
71
73
  end
72
74
 
73
75
  # Verifies that the specified element is somewhere on the page.
74
76
  #
75
77
  # 'locator' is an element locator
76
78
  def element_present?(locator)
77
- get_boolean "isElementPresent", [locator,]
79
+ boolean_command "isElementPresent", [locator,]
78
80
  end
79
81
 
80
82
  # Gets the (whitespace-trimmed) value of an input field
@@ -83,13 +85,26 @@ module Selenium
83
85
  # depending on whether the element is checked or not.
84
86
  #
85
87
  # 'locator' is an element locator
88
+ def field(locator)
89
+ string_command "getValue", [locator,]
90
+ end
91
+
92
+ # Alias for +field+
86
93
  def value(locator)
87
- get_string "getValue", [locator,]
94
+ field locator
95
+ end
96
+
97
+ # Returns whether a toggle-button (checkbox/radio) is checked.
98
+ # Fails if the specified element doesn't exist or isn't a toggle-button.
99
+ #
100
+ # 'locator' is an element locator pointing to a checkbox or radio button
101
+ def checked?(locator)
102
+ boolean_command "isChecked", [locator,]
88
103
  end
89
104
 
90
105
  # Whether an alert occurred
91
106
  def alert?
92
- get_boolean "isAlertPresent"
107
+ boolean_command "isAlertPresent"
93
108
  end
94
109
 
95
110
  # Retrieves the message of a JavaScript alert generated during the previous action,
@@ -105,12 +120,12 @@ module Selenium
105
120
  # generated and Selenium will hang until someone manually clicks OK.
106
121
  #
107
122
  def alert
108
- get_string "getAlert"
123
+ string_command"getAlert"
109
124
  end
110
125
 
111
126
  # Whether a confirmation has been auto-acknoledged (i.e. confirm() been called)
112
127
  def confirmation?
113
- get_boolean "isConfirmationPresent"
128
+ boolean_command "isConfirmationPresent"
114
129
  end
115
130
 
116
131
  # Retrieves the message of a JavaScript confirmation dialog generated during
@@ -131,12 +146,12 @@ module Selenium
131
146
  # dialog WILL be generated and Selenium will hang until you manually click
132
147
  # OK.
133
148
  def confirmation
134
- get_string "getConfirmation"
149
+ string_command"getConfirmation"
135
150
  end
136
151
 
137
152
  # Whether a prompt occurred
138
153
  def prompt?
139
- get_boolean "isPromptPresent"
154
+ boolean_command "isPromptPresent"
140
155
  end
141
156
 
142
157
  # Retrieves the message of a JavaScript question prompt dialog generated during
@@ -153,7 +168,7 @@ module Selenium
153
168
  # page's onload() event handler. In this case a visible dialog WILL be
154
169
  # generated and Selenium will hang until someone manually clicks OK.
155
170
  def prompt
156
- get_string "getPrompt"
171
+ string_command"getPrompt"
157
172
  end
158
173
 
159
174
  # Returns the result of evaluating the specified JavaScript snippet whithin the browser.
@@ -168,9 +183,27 @@ module Selenium
168
183
  #
169
184
  # 'script' is the JavaScript snippet to run
170
185
  def js_eval(script)
171
- get_string "getEval", [script,]
186
+ string_command"getEval", [script,]
172
187
  end
173
188
 
189
+ # Set the Remote Control timeout (as opposed to the client side driver timeout).
190
+ # This timout specifies the amount of time that Selenium Core will wait for actions to complete.
191
+ #
192
+ # The default timeout is 30 seconds.
193
+ # 'timeout' is a timeout in seconds, after which the action will return with an error
194
+ #
195
+ # Actions that require waiting include "open" and the "waitFor*" actions.
196
+ def remote_control_timeout_in_seconds=(timeout_in_seconds)
197
+ remote_control_command "setTimeout", [timeout_in_seconds * 1000,]
198
+ end
199
+
200
+ # Returns the text from a cell of a table. The cellAddress syntax
201
+ # tableLocator.row.column, where row and column start at 0.
202
+ #
203
+ # 'tableCellAddress' is a cell address, e.g. "foo.1.4"
204
+ def table_cell_text(tableCellAddress)
205
+ string_command "getTable", [tableCellAddress,]
206
+ end
174
207
 
175
208
  # set speed
176
209
  end
@@ -3,10 +3,11 @@ module Selenium
3
3
 
4
4
  HTTP_HEADERS = { 'Content-Type' => 'application/x-www-form-urlencoded; charset=utf-8' }
5
5
 
6
- module SeleneseClient
6
+ # Module in charge of handling Selenium over-the-wire HTTP protocol
7
+ module Protocol
7
8
  attr_reader :session_id
8
9
 
9
- def do_command(verb, args)
10
+ def remote_control_command(verb, args=[])
10
11
  timeout(default_timeout_in_seconds) do
11
12
  status, response = http_post(http_request_for(verb, args))
12
13
  raise SeleniumCommandError, response unless status == "OK"
@@ -14,12 +15,12 @@ module Selenium
14
15
  end
15
16
  end
16
17
 
17
- def get_string(verb, args=[])
18
- do_command(verb, args)
18
+ def string_command(verb, args=[])
19
+ remote_control_command(verb, args)
19
20
  end
20
21
 
21
- def get_string_array(verb, args)
22
- csv = get_string(verb, args)
22
+ def string_array_command(verb, args)
23
+ csv = string_command(verb, args)
23
24
  token = ""
24
25
  tokens = []
25
26
  escape = false
@@ -43,24 +44,26 @@ module Selenium
43
44
  return tokens
44
45
  end
45
46
 
46
- def get_number(verb, args)
47
- # Is there something I need to do here?
48
- return get_string(verb, args)
47
+ def number_command(verb, args)
48
+ string_command verb, args
49
49
  end
50
50
 
51
- def get_number_array(verb, args)
52
- # Is there something I need to do here?
53
- return get_string_array(verb, args)
51
+ def number_array_command(verb, args)
52
+ string_array_command verb, args
54
53
  end
55
54
 
56
- def get_boolean(verb, args=[])
57
- parse_boolean_value get_string(verb, args)
55
+ def boolean_command(verb, args=[])
56
+ parse_boolean_value string_command(verb, args)
58
57
  end
59
58
 
60
- def get_boolean_array(verb, args)
61
- get_string_array(verb, args).collect {|value| parse_boolean_value(value)}
59
+ def boolean_array_command(verb, args)
60
+ string_array_command(verb, args).collect {|value| parse_boolean_value(value)}
62
61
  end
63
-
62
+
63
+ def default_timeout_in_seconds
64
+ @timeout
65
+ end
66
+
64
67
  protected
65
68
 
66
69
  def parse_boolean_value(value)
@@ -88,7 +91,7 @@ module Selenium
88
91
  # puts "RESULT: #{response.inspect}\n"
89
92
  [ response.body[0..1], response.body[3..-1] ]
90
93
  end
91
-
94
+
92
95
  end
93
96
 
94
97
  end
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.1
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: 2008-09-28 00:00:00 -07:00
12
+ date: 2008-09-29 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -25,8 +25,9 @@ files:
25
25
  - lib/nautilus/shell.rb
26
26
  - lib/selenium/client/base.rb
27
27
  - lib/selenium/client/driver.rb
28
+ - lib/selenium/client/extensions.rb
28
29
  - lib/selenium/client/idiomatic.rb
29
- - lib/selenium/client/selenese_client.rb
30
+ - lib/selenium/client/protocol.rb
30
31
  - lib/selenium/client/selenium_helper.rb
31
32
  - lib/selenium/command_error.rb
32
33
  - lib/selenium/protocol_error.rb