selenium-webdriver 0.1.2 → 0.1.3.dev
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/CHANGES +18 -1
- data/lib/selenium/client/legacy_driver.rb +9 -0
- data/lib/selenium/webdriver/android/bridge.rb +1 -1
- data/lib/selenium/webdriver/chrome/bridge.rb +0 -4
- data/lib/selenium/webdriver/chrome/command_executor.rb +2 -2
- data/lib/selenium/webdriver/chrome/extension.zip +0 -0
- data/lib/selenium/webdriver/common.rb +3 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +22 -0
- data/lib/selenium/webdriver/common/element.rb +10 -0
- data/lib/selenium/webdriver/common/keyboard.rb +48 -0
- data/lib/selenium/webdriver/common/mouse.rb +63 -0
- data/lib/selenium/webdriver/common/platform.rb +26 -11
- data/lib/selenium/webdriver/common/proxy.rb +1 -1
- data/lib/selenium/webdriver/common/zipper.rb +0 -1
- data/lib/selenium/webdriver/firefox/bridge.rb +8 -8
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +1 -1
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/profile.rb +9 -5
- data/lib/selenium/webdriver/firefox/socket_lock.rb +1 -11
- data/lib/selenium/webdriver/ie.rb +3 -1
- data/lib/selenium/webdriver/ie/bridge.rb +23 -12
- data/lib/selenium/webdriver/ie/native/win32/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/native/x64/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/server.rb +64 -0
- data/lib/selenium/webdriver/iphone/bridge.rb +1 -1
- data/lib/selenium/webdriver/remote/bridge.rb +62 -8
- data/lib/selenium/webdriver/remote/capabilities.rb +10 -3
- data/lib/selenium/webdriver/remote/commands.rb +67 -59
- data/lib/selenium/webdriver/remote/http/common.rb +4 -0
- data/lib/selenium/webdriver/remote/http/default.rb +10 -4
- data/lib/selenium/webdriver/remote/http/persistent.rb +34 -0
- metadata +169 -196
- data/lib/selenium/webdriver/ie/lib.rb +0 -26
@@ -8,24 +8,35 @@ module Selenium
|
|
8
8
|
|
9
9
|
class Bridge < Remote::Bridge
|
10
10
|
|
11
|
-
HOST
|
12
|
-
|
11
|
+
HOST = Platform.localhost
|
13
12
|
DEFAULT_PORT = 5555
|
14
13
|
DEFAULT_TIMEOUT = 30
|
15
14
|
|
16
15
|
def initialize(opts = {})
|
17
|
-
timeout
|
18
|
-
|
19
|
-
|
16
|
+
timeout = opts.delete(:timeout) { DEFAULT_TIMEOUT }
|
17
|
+
port = opts.delete(:port) { DEFAULT_PORT }
|
18
|
+
http_client = opts.delete(:http_client)
|
19
|
+
|
20
|
+
unless opts.empty?
|
21
|
+
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
22
|
+
end
|
20
23
|
|
21
|
-
@
|
24
|
+
@server = Server.new
|
25
|
+
@port = @server.start Integer(port)
|
22
26
|
|
23
|
-
|
24
|
-
|
27
|
+
host = Platform.localhost
|
28
|
+
unless SocketPoller.new(host, @port, timeout).connected?
|
29
|
+
raise Error::WebDriverError, "unable to connect to IE server within #{timeout} seconds"
|
25
30
|
end
|
26
31
|
|
27
|
-
|
28
|
-
|
32
|
+
remote_opts = {
|
33
|
+
:url => "http://#{host}:#{@port}",
|
34
|
+
:desired_capabilities => :firefox
|
35
|
+
}
|
36
|
+
|
37
|
+
remote_opts.merge!(:http_client => http_client) if http_client
|
38
|
+
|
39
|
+
super(remote_opts)
|
29
40
|
end
|
30
41
|
|
31
42
|
def browser
|
@@ -33,12 +44,12 @@ module Selenium
|
|
33
44
|
end
|
34
45
|
|
35
46
|
def driver_extensions
|
36
|
-
[]
|
47
|
+
[DriverExtensions::TakesScreenshot, DriverExtensions::HasInputDevices]
|
37
48
|
end
|
38
49
|
|
39
50
|
def quit
|
40
51
|
super
|
41
|
-
|
52
|
+
@server.stop
|
42
53
|
|
43
54
|
nil
|
44
55
|
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module IE
|
4
|
+
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
#
|
8
|
+
|
9
|
+
class Server
|
10
|
+
extend FFI::Library
|
11
|
+
|
12
|
+
if Platform.bitsize == 64
|
13
|
+
ffi_lib WebDriver::IE::DLLS[:x64]
|
14
|
+
else
|
15
|
+
ffi_lib WebDriver::IE::DLLS[:win32]
|
16
|
+
end
|
17
|
+
|
18
|
+
ffi_convention :stdcall
|
19
|
+
|
20
|
+
attach_function :start_server, :StartServer, [:int], :pointer
|
21
|
+
attach_function :stop_server, :StopServer, [:pointer], :void
|
22
|
+
attach_function :session_count, :GetServerSessionCount, [], :int
|
23
|
+
attach_function :current_port, :GetServerPort, [], :int
|
24
|
+
attach_function :is_running, :ServerIsRunning, [], :bool
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@handle = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Starts the server, communicating on the specified port, if it is not already running
|
32
|
+
#
|
33
|
+
|
34
|
+
def start(start_port)
|
35
|
+
return port if running?
|
36
|
+
@handle = self.class.start_server(start_port)
|
37
|
+
|
38
|
+
start_port
|
39
|
+
end
|
40
|
+
|
41
|
+
def stop
|
42
|
+
return unless session_count == 0
|
43
|
+
self.class.stop_server @handle
|
44
|
+
@handle = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def running?
|
48
|
+
self.class.is_running
|
49
|
+
end
|
50
|
+
|
51
|
+
def port
|
52
|
+
self.class.current_port
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def session_count
|
58
|
+
self.class.session_count
|
59
|
+
end
|
60
|
+
|
61
|
+
end # Server
|
62
|
+
end # IE
|
63
|
+
end # WebDriver
|
64
|
+
end # Selenium
|
@@ -46,7 +46,7 @@ module Selenium
|
|
46
46
|
|
47
47
|
http_client = opts.delete(:http_client) { Http::Default.new }
|
48
48
|
desired_capabilities = opts.delete(:desired_capabilities) { Capabilities.firefox }
|
49
|
-
url = opts.delete(:url) { "http
|
49
|
+
url = opts.delete(:url) { "http://#{Platform.localhost}:4444/wd/hub" }
|
50
50
|
|
51
51
|
unless opts.empty?
|
52
52
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
@@ -74,7 +74,7 @@ module Selenium
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def driver_extensions
|
77
|
-
[]
|
77
|
+
[DriverExtensions::HasInputDevices, DriverExtensions::TakesScreenshot]
|
78
78
|
end
|
79
79
|
|
80
80
|
#
|
@@ -108,6 +108,10 @@ module Selenium
|
|
108
108
|
execute :setScriptTimeout, {}, :ms => milliseconds
|
109
109
|
end
|
110
110
|
|
111
|
+
#
|
112
|
+
# alerts
|
113
|
+
#
|
114
|
+
|
111
115
|
def acceptAlert
|
112
116
|
execute :acceptAlert
|
113
117
|
end
|
@@ -124,6 +128,10 @@ module Selenium
|
|
124
128
|
execute :getAlertText
|
125
129
|
end
|
126
130
|
|
131
|
+
#
|
132
|
+
# navigation
|
133
|
+
#
|
134
|
+
|
127
135
|
def goBack
|
128
136
|
execute :goBack
|
129
137
|
end
|
@@ -195,6 +203,10 @@ module Selenium
|
|
195
203
|
execute :getSpeed
|
196
204
|
end
|
197
205
|
|
206
|
+
def getScreenshot
|
207
|
+
execute :screenshot
|
208
|
+
end
|
209
|
+
|
198
210
|
def executeScript(script, *args)
|
199
211
|
unless capabilities.javascript_enabled?
|
200
212
|
raise Error::UnsupportedOperationError, "underlying webdriver instance does not support javascript"
|
@@ -220,6 +232,8 @@ module Selenium
|
|
220
232
|
execute :deleteAllCookies
|
221
233
|
end
|
222
234
|
|
235
|
+
# finding elements
|
236
|
+
|
223
237
|
def findElementByClassName(parent, class_name)
|
224
238
|
find_element_by 'class name', class_name, parent
|
225
239
|
end
|
@@ -284,14 +298,44 @@ module Selenium
|
|
284
298
|
find_elements_by 'xpath', xpath, parent
|
285
299
|
end
|
286
300
|
|
287
|
-
#
|
288
|
-
# Element functions
|
289
|
-
#
|
290
|
-
|
291
301
|
def clickElement(element)
|
292
302
|
execute :clickElement, :id => element
|
293
303
|
end
|
294
304
|
|
305
|
+
def click
|
306
|
+
execute :click, {}, :button => 0
|
307
|
+
end
|
308
|
+
|
309
|
+
def doubleClick
|
310
|
+
execute :doubleClick
|
311
|
+
end
|
312
|
+
|
313
|
+
def contextClick
|
314
|
+
execute :click, {}, :button => 2
|
315
|
+
end
|
316
|
+
|
317
|
+
def mouseDown
|
318
|
+
execute :mouseDown
|
319
|
+
end
|
320
|
+
|
321
|
+
def mouseUp
|
322
|
+
execute :mouseUp
|
323
|
+
end
|
324
|
+
|
325
|
+
def mouseMoveTo(element, x = nil, y = nil)
|
326
|
+
params = { :element => element }
|
327
|
+
|
328
|
+
if x && y
|
329
|
+
params.merge!(:xoffset => x, :yoffset => y)
|
330
|
+
end
|
331
|
+
|
332
|
+
execute :mouseMoveTo, {}, params
|
333
|
+
end
|
334
|
+
|
335
|
+
def sendModifierKeyToActiveElement(key, down)
|
336
|
+
execute :sendModifierKeyToActiveElement, {}, :value => key, :isdown => down
|
337
|
+
end
|
338
|
+
|
295
339
|
def getElementTagName(element)
|
296
340
|
execute :getElementTagName, :id => element
|
297
341
|
end
|
@@ -314,6 +358,12 @@ module Selenium
|
|
314
358
|
Point.new data['x'], data['y']
|
315
359
|
end
|
316
360
|
|
361
|
+
def getElementLocationOnceScrolledIntoView(element)
|
362
|
+
data = execute :getElementLocationOnceScrolledIntoView, :id => element
|
363
|
+
|
364
|
+
Point.new data['x'], data['y']
|
365
|
+
end
|
366
|
+
|
317
367
|
def getElementSize(element)
|
318
368
|
data = execute :getElementSize, :id => element
|
319
369
|
|
@@ -410,7 +460,7 @@ module Selenium
|
|
410
460
|
#
|
411
461
|
# executes a command on the remote server via the REST / JSON API.
|
412
462
|
#
|
413
|
-
#
|
463
|
+
# @return [WebDriver::Remote::Response]
|
414
464
|
#
|
415
465
|
|
416
466
|
def raw_execute(command, opts = {}, command_hash = nil)
|
@@ -420,7 +470,7 @@ module Selenium
|
|
420
470
|
path[':session_id'] = @session_id if path.include?(":session_id")
|
421
471
|
|
422
472
|
begin
|
423
|
-
opts.each { |key, value| path[key.inspect] =
|
473
|
+
opts.each { |key, value| path[key.inspect] = escaper.escape(value.to_s)}
|
424
474
|
rescue IndexError
|
425
475
|
raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}"
|
426
476
|
end
|
@@ -429,6 +479,10 @@ module Selenium
|
|
429
479
|
http.call verb, path, command_hash
|
430
480
|
end
|
431
481
|
|
482
|
+
def escaper
|
483
|
+
@escaper ||= defined?(URI::Parser) ? URI::Parser.new : URI
|
484
|
+
end
|
485
|
+
|
432
486
|
end # Bridge
|
433
487
|
end # Remote
|
434
488
|
end # WebDriver
|
@@ -16,7 +16,8 @@ module Selenium
|
|
16
16
|
:takes_screenshot,
|
17
17
|
:rotatable,
|
18
18
|
:version,
|
19
|
-
:browser_name
|
19
|
+
:browser_name,
|
20
|
+
:firefox_profile
|
20
21
|
|
21
22
|
alias_method :css_selectors_enabled?, :css_selectors_enabled
|
22
23
|
alias_method :javascript_enabled? , :javascript_enabled
|
@@ -108,6 +109,10 @@ module Selenium
|
|
108
109
|
# @option :native_events [Boolean] does this driver use native events?
|
109
110
|
# @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
|
110
111
|
#
|
112
|
+
# Firefox-specific options:
|
113
|
+
#
|
114
|
+
# @option :firefox_profile [Selenium::WebDriver::Firefox::Profile] the firefox profile to use
|
115
|
+
#
|
111
116
|
# @api public
|
112
117
|
#
|
113
118
|
|
@@ -120,6 +125,7 @@ module Selenium
|
|
120
125
|
@takes_screenshot = opts[:takes_screenshot] || false
|
121
126
|
@native_events = opts[:native_events] || false
|
122
127
|
@rotatable = opts[:rotatable] || false
|
128
|
+
@firefox_profile = opts[:firefox_profile]
|
123
129
|
|
124
130
|
self.proxy = opts[:proxy]
|
125
131
|
end
|
@@ -147,10 +153,11 @@ module Selenium
|
|
147
153
|
"cssSelectorsEnabled" => css_selectors_enabled?,
|
148
154
|
"takesScreenshot" => takes_screenshot?,
|
149
155
|
"nativeEvents" => native_events?,
|
150
|
-
"rotatable" => rotatable
|
156
|
+
"rotatable" => rotatable?,
|
151
157
|
}
|
152
158
|
|
153
|
-
hash["proxy"]
|
159
|
+
hash["proxy"] = proxy.as_json if proxy
|
160
|
+
hash['firefox_profile'] = firefox_profile.as_json['zip'] if firefox_profile
|
154
161
|
|
155
162
|
hash
|
156
163
|
end
|
@@ -5,63 +5,71 @@ class Selenium::WebDriver::Remote::Bridge
|
|
5
5
|
# http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference
|
6
6
|
#
|
7
7
|
|
8
|
-
command :newSession,
|
9
|
-
command :getCapabilities,
|
10
|
-
command :quit,
|
11
|
-
command :setImplicitWaitTimeout,
|
12
|
-
command :setScriptTimeout,
|
13
|
-
command :getCurrentWindowHandle,
|
14
|
-
command :getWindowHandles,
|
15
|
-
command :getCurrentUrl,
|
16
|
-
command :get,
|
17
|
-
command :dismissAlert,
|
18
|
-
command :acceptAlert,
|
19
|
-
command :getAlertText,
|
20
|
-
command :setAlertValue,
|
21
|
-
command :goForward,
|
22
|
-
command :goBack,
|
23
|
-
command :refresh,
|
24
|
-
command :executeScript,
|
25
|
-
command :screenshot,
|
26
|
-
command :switchToFrame,
|
27
|
-
command :switchToWindow,
|
28
|
-
command :getSpeed,
|
29
|
-
command :setSpeed,
|
30
|
-
command :getAllCookies,
|
31
|
-
command :addCookie,
|
32
|
-
command :deleteAllCookies,
|
33
|
-
command :deleteCookieNamed,
|
34
|
-
command :getPageSource,
|
35
|
-
command :getTitle,
|
36
|
-
command :findElement,
|
37
|
-
command :findElements,
|
38
|
-
command :getActiveElement,
|
39
|
-
command :describeElement,
|
40
|
-
command :findChildElement,
|
41
|
-
command :findChildElements,
|
42
|
-
command :clickElement,
|
43
|
-
command :submitElement,
|
44
|
-
command :getElementValue,
|
45
|
-
command :sendKeysToElement,
|
46
|
-
command :getElementTagName,
|
47
|
-
command :clearElement,
|
48
|
-
command :isElementSelected,
|
49
|
-
command :setElementSelected,
|
50
|
-
command :toggleElement,
|
51
|
-
command :isElementEnabled,
|
52
|
-
command :getElementAttribute,
|
53
|
-
command :elementEquals,
|
54
|
-
command :isElementDisplayed,
|
55
|
-
command :getElementLocation,
|
56
|
-
command :
|
57
|
-
command :getElementSize,
|
58
|
-
command :hoverOverElement,
|
59
|
-
command :dragElement,
|
60
|
-
command :getElementValueOfCssProperty,
|
61
|
-
command :close,
|
62
|
-
command :getElementText,
|
63
|
-
command :getVisible,
|
64
|
-
command :setVisible,
|
65
|
-
command :getScreenOrientation,
|
66
|
-
command :setScreenOrientation,
|
8
|
+
command :newSession, :post, "session"
|
9
|
+
command :getCapabilities, :get, "session/:session_id"
|
10
|
+
command :quit, :delete, "session/:session_id"
|
11
|
+
command :setImplicitWaitTimeout, :post, "session/:session_id/timeouts/implicit_wait"
|
12
|
+
command :setScriptTimeout, :post, "session/:session_id/timeouts/async_script"
|
13
|
+
command :getCurrentWindowHandle, :get, "session/:session_id/window_handle"
|
14
|
+
command :getWindowHandles, :get, "session/:session_id/window_handles"
|
15
|
+
command :getCurrentUrl, :get, "session/:session_id/url"
|
16
|
+
command :get, :post, "session/:session_id/url"
|
17
|
+
command :dismissAlert, :post, "session/:session_id/dismiss_alert"
|
18
|
+
command :acceptAlert, :post, "session/:session_id/accept_alert"
|
19
|
+
command :getAlertText, :get, "session/:session_id/alert_text"
|
20
|
+
command :setAlertValue, :post, "session/:session_id/alert_text"
|
21
|
+
command :goForward, :post, "session/:session_id/forward"
|
22
|
+
command :goBack, :post, "session/:session_id/back"
|
23
|
+
command :refresh, :post, "session/:session_id/refresh"
|
24
|
+
command :executeScript, :post, "session/:session_id/execute"
|
25
|
+
command :screenshot, :get, "session/:session_id/screenshot"
|
26
|
+
command :switchToFrame, :post, "session/:session_id/frame"
|
27
|
+
command :switchToWindow, :post, "session/:session_id/window"
|
28
|
+
command :getSpeed, :get, "session/:session_id/speed"
|
29
|
+
command :setSpeed, :post, "session/:session_id/speed"
|
30
|
+
command :getAllCookies, :get, "session/:session_id/cookie"
|
31
|
+
command :addCookie, :post, "session/:session_id/cookie"
|
32
|
+
command :deleteAllCookies, :delete, "session/:session_id/cookie"
|
33
|
+
command :deleteCookieNamed, :delete, "session/:session_id/cookie/:name"
|
34
|
+
command :getPageSource, :get, "session/:session_id/source"
|
35
|
+
command :getTitle, :get, "session/:session_id/title"
|
36
|
+
command :findElement, :post, "session/:session_id/element"
|
37
|
+
command :findElements, :post, "session/:session_id/elements"
|
38
|
+
command :getActiveElement, :post, "session/:session_id/element/active"
|
39
|
+
command :describeElement, :get, "session/:session_id/element/:id"
|
40
|
+
command :findChildElement, :post, "session/:session_id/element/:id/element"
|
41
|
+
command :findChildElements, :post, "session/:session_id/element/:id/elements"
|
42
|
+
command :clickElement, :post, "session/:session_id/element/:id/click"
|
43
|
+
command :submitElement, :post, "session/:session_id/element/:id/submit"
|
44
|
+
command :getElementValue, :get, "session/:session_id/element/:id/value"
|
45
|
+
command :sendKeysToElement, :post, "session/:session_id/element/:id/value"
|
46
|
+
command :getElementTagName, :get, "session/:session_id/element/:id/name"
|
47
|
+
command :clearElement, :post, "session/:session_id/element/:id/clear"
|
48
|
+
command :isElementSelected, :get, "session/:session_id/element/:id/selected"
|
49
|
+
command :setElementSelected, :post, "session/:session_id/element/:id/selected"
|
50
|
+
command :toggleElement, :post, "session/:session_id/element/:id/toggle"
|
51
|
+
command :isElementEnabled, :get, "session/:session_id/element/:id/enabled"
|
52
|
+
command :getElementAttribute, :get, "session/:session_id/element/:id/attribute/:name"
|
53
|
+
command :elementEquals, :get, "session/:session_id/element/:id/equals/:other"
|
54
|
+
command :isElementDisplayed, :get, "session/:session_id/element/:id/displayed"
|
55
|
+
command :getElementLocation, :get, "session/:session_id/element/:id/location"
|
56
|
+
command :getElementLocationOnceScrolledIntoView, :get, "session/:session_id/element/:id/location_in_view"
|
57
|
+
command :getElementSize, :get, "session/:session_id/element/:id/size"
|
58
|
+
command :hoverOverElement, :post, "session/:session_id/element/:id/hover"
|
59
|
+
command :dragElement, :post, "session/:session_id/element/:id/drag"
|
60
|
+
command :getElementValueOfCssProperty, :get, "session/:session_id/element/:id/css/:property_name"
|
61
|
+
command :close, :delete, "session/:session_id/window"
|
62
|
+
command :getElementText, :get, "session/:session_id/element/:id/text"
|
63
|
+
command :getVisible, :get, "session/:session_id/visible"
|
64
|
+
command :setVisible, :post, "session/:session_id/visible"
|
65
|
+
command :getScreenOrientation, :get, "session/:session_id/orientation"
|
66
|
+
command :setScreenOrientation, :post, "session/:session_id/orientation"
|
67
|
+
|
68
|
+
# interactions API
|
69
|
+
command :click, :post, "session/:session_id/click"
|
70
|
+
command :doubleClick, :post, "session/:session_id/doubleclick"
|
71
|
+
command :mouseDown, :post, "session/:session_id/buttondown"
|
72
|
+
command :mouseUp, :post, "session/:session_id/buttonup"
|
73
|
+
command :mouseMoveTo, :post, "session/:session_id/moveto"
|
74
|
+
command :sendModifierKeyToActiveElement, :post, "session/:session_id/modifier"
|
67
75
|
end
|