selenium-webdriver 0.1.2 → 0.1.3.dev
Sign up to get free protection for your applications and to get access to all the features.
- 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
|