selenium-webdriver 2.48.1 → 2.49.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +34 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +2 -2
- data/lib/selenium/webdriver/chrome/service.rb +6 -3
- data/lib/selenium/webdriver/common/driver.rb +6 -2
- data/lib/selenium/webdriver/common/element.rb +1 -1
- data/lib/selenium/webdriver/common/error.rb +7 -2
- data/lib/selenium/webdriver/common/options.rb +1 -2
- data/lib/selenium/webdriver/common/socket_lock.rb +5 -0
- data/lib/selenium/webdriver/common/window.rb +8 -0
- data/lib/selenium/webdriver/edge/bridge.rb +3 -2
- data/lib/selenium/webdriver/edge/legacy_support.rb +117 -0
- data/lib/selenium/webdriver/edge/service.rb +3 -2
- data/lib/selenium/webdriver/firefox/binary.rb +1 -0
- data/lib/selenium/webdriver/firefox/bridge.rb +2 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +2 -0
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/w3c_bridge.rb +10 -41
- data/lib/selenium/webdriver/ie/bridge.rb +1 -1
- data/lib/selenium/webdriver/ie/server.rb +36 -12
- data/lib/selenium/webdriver/phantomjs/service.rb +44 -25
- data/lib/selenium/webdriver/remote/bridge.rb +14 -33
- data/lib/selenium/webdriver/remote/capabilities.rb +8 -6
- data/lib/selenium/webdriver/remote/commands.rb +0 -5
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +68 -86
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +35 -16
- data/lib/selenium/webdriver/remote/w3c_commands.rb +1 -2
- data/lib/selenium/webdriver/safari/bridge.rb +1 -1
- data/lib/selenium/webdriver/safari/browser.rb +2 -0
- data/lib/selenium/webdriver/safari/options.rb +6 -4
- data/lib/selenium/webdriver/safari/resources/client.js +65 -51
- data/lib/selenium/webdriver/safari/server.rb +23 -2
- data/selenium-webdriver.gemspec +1 -1
- metadata +3 -2
data/CHANGES
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
2.49.1 (UNRELEASED)
|
2
|
+
===================
|
3
|
+
|
4
|
+
Ruby:
|
5
|
+
* support for SessionNotCreatedError (thanks Alexander Bayandin)
|
6
|
+
|
7
|
+
Safari:
|
8
|
+
* Limit support to OS X (issue 1186)
|
9
|
+
* support for multiple concurrent drivers
|
10
|
+
|
11
|
+
PhantomJS:
|
12
|
+
* Implement Socket locking
|
13
|
+
|
14
|
+
IE:
|
15
|
+
* support for multiple concurrent drivers
|
16
|
+
|
17
|
+
Chrome:
|
18
|
+
* prevent 404 error when shutting down Chrome service (thanks Fumiaki MATSUSHIMA)
|
19
|
+
* logging turned on by default
|
20
|
+
* support local storage capabilities
|
21
|
+
|
22
|
+
Firefox:
|
23
|
+
* support setting the location of Firefox binary to use when run locally
|
24
|
+
* add default lookup of Homebrew Cask default directory (issue 1437)
|
25
|
+
|
26
|
+
W3C Specification:
|
27
|
+
* support for using with Remote WebDriver
|
28
|
+
* implement window size command
|
29
|
+
* implement window position command
|
30
|
+
* implement element size command
|
31
|
+
* implement element position command
|
32
|
+
* implement full screen window command
|
33
|
+
* implement page source command
|
34
|
+
|
1
35
|
2.48.1 (2015-10-13)
|
2
36
|
===================
|
3
37
|
|
@@ -55,7 +55,8 @@ module Selenium
|
|
55
55
|
def driver_extensions
|
56
56
|
[
|
57
57
|
DriverExtensions::TakesScreenshot,
|
58
|
-
DriverExtensions::HasInputDevices
|
58
|
+
DriverExtensions::HasInputDevices,
|
59
|
+
DriverExtensions::HasWebStorage
|
59
60
|
]
|
60
61
|
end
|
61
62
|
|
@@ -103,7 +104,6 @@ module Selenium
|
|
103
104
|
'extensions' => data['extensions']
|
104
105
|
end
|
105
106
|
|
106
|
-
|
107
107
|
chrome_options['binary'] = Chrome.path if Chrome.path
|
108
108
|
chrome_options['nativeEvents'] = true if native_events
|
109
109
|
chrome_options['verbose'] = true if verbose
|
@@ -24,6 +24,7 @@ module Selenium
|
|
24
24
|
#
|
25
25
|
# @api private
|
26
26
|
#
|
27
|
+
|
27
28
|
class Service
|
28
29
|
START_TIMEOUT = 20
|
29
30
|
SOCKET_LOCK_TIMEOUT = 45
|
@@ -77,7 +78,7 @@ module Selenium
|
|
77
78
|
http.open_timeout = STOP_TIMEOUT / 2
|
78
79
|
http.read_timeout = STOP_TIMEOUT / 2
|
79
80
|
|
80
|
-
http.
|
81
|
+
http.get("/shutdown")
|
81
82
|
end
|
82
83
|
|
83
84
|
@process.poll_for_exit STOP_TIMEOUT
|
@@ -90,6 +91,8 @@ module Selenium
|
|
90
91
|
URI.parse "http://#{@host}:#{@port}"
|
91
92
|
end
|
92
93
|
|
94
|
+
private
|
95
|
+
|
93
96
|
def find_free_port
|
94
97
|
@port = PortProber.above @port
|
95
98
|
end
|
@@ -103,9 +106,9 @@ module Selenium
|
|
103
106
|
end
|
104
107
|
|
105
108
|
def connect_until_stable
|
106
|
-
|
109
|
+
socket_poller = SocketPoller.new @host, @port, START_TIMEOUT
|
107
110
|
|
108
|
-
unless
|
111
|
+
unless socket_poller.connected?
|
109
112
|
raise Error::WebDriverError, "unable to connect to chromedriver #{@host}:#{@port}"
|
110
113
|
end
|
111
114
|
end
|
@@ -46,14 +46,18 @@ module Selenium
|
|
46
46
|
listener = opts.delete(:listener)
|
47
47
|
|
48
48
|
bridge = case browser
|
49
|
-
when :firefox, :ff
|
49
|
+
when :firefox, :ff, :marionette
|
50
50
|
if Remote::W3CCapabilities.w3c?(opts)
|
51
51
|
Firefox::W3CBridge.new(opts)
|
52
52
|
else
|
53
53
|
Firefox::Bridge.new(opts)
|
54
54
|
end
|
55
55
|
when :remote
|
56
|
-
Remote::
|
56
|
+
if Remote::W3CCapabilities.w3c?(opts)
|
57
|
+
Remote::W3CBridge.new(opts)
|
58
|
+
else
|
59
|
+
Remote::Bridge.new(opts)
|
60
|
+
end
|
57
61
|
when :ie, :internet_explorer
|
58
62
|
IE::Bridge.new(opts)
|
59
63
|
when :chrome
|
@@ -159,7 +159,12 @@ module Selenium
|
|
159
159
|
#
|
160
160
|
|
161
161
|
class InvalidSelectorError < WebDriverError; end # 32
|
162
|
-
|
162
|
+
|
163
|
+
#
|
164
|
+
# A new session could not be created.
|
165
|
+
#
|
166
|
+
|
167
|
+
class SessionNotCreatedError < WebDriverError; end # 33
|
163
168
|
|
164
169
|
#
|
165
170
|
# Indicates that the target provided to the actions #move method is
|
@@ -202,7 +207,7 @@ module Selenium
|
|
202
207
|
IMENotAvailableError, # 30
|
203
208
|
IMEEngineActivationFailedError, # 31
|
204
209
|
InvalidSelectorError, # 32
|
205
|
-
|
210
|
+
SessionNotCreatedError, # 33
|
206
211
|
MoveTargetOutOfBoundsError # 34
|
207
212
|
]
|
208
213
|
|
@@ -22,9 +22,10 @@ module Selenium
|
|
22
22
|
module Edge
|
23
23
|
|
24
24
|
# @api private
|
25
|
-
class Bridge < Remote::
|
25
|
+
class Bridge < Remote::W3CBridge
|
26
26
|
|
27
27
|
def initialize(opts = {})
|
28
|
+
|
28
29
|
http_client = opts.delete(:http_client)
|
29
30
|
|
30
31
|
if opts.has_key?(:url)
|
@@ -76,7 +77,7 @@ module Selenium
|
|
76
77
|
private
|
77
78
|
|
78
79
|
def create_capabilities(opts)
|
79
|
-
caps = opts.delete(:desired_capabilities) { Remote::
|
80
|
+
caps = opts.delete(:desired_capabilities) { Remote::W3CCapabilities.edge }
|
80
81
|
page_load_strategy = opts.delete(:page_load_strategy) || "normal"
|
81
82
|
|
82
83
|
unless opts.empty?
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
5
|
+
# distributed with this work for additional information
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
8
|
+
# "License"); you may not use this file except in compliance
|
9
|
+
# with the License. You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
14
|
+
# software distributed under the License is distributed on an
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
16
|
+
# KIND, either express or implied. See the License for the
|
17
|
+
# specific language governing permissions and limitations
|
18
|
+
# under the License.
|
19
|
+
|
20
|
+
module Selenium
|
21
|
+
module WebDriver
|
22
|
+
module Edge
|
23
|
+
|
24
|
+
module LegacySupport
|
25
|
+
|
26
|
+
# These are commands Edge is still using from JSON Wire Protocol
|
27
|
+
%i(executeScript executeAsyncScript submitElement doubleClick mouseDown mouseUp mouseMoveTo
|
28
|
+
click sendKeysToActiveElement getWindowHandles getCurrentWindowHandle getWindowSize
|
29
|
+
setWindowSize getWindowPosition setWindowPosition maximizeWindow).each do |cmd|
|
30
|
+
jwp = Remote::Bridge::COMMANDS[cmd]
|
31
|
+
Remote::W3CBridge.command(cmd, jwp.first, jwp.last)
|
32
|
+
end
|
33
|
+
|
34
|
+
def executeScript(script, *args)
|
35
|
+
result = execute :executeScript, {}, :script => script, :args => args
|
36
|
+
unwrap_script_result result
|
37
|
+
end
|
38
|
+
|
39
|
+
def executeAsyncScript(script, *args)
|
40
|
+
result = execute :executeAsyncScript, {}, :script => script, :args => args
|
41
|
+
unwrap_script_result result
|
42
|
+
end
|
43
|
+
|
44
|
+
def submitElement(element)
|
45
|
+
execute :submitElement, :id => element
|
46
|
+
end
|
47
|
+
|
48
|
+
def doubleClick
|
49
|
+
execute :doubleClick
|
50
|
+
end
|
51
|
+
|
52
|
+
def click
|
53
|
+
execute :click, {}, :button => 0
|
54
|
+
end
|
55
|
+
|
56
|
+
def contextClick
|
57
|
+
execute :click, {}, :button => 2
|
58
|
+
end
|
59
|
+
|
60
|
+
def mouseDown
|
61
|
+
execute :mouseDown
|
62
|
+
end
|
63
|
+
|
64
|
+
def mouseUp
|
65
|
+
execute :mouseUp
|
66
|
+
end
|
67
|
+
|
68
|
+
def mouseMoveTo(element, x = nil, y = nil)
|
69
|
+
params = { :element => element }
|
70
|
+
|
71
|
+
if x && y
|
72
|
+
params.merge! :xoffset => x, :yoffset => y
|
73
|
+
end
|
74
|
+
|
75
|
+
execute :mouseMoveTo, {}, params
|
76
|
+
end
|
77
|
+
|
78
|
+
def sendKeysToActiveElement(key)
|
79
|
+
execute :sendKeysToActiveElement, {}, :value => key
|
80
|
+
end
|
81
|
+
|
82
|
+
def getCurrentWindowHandle
|
83
|
+
execute :getCurrentWindowHandle
|
84
|
+
end
|
85
|
+
|
86
|
+
def getWindowSize(handle = :current)
|
87
|
+
data = execute :getWindowSize, :window_handle => handle
|
88
|
+
|
89
|
+
Dimension.new data['width'], data['height']
|
90
|
+
end
|
91
|
+
|
92
|
+
def setWindowSize(width, height, handle = :current)
|
93
|
+
execute :setWindowSize, {:window_handle => handle},
|
94
|
+
:width => width,
|
95
|
+
:height => height
|
96
|
+
end
|
97
|
+
|
98
|
+
def getWindowPosition(handle = :current)
|
99
|
+
data = execute :getWindowPosition, :window_handle => handle
|
100
|
+
|
101
|
+
Point.new data['x'], data['y']
|
102
|
+
end
|
103
|
+
|
104
|
+
def setWindowPosition(x, y, handle = :current)
|
105
|
+
execute :setWindowPosition, {:window_handle => handle},
|
106
|
+
:x => x, :y => y
|
107
|
+
end
|
108
|
+
|
109
|
+
def maximizeWindow(handle = :current)
|
110
|
+
execute :maximizeWindow, :window_handle => handle
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end # LegacySupport
|
115
|
+
end # Edge
|
116
|
+
end # WebDriver
|
117
|
+
end # Selenium
|
@@ -24,6 +24,7 @@ module Selenium
|
|
24
24
|
#
|
25
25
|
# @api private
|
26
26
|
#
|
27
|
+
|
27
28
|
class Service
|
28
29
|
START_TIMEOUT = 20
|
29
30
|
SOCKET_LOCK_TIMEOUT = 45
|
@@ -103,9 +104,9 @@ module Selenium
|
|
103
104
|
end
|
104
105
|
|
105
106
|
def connect_until_stable
|
106
|
-
|
107
|
+
socket_poller = SocketPoller.new @host, @port, START_TIMEOUT
|
107
108
|
|
108
|
-
unless
|
109
|
+
unless socket_poller.connected?
|
109
110
|
raise Error::WebDriverError, "unable to connect to MicrosoftWebDriver #{@host}:#{@port}"
|
110
111
|
end
|
111
112
|
end
|
@@ -170,6 +170,7 @@ module Selenium
|
|
170
170
|
|
171
171
|
def macosx_path
|
172
172
|
path = "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
|
173
|
+
path = "~/Applications/Firefox.app/Contents/MacOS/firefox-bin" unless File.exist?(path)
|
173
174
|
path = Platform.find_binary("firefox-bin") unless File.exist?(path)
|
174
175
|
|
175
176
|
path
|
@@ -61,12 +61,14 @@
|
|
61
61
|
"browser.newtabpage.enabled": false,
|
62
62
|
"browser.startup.page": 0,
|
63
63
|
"browser.startup.homepage": "about:blank",
|
64
|
+
"browser.usedOnWindows10.introURL": "about:blank",
|
64
65
|
"dom.max_chrome_script_run_time": 30,
|
65
66
|
"dom.max_script_run_time": 30,
|
66
67
|
"dom.report_all_js_exceptions": true,
|
67
68
|
"javascript.options.showInConsole": true,
|
68
69
|
"network.http.max-connections-per-server": 10,
|
69
70
|
"startup.homepage_welcome_url": "about:blank",
|
71
|
+
"startup.homepage_welcome_url.additional": "about:blank",
|
70
72
|
"webdriver_accept_untrusted_certs": true,
|
71
73
|
"webdriver_assume_untrusted_issuer": true
|
72
74
|
}
|
Binary file
|
@@ -25,31 +25,14 @@ module Selenium
|
|
25
25
|
class W3CBridge < Remote::W3CBridge
|
26
26
|
|
27
27
|
def initialize(opts = {})
|
28
|
-
|
28
|
+
caps = opts[:desired_capabilities] ||= Remote::W3CCapabilities.firefox
|
29
|
+
Binary.path = caps[:firefox_binary] if caps[:firefox_binary]
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
@service = Service.default_service(*extract_service_args(opts))
|
31
|
+
@service = Service.default_service(*extract_service_args(opts))
|
32
|
+
@service.start
|
33
|
+
opts[:url] = @service.uri
|
34
34
|
|
35
|
-
|
36
|
-
@service.instance_variable_set("@host", 'localhost')
|
37
|
-
end
|
38
|
-
|
39
|
-
@service.start
|
40
|
-
|
41
|
-
url = @service.uri
|
42
|
-
end
|
43
|
-
|
44
|
-
caps = create_capabilities(opts)
|
45
|
-
|
46
|
-
remote_opts = {
|
47
|
-
:url => url,
|
48
|
-
:desired_capabilities => caps
|
49
|
-
}
|
50
|
-
|
51
|
-
remote_opts.merge!(:http_client => http_client) if http_client
|
52
|
-
super(remote_opts)
|
35
|
+
super
|
53
36
|
end
|
54
37
|
|
55
38
|
def browser
|
@@ -59,7 +42,8 @@ module Selenium
|
|
59
42
|
def driver_extensions
|
60
43
|
[
|
61
44
|
DriverExtensions::TakesScreenshot,
|
62
|
-
DriverExtensions::HasInputDevices
|
45
|
+
DriverExtensions::HasInputDevices,
|
46
|
+
DriverExtensions::HasWebStorage
|
63
47
|
]
|
64
48
|
end
|
65
49
|
|
@@ -71,24 +55,9 @@ module Selenium
|
|
71
55
|
|
72
56
|
private
|
73
57
|
|
74
|
-
def create_capabilities(opts)
|
75
|
-
caps = opts.delete(:desired_capabilities) { Remote::W3CCapabilities.firefox }
|
76
|
-
|
77
|
-
unless opts.empty?
|
78
|
-
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
79
|
-
end
|
80
|
-
|
81
|
-
caps
|
82
|
-
end
|
83
|
-
|
84
58
|
def extract_service_args(opts)
|
85
|
-
|
86
|
-
|
87
|
-
if opts.has_key?(:service_log_path)
|
88
|
-
args << "--log-path=#{opts.delete(:service_log_path)}"
|
89
|
-
end
|
90
|
-
|
91
|
-
args
|
59
|
+
service_log_path = opts.delete(:service_log_path)
|
60
|
+
service_log_path ? ["--log-path=#{service_log_path}"] : []
|
92
61
|
end
|
93
62
|
|
94
63
|
end # W3CBridge
|