selenium-webdriver 2.20.0 → 2.21.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +17 -0
- data/lib/selenium/server.rb +25 -1
- data/lib/selenium/webdriver.rb +1 -0
- data/lib/selenium/webdriver/common/driver.rb +2 -0
- data/lib/selenium/webdriver/common/element.rb +28 -4
- data/lib/selenium/webdriver/common/window.rb +8 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +1 -2
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/ie/bridge.rb +8 -7
- 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 +9 -1
- data/lib/selenium/webdriver/remote/bridge.rb +9 -5
- data/lib/selenium/webdriver/remote/capabilities.rb +9 -0
- data/lib/selenium/webdriver/remote/commands.rb +4 -3
- data/lib/selenium/webdriver/safari.rb +41 -0
- data/lib/selenium/webdriver/safari/bridge.rb +96 -0
- data/lib/selenium/webdriver/safari/browser.rb +20 -0
- data/lib/selenium/webdriver/safari/server.rb +138 -0
- metadata +25 -10
data/CHANGES
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
2.21.0 (2012-04-11)
|
2
|
+
===================
|
3
|
+
|
4
|
+
* Add Selenium::WebDriver::Window#maximize (#3489)
|
5
|
+
* Safari:
|
6
|
+
* New driver! See http://code.google.com/p/selenium/wiki/SafariDriver.
|
7
|
+
* Firefox:
|
8
|
+
* Significant stability improvements.
|
9
|
+
* Native events support for Firefox 11
|
10
|
+
* Dropped native events support for Firefox 4-9
|
11
|
+
* Window maximize implementation.
|
12
|
+
* IE:
|
13
|
+
* Ignore invisible dialogs (#3360).
|
14
|
+
* Window maximize implementation.
|
15
|
+
* Android:
|
16
|
+
* Accept SSL certificates (#3504).
|
17
|
+
|
1
18
|
2.20.0 (2012-02-28)
|
2
19
|
===================
|
3
20
|
|
data/lib/selenium/server.rb
CHANGED
@@ -101,6 +101,30 @@ module Selenium
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
+
#
|
105
|
+
# The server port
|
106
|
+
#
|
107
|
+
|
108
|
+
attr_accessor :port
|
109
|
+
|
110
|
+
#
|
111
|
+
# The server timeout
|
112
|
+
#
|
113
|
+
|
114
|
+
attr_accessor :timeout
|
115
|
+
|
116
|
+
#
|
117
|
+
# Whether to launch the server in the background
|
118
|
+
#
|
119
|
+
|
120
|
+
attr_accessor :background
|
121
|
+
|
122
|
+
#
|
123
|
+
# Path to log file, or 'true' for stdout.
|
124
|
+
#
|
125
|
+
|
126
|
+
attr_accessor :log
|
127
|
+
|
104
128
|
#
|
105
129
|
# @param [String] jar Path to the server jar.
|
106
130
|
# @param [Hash] opts the options to create the server process with
|
@@ -190,7 +214,7 @@ module Selenium
|
|
190
214
|
cp = ChildProcess.build("java", "-jar", @jar, "-port", @port.to_s, *@additional_args)
|
191
215
|
io = cp.io
|
192
216
|
|
193
|
-
if @log.kind_of?(String)
|
217
|
+
if @log.kind_of?(String)
|
194
218
|
@log_file = File.open(@log, "w")
|
195
219
|
io.stdout = io.stderr = @log_file
|
196
220
|
elsif @log
|
data/lib/selenium/webdriver.rb
CHANGED
@@ -19,6 +19,7 @@ module Selenium
|
|
19
19
|
autoload :IPhone, 'selenium/webdriver/iphone'
|
20
20
|
autoload :Opera, 'selenium/webdriver/opera'
|
21
21
|
autoload :Remote, 'selenium/webdriver/remote'
|
22
|
+
autoload :Safari, 'selenium/webdriver/safari'
|
22
23
|
autoload :Support, 'selenium/webdriver/support'
|
23
24
|
|
24
25
|
# @api private
|
@@ -27,17 +27,41 @@ module Selenium
|
|
27
27
|
end
|
28
28
|
|
29
29
|
#
|
30
|
-
# Click
|
30
|
+
# Click this element. If this causes a new page to load, this method will
|
31
|
+
# attempt to block until the page has loaded. At this point, you should
|
32
|
+
# discard all references to this element and any further operations
|
33
|
+
# performed on this element will raise a StaleElementReferenceError
|
34
|
+
# unless you know that the element and the page will still be present. If
|
35
|
+
# click() causes a new page to be loaded via an event or is done by
|
36
|
+
# sending a native event then the method will *not* wait for it to be
|
37
|
+
# loaded and the caller should verify that a new page has been loaded.
|
31
38
|
#
|
32
|
-
|
39
|
+
# There are some preconditions for an element to be clicked. The element
|
40
|
+
# must be visible and it must have a height and width greater then 0.
|
41
|
+
#
|
42
|
+
# Equivalent to:
|
43
|
+
# driver.action.click(element)
|
44
|
+
#
|
45
|
+
# @example Click on a button
|
46
|
+
#
|
47
|
+
# driver.find_element(:tag_name, "button").click
|
48
|
+
#
|
49
|
+
# @raise [StaleElementReferenceError] if the element no longer exists as
|
50
|
+
# defined
|
51
|
+
#
|
52
|
+
|
33
53
|
def click
|
34
54
|
bridge.clickElement @id
|
35
55
|
end
|
36
56
|
|
37
57
|
#
|
38
|
-
# Get the tag name of
|
58
|
+
# Get the tag name of the element.
|
39
59
|
#
|
40
|
-
# @
|
60
|
+
# @example Get the tagname of an INPUT element(returns "input")
|
61
|
+
#
|
62
|
+
# driver.find_element(:xpath, "//input").tag_name
|
63
|
+
#
|
64
|
+
# @return [String] The tag name of this element.
|
41
65
|
#
|
42
66
|
|
43
67
|
def tag_name
|
@@ -21,9 +21,7 @@
|
|
21
21
|
"extensions.logging.enabled": true,
|
22
22
|
"extensions.update.enabled": false,
|
23
23
|
"extensions.update.notifyUser": false,
|
24
|
-
"focusmanager.testmode": true,
|
25
24
|
"network.manage-offline-status": false,
|
26
|
-
"network.http.max-connections-per-server": 10,
|
27
25
|
"network.http.phishy-userpass-length": 255,
|
28
26
|
"offline-apps.allow_by_default": true,
|
29
27
|
"prompts.tab_modal.enabled": false,
|
@@ -51,6 +49,7 @@
|
|
51
49
|
"dom.max_script_run_time": 30,
|
52
50
|
"dom.report_all_js_exceptions": true,
|
53
51
|
"javascript.options.showInConsole": true,
|
52
|
+
"network.http.max-connections-per-server": 10,
|
54
53
|
"webdriver_accept_untrusted_certs": true,
|
55
54
|
"webdriver_assume_untrusted_issuer": true
|
56
55
|
}
|
Binary file
|
@@ -16,25 +16,26 @@ module Selenium
|
|
16
16
|
timeout = opts.delete(:timeout) { DEFAULT_TIMEOUT }
|
17
17
|
port = opts.delete(:port) { DEFAULT_PORT }
|
18
18
|
http_client = opts.delete(:http_client)
|
19
|
+
ignore_mode = opts.delete(:introduce_flakiness_by_ignoring_security_domains)
|
19
20
|
|
20
21
|
unless opts.empty?
|
21
22
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
22
23
|
end
|
23
24
|
|
24
25
|
@server = Server.new
|
25
|
-
@port
|
26
|
+
@port = @server.start Integer(port), timeout
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
caps = Remote::Capabilities.internet_explorer
|
29
|
+
if ignore_mode
|
30
|
+
caps['ignoreProtectedModeSettings'] = true
|
30
31
|
end
|
31
32
|
|
32
33
|
remote_opts = {
|
33
|
-
:url =>
|
34
|
-
:desired_capabilities =>
|
34
|
+
:url => @server.uri,
|
35
|
+
:desired_capabilities => caps
|
35
36
|
}
|
36
37
|
|
37
|
-
remote_opts
|
38
|
+
remote_opts[:http_client] = http_client if http_client
|
38
39
|
|
39
40
|
super(remote_opts)
|
40
41
|
end
|
Binary file
|
Binary file
|
@@ -31,10 +31,14 @@ module Selenium
|
|
31
31
|
# Starts the server, communicating on the specified port, if it is not already running
|
32
32
|
#
|
33
33
|
|
34
|
-
def start(start_port)
|
34
|
+
def start(start_port, timeout)
|
35
35
|
return port if running?
|
36
36
|
@handle = self.class.start_server(start_port)
|
37
37
|
|
38
|
+
unless SocketPoller.new(Platform.localhost, start_port, timeout).connected?
|
39
|
+
raise Error::WebDriverError, "unable to connect to IE server within #{timeout} seconds"
|
40
|
+
end
|
41
|
+
|
38
42
|
start_port
|
39
43
|
end
|
40
44
|
|
@@ -52,6 +56,10 @@ module Selenium
|
|
52
56
|
self.class.current_port
|
53
57
|
end
|
54
58
|
|
59
|
+
def uri
|
60
|
+
"http://#{Platform.localhost}:#{port}"
|
61
|
+
end
|
62
|
+
|
55
63
|
private
|
56
64
|
|
57
65
|
def session_count
|
@@ -104,7 +104,7 @@ module Selenium
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def setImplicitWaitTimeout(milliseconds)
|
107
|
-
execute :
|
107
|
+
execute :implicitlyWait, {}, :ms => milliseconds
|
108
108
|
end
|
109
109
|
|
110
110
|
def setScriptTimeout(milliseconds)
|
@@ -217,6 +217,10 @@ module Selenium
|
|
217
217
|
:height => height
|
218
218
|
end
|
219
219
|
|
220
|
+
def maximizeWindow(handle = :current)
|
221
|
+
execute :maximizeWindow, :window_handle => handle
|
222
|
+
end
|
223
|
+
|
220
224
|
def getWindowSize(handle = :current)
|
221
225
|
data = execute :getWindowSize, :window_handle => handle
|
222
226
|
|
@@ -335,11 +339,11 @@ module Selenium
|
|
335
339
|
end
|
336
340
|
|
337
341
|
def deleteCookie(name)
|
338
|
-
execute :
|
342
|
+
execute :deleteCookie, :name => name
|
339
343
|
end
|
340
344
|
|
341
345
|
def getAllCookies
|
342
|
-
execute :
|
346
|
+
execute :getCookies
|
343
347
|
end
|
344
348
|
|
345
349
|
def deleteAllCookies
|
@@ -562,7 +566,7 @@ module Selenium
|
|
562
566
|
end
|
563
567
|
|
564
568
|
#
|
565
|
-
# executes a command on the remote server
|
569
|
+
# executes a command on the remote server.
|
566
570
|
#
|
567
571
|
#
|
568
572
|
# Returns the 'value' of the returned payload
|
@@ -573,7 +577,7 @@ module Selenium
|
|
573
577
|
end
|
574
578
|
|
575
579
|
#
|
576
|
-
# executes a command on the remote server
|
580
|
+
# executes a command on the remote server.
|
577
581
|
#
|
578
582
|
# @return [WebDriver::Remote::Response]
|
579
583
|
#
|
@@ -108,6 +108,15 @@ module Selenium
|
|
108
108
|
}.merge(opts))
|
109
109
|
end
|
110
110
|
|
111
|
+
def safari(opts = {})
|
112
|
+
new({
|
113
|
+
:browser_name => "safari",
|
114
|
+
:javascript_enabled => true,
|
115
|
+
:takes_screenshot => true,
|
116
|
+
:css_selectors_enabled => true
|
117
|
+
}.merge(opts))
|
118
|
+
end
|
119
|
+
|
111
120
|
#
|
112
121
|
# @api private
|
113
122
|
#
|
@@ -37,6 +37,7 @@ class Selenium::WebDriver::Remote::Bridge
|
|
37
37
|
command :setWindowPosition, :post, "session/:session_id/window/:window_handle/position"
|
38
38
|
command :getWindowSize, :get, "session/:session_id/window/:window_handle/size"
|
39
39
|
command :getWindowPosition, :get, "session/:session_id/window/:window_handle/position"
|
40
|
+
command :maximizeWindow, :post, "session/:session_id/window/:window_handle/maximize"
|
40
41
|
|
41
42
|
#
|
42
43
|
# script execution
|
@@ -71,16 +72,16 @@ class Selenium::WebDriver::Remote::Bridge
|
|
71
72
|
# options
|
72
73
|
#
|
73
74
|
|
74
|
-
command :
|
75
|
+
command :getCookies, :get, "session/:session_id/cookie"
|
75
76
|
command :addCookie, :post, "session/:session_id/cookie"
|
76
77
|
command :deleteAllCookies, :delete, "session/:session_id/cookie"
|
77
|
-
command :
|
78
|
+
command :deleteCookie, :delete, "session/:session_id/cookie/:name"
|
78
79
|
|
79
80
|
#
|
80
81
|
# timeouts
|
81
82
|
#
|
82
83
|
|
83
|
-
command :
|
84
|
+
command :implicitlyWait, :post, "session/:session_id/timeouts/implicit_wait"
|
84
85
|
command :setScriptTimeout, :post, "session/:session_id/timeouts/async_script"
|
85
86
|
command :setTimeout, :post, "session/:session_id/timeouts"
|
86
87
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'libwebsocket'
|
2
|
+
|
3
|
+
module Selenium
|
4
|
+
module WebDriver
|
5
|
+
module Safari
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def path=(path)
|
9
|
+
Platform.assert_executable(path)
|
10
|
+
@path = path
|
11
|
+
end
|
12
|
+
|
13
|
+
def path
|
14
|
+
@path ||= (
|
15
|
+
path = case Platform.os
|
16
|
+
when :windows
|
17
|
+
# TODO: improve this
|
18
|
+
File.join(ENV['ProgramFiles'], 'Safari', 'Safari.exe')
|
19
|
+
when :macosx
|
20
|
+
"/Applications/Safari.app/Contents/MacOS/Safari"
|
21
|
+
else
|
22
|
+
Platform.find_binary("Safari")
|
23
|
+
end
|
24
|
+
|
25
|
+
unless File.file?(path) && File.executable?(path)
|
26
|
+
raise Error::WebDriverError, "unable to find the Safari executable, please set Selenium::WebDriver::Safari.path= or add it to your PATH."
|
27
|
+
end
|
28
|
+
|
29
|
+
path
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
require 'selenium/webdriver/safari/browser'
|
39
|
+
require 'selenium/webdriver/safari/server'
|
40
|
+
require 'selenium/webdriver/safari/bridge'
|
41
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Safari
|
4
|
+
|
5
|
+
class Bridge < Remote::Bridge
|
6
|
+
COMMAND_TIMEOUT = 60
|
7
|
+
|
8
|
+
def initialize(opts = {})
|
9
|
+
port = Integer(opts[:port] || PortProber.random)
|
10
|
+
timeout = Integer(opts[:timeout] || COMMAND_TIMEOUT)
|
11
|
+
|
12
|
+
@command_id ||= 0
|
13
|
+
|
14
|
+
@server = Server.new(port, timeout)
|
15
|
+
@server.start
|
16
|
+
|
17
|
+
@browser = Browser.new
|
18
|
+
@browser.start(prepare_connect_file)
|
19
|
+
|
20
|
+
@server.wait_for_connection
|
21
|
+
|
22
|
+
super(:desired_capabilities => :safari)
|
23
|
+
end
|
24
|
+
|
25
|
+
def quit
|
26
|
+
super
|
27
|
+
|
28
|
+
@server.stop
|
29
|
+
@browser.stop
|
30
|
+
end
|
31
|
+
|
32
|
+
def driver_extensions
|
33
|
+
[]
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def create_session(desired_capabilities)
|
39
|
+
resp = raw_execute :newSession, {}, :desiredCapabilities => desired_capabilities
|
40
|
+
Remote::Capabilities.json_create resp.fetch('value')
|
41
|
+
end
|
42
|
+
|
43
|
+
def raw_execute(command, opts = {}, command_hash = nil)
|
44
|
+
@command_id += 1
|
45
|
+
|
46
|
+
params = {}
|
47
|
+
opts.each do |key, value|
|
48
|
+
params[camel_case(key.to_s)] = value
|
49
|
+
end
|
50
|
+
|
51
|
+
params.merge!(command_hash) if command_hash
|
52
|
+
|
53
|
+
@server.send :id => @command_id.to_s,
|
54
|
+
:name => command,
|
55
|
+
:parameters => params
|
56
|
+
|
57
|
+
response = @server.receive
|
58
|
+
|
59
|
+
status_code = response['status']
|
60
|
+
if status_code != 0
|
61
|
+
raise Error.for_code(status_code), response['value']['message']
|
62
|
+
end
|
63
|
+
|
64
|
+
if response['id'] != @command_id.to_s
|
65
|
+
raise Error::WebDriverError, "response id does not match command id"
|
66
|
+
end
|
67
|
+
|
68
|
+
response
|
69
|
+
end
|
70
|
+
|
71
|
+
def camel_case(str)
|
72
|
+
parts = str.split('_')
|
73
|
+
parts[1..-1].map { |e| e.capitalize! }
|
74
|
+
|
75
|
+
parts.join
|
76
|
+
end
|
77
|
+
|
78
|
+
def prepare_connect_file
|
79
|
+
# TODO: use tempfile?
|
80
|
+
path = File.join(Dir.tmpdir, "safaridriver-#{Time.now.to_i}.html")
|
81
|
+
|
82
|
+
File.open(path, 'w') do |io|
|
83
|
+
io << "<!DOCTYPE html><script>window.location = '#{@server.uri}';</script>"
|
84
|
+
end
|
85
|
+
|
86
|
+
FileReaper << path
|
87
|
+
path.gsub! "/", "\\" if Platform.windows?
|
88
|
+
|
89
|
+
path
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Safari
|
4
|
+
|
5
|
+
class Browser
|
6
|
+
def start(*args)
|
7
|
+
@process = ChildProcess.new(Safari.path, *args)
|
8
|
+
@process.io.inherit! if $DEBUG
|
9
|
+
@process.start
|
10
|
+
end
|
11
|
+
|
12
|
+
def stop
|
13
|
+
@process.stop if @process
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Safari
|
4
|
+
|
5
|
+
class Server
|
6
|
+
def initialize(port, command_timeout)
|
7
|
+
@port = port
|
8
|
+
@command_timeout = command_timeout
|
9
|
+
@frame = LibWebSocket::Frame.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def start
|
13
|
+
@server = TCPServer.new(Platform.localhost, @port)
|
14
|
+
end
|
15
|
+
|
16
|
+
def stop
|
17
|
+
@server.close if @server && !@server.closed?
|
18
|
+
@ws.close if @ws && !@ws.closed?
|
19
|
+
end
|
20
|
+
|
21
|
+
def send(command)
|
22
|
+
json = MultiJson.encode(command)
|
23
|
+
puts ">>> #{json}" if $DEBUG
|
24
|
+
|
25
|
+
frame = LibWebSocket::Frame.new(json).to_s
|
26
|
+
|
27
|
+
@ws.write frame
|
28
|
+
@ws.flush
|
29
|
+
end
|
30
|
+
|
31
|
+
def receive
|
32
|
+
until msg = @frame.next
|
33
|
+
end_time = Time.now + @command_timeout
|
34
|
+
|
35
|
+
begin
|
36
|
+
data = @ws.read_nonblock(1)
|
37
|
+
rescue Errno::EWOULDBLOCK, Errno::EAGAIN
|
38
|
+
now = Time.now
|
39
|
+
if now >= end_time
|
40
|
+
raise Error::TimeOutError, "timed out waiting for Safari to respond"
|
41
|
+
end
|
42
|
+
|
43
|
+
IO.select([@ws], nil, nil, end_time - now)
|
44
|
+
retry
|
45
|
+
end
|
46
|
+
|
47
|
+
@frame.append(data)
|
48
|
+
end
|
49
|
+
|
50
|
+
puts "<<< #{msg}" if $DEBUG
|
51
|
+
|
52
|
+
MultiJson.decode msg
|
53
|
+
end
|
54
|
+
|
55
|
+
def ws_uri
|
56
|
+
"ws://#{Platform.localhost}:#{@port}/wd"
|
57
|
+
end
|
58
|
+
|
59
|
+
def uri
|
60
|
+
"http://#{Platform.localhost}:#{@port}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def wait_for_connection
|
64
|
+
# TODO: timeouts / non-blocking accept
|
65
|
+
process_initial_http_request
|
66
|
+
process_handshake
|
67
|
+
end
|
68
|
+
|
69
|
+
HEADERS = <<-HEADERS
|
70
|
+
HTTP/1.1 200 OK
|
71
|
+
Content-Type: text/html; charset=utf-8
|
72
|
+
Server: safaridriver-ruby
|
73
|
+
HEADERS
|
74
|
+
|
75
|
+
HEADERS.gsub!("\n", "\r\n")
|
76
|
+
|
77
|
+
HTML = <<-HTML
|
78
|
+
<!DOCTYPE html>
|
79
|
+
<h2>SafariDriver requesting connection at %s</h2>
|
80
|
+
<script>
|
81
|
+
// Must wait for onload so the injected script is loaded by the
|
82
|
+
// SafariDriver extension.
|
83
|
+
window.onload = function() {
|
84
|
+
window.postMessage({
|
85
|
+
'message': 'connect',
|
86
|
+
'source': 'webdriver',
|
87
|
+
'url': '%s'
|
88
|
+
}, '*');
|
89
|
+
};
|
90
|
+
</script>
|
91
|
+
HTML
|
92
|
+
|
93
|
+
def process_initial_http_request
|
94
|
+
http = @server.accept
|
95
|
+
|
96
|
+
req = ''
|
97
|
+
until req.include?("\r\n\r\n")
|
98
|
+
req << http.read(1)
|
99
|
+
end
|
100
|
+
|
101
|
+
http << HEADERS
|
102
|
+
http << "\r\n\r\n"
|
103
|
+
http << HTML % [ws_uri, ws_uri]
|
104
|
+
|
105
|
+
http.close
|
106
|
+
end
|
107
|
+
|
108
|
+
def process_handshake
|
109
|
+
@ws = @server.accept
|
110
|
+
hs = LibWebSocket::OpeningHandshake::Server.new
|
111
|
+
|
112
|
+
req = ''
|
113
|
+
until hs.done?
|
114
|
+
data = @ws.getc || next
|
115
|
+
req << data.chr
|
116
|
+
|
117
|
+
unless hs.parse(data.chr)
|
118
|
+
if req.include? "favicon.ico"
|
119
|
+
@ws.close
|
120
|
+
process_handshake
|
121
|
+
return
|
122
|
+
else
|
123
|
+
raise Error::WebDriverError, "#{hs.error}: #{req}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
@ws.write(hs.to_s)
|
129
|
+
@ws.flush
|
130
|
+
|
131
|
+
puts "handshake complete" if $DEBUG
|
132
|
+
@server.close
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: selenium-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 2.
|
5
|
+
version: 2.21.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jari Bakken
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-04-11 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -58,49 +58,60 @@ dependencies:
|
|
58
58
|
type: :runtime
|
59
59
|
version_requirements: *id004
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: libwebsocket
|
62
62
|
prerelease: false
|
63
63
|
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.3
|
69
|
+
type: :runtime
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
64
75
|
none: false
|
65
76
|
requirements:
|
66
77
|
- - ~>
|
67
78
|
- !ruby/object:Gem::Version
|
68
79
|
version: "2.0"
|
69
80
|
type: :development
|
70
|
-
version_requirements: *
|
81
|
+
version_requirements: *id006
|
71
82
|
- !ruby/object:Gem::Dependency
|
72
83
|
name: rack
|
73
84
|
prerelease: false
|
74
|
-
requirement: &
|
85
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
75
86
|
none: false
|
76
87
|
requirements:
|
77
88
|
- - ~>
|
78
89
|
- !ruby/object:Gem::Version
|
79
90
|
version: "1.0"
|
80
91
|
type: :development
|
81
|
-
version_requirements: *
|
92
|
+
version_requirements: *id007
|
82
93
|
- !ruby/object:Gem::Dependency
|
83
94
|
name: ci_reporter
|
84
95
|
prerelease: false
|
85
|
-
requirement: &
|
96
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
86
97
|
none: false
|
87
98
|
requirements:
|
88
99
|
- - ~>
|
89
100
|
- !ruby/object:Gem::Version
|
90
101
|
version: 1.6.2
|
91
102
|
type: :development
|
92
|
-
version_requirements: *
|
103
|
+
version_requirements: *id008
|
93
104
|
- !ruby/object:Gem::Dependency
|
94
105
|
name: webmock
|
95
106
|
prerelease: false
|
96
|
-
requirement: &
|
107
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
97
108
|
none: false
|
98
109
|
requirements:
|
99
110
|
- - ~>
|
100
111
|
- !ruby/object:Gem::Version
|
101
112
|
version: 1.7.5
|
102
113
|
type: :development
|
103
|
-
version_requirements: *
|
114
|
+
version_requirements: *id009
|
104
115
|
description: WebDriver is a tool for writing automated tests of websites. It aims to mimic the behaviour of a real user, and as such interacts with the HTML of the application.
|
105
116
|
email: jari.bakken@gmail.com
|
106
117
|
executables: []
|
@@ -135,6 +146,7 @@ files:
|
|
135
146
|
- lib/selenium/webdriver/iphone.rb
|
136
147
|
- lib/selenium/webdriver/opera.rb
|
137
148
|
- lib/selenium/webdriver/remote.rb
|
149
|
+
- lib/selenium/webdriver/safari.rb
|
138
150
|
- lib/selenium/webdriver/support.rb
|
139
151
|
- lib/selenium/webdriver/android/bridge.rb
|
140
152
|
- lib/selenium/webdriver/chrome/bridge.rb
|
@@ -208,6 +220,9 @@ files:
|
|
208
220
|
- lib/selenium/webdriver/remote/http/curb.rb
|
209
221
|
- lib/selenium/webdriver/remote/http/default.rb
|
210
222
|
- lib/selenium/webdriver/remote/http/persistent.rb
|
223
|
+
- lib/selenium/webdriver/safari/bridge.rb
|
224
|
+
- lib/selenium/webdriver/safari/browser.rb
|
225
|
+
- lib/selenium/webdriver/safari/server.rb
|
211
226
|
- lib/selenium/webdriver/support/abstract_event_listener.rb
|
212
227
|
- lib/selenium/webdriver/support/block_event_listener.rb
|
213
228
|
- lib/selenium/webdriver/support/event_firing_bridge.rb
|