selenium-client 1.2 → 1.2.1

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/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