selenium-webdriver 2.53.4 → 3.8.0
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.
- checksums.yaml +7 -0
- data/CHANGES +363 -10
- data/LICENSE +1 -1
- data/README.md +2 -3
- data/lib/selenium-webdriver.rb +0 -2
- data/lib/selenium/server.rb +69 -70
- data/lib/selenium/webdriver.rb +32 -23
- data/lib/selenium/webdriver/atoms.rb +18 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
- data/lib/selenium/webdriver/chrome.rb +8 -6
- data/lib/selenium/webdriver/chrome/driver.rb +112 -0
- data/lib/selenium/webdriver/chrome/options.rb +168 -0
- data/lib/selenium/webdriver/chrome/profile.rb +17 -17
- data/lib/selenium/webdriver/chrome/service.rb +22 -89
- data/lib/selenium/webdriver/common.rb +13 -6
- data/lib/selenium/webdriver/common/action_builder.rb +49 -57
- data/lib/selenium/webdriver/common/alert.rb +5 -15
- data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
- data/lib/selenium/webdriver/common/driver.rb +53 -68
- data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
- data/lib/selenium/webdriver/common/element.rb +57 -39
- data/lib/selenium/webdriver/common/error.rb +204 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
- data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
- data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
- data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
- data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
- data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
- data/lib/selenium/webdriver/common/keyboard.rb +7 -14
- data/lib/selenium/webdriver/common/keys.rb +99 -82
- data/lib/selenium/webdriver/common/log_entry.rb +3 -6
- data/lib/selenium/webdriver/common/logger.rb +140 -0
- data/lib/selenium/webdriver/common/logs.rb +2 -6
- data/lib/selenium/webdriver/common/mouse.rb +9 -14
- data/lib/selenium/webdriver/common/navigation.rb +2 -6
- data/lib/selenium/webdriver/common/options.rb +20 -23
- data/lib/selenium/webdriver/common/platform.rb +70 -97
- data/lib/selenium/webdriver/common/port_prober.rb +3 -4
- data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
- data/lib/selenium/webdriver/common/proxy.rb +58 -72
- data/lib/selenium/webdriver/common/search_context.rb +22 -29
- data/lib/selenium/webdriver/common/service.rb +161 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
- data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
- data/lib/selenium/webdriver/common/target_locator.rb +11 -15
- data/lib/selenium/webdriver/common/timeouts.rb +4 -8
- data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
- data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
- data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
- data/lib/selenium/webdriver/common/wait.rb +6 -13
- data/lib/selenium/webdriver/common/window.rb +48 -17
- data/lib/selenium/webdriver/common/zipper.rb +6 -10
- data/lib/selenium/webdriver/edge.rb +5 -12
- data/lib/selenium/webdriver/edge/bridge.rb +32 -63
- data/lib/selenium/webdriver/edge/driver.rb +73 -0
- data/lib/selenium/webdriver/edge/service.rb +18 -87
- data/lib/selenium/webdriver/firefox.rb +20 -11
- data/lib/selenium/webdriver/firefox/binary.rb +40 -56
- data/lib/selenium/webdriver/firefox/driver.rb +48 -0
- data/lib/selenium/webdriver/firefox/extension.rb +18 -8
- data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
- data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
- data/lib/selenium/webdriver/firefox/options.rb +149 -0
- data/lib/selenium/webdriver/firefox/profile.rb +46 -46
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
- data/lib/selenium/webdriver/firefox/service.rb +23 -83
- data/lib/selenium/webdriver/firefox/util.rb +0 -4
- data/lib/selenium/webdriver/ie.rb +4 -8
- data/lib/selenium/webdriver/ie/driver.rb +90 -0
- data/lib/selenium/webdriver/ie/options.rb +136 -0
- data/lib/selenium/webdriver/ie/service.rb +58 -0
- data/lib/selenium/webdriver/remote.rb +8 -16
- data/lib/selenium/webdriver/remote/bridge.rb +96 -565
- data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
- data/lib/selenium/webdriver/remote/driver.rb +49 -0
- data/lib/selenium/webdriver/remote/http/common.rb +22 -20
- data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
- data/lib/selenium/webdriver/remote/http/default.rb +54 -41
- data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
- data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
- data/lib/selenium/webdriver/remote/response.rb +39 -27
- data/lib/selenium/webdriver/remote/server_error.rb +1 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
- data/lib/selenium/webdriver/safari.rb +20 -29
- data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
- data/lib/selenium/webdriver/safari/service.rb +57 -0
- data/lib/selenium/webdriver/support.rb +1 -2
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
- data/lib/selenium/webdriver/support/color.rb +57 -42
- data/lib/selenium/webdriver/support/escaper.rb +41 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
- data/lib/selenium/webdriver/support/select.rb +33 -86
- data/selenium-webdriver.gemspec +22 -25
- metadata +254 -261
- data/lib/selenium-client.rb +0 -21
- data/lib/selenium/client.rb +0 -57
- data/lib/selenium/client/base.rb +0 -151
- data/lib/selenium/client/driver.rb +0 -29
- data/lib/selenium/client/errors.rb +0 -28
- data/lib/selenium/client/extensions.rb +0 -132
- data/lib/selenium/client/idiomatic.rb +0 -507
- data/lib/selenium/client/javascript_expression_builder.rb +0 -135
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
- data/lib/selenium/client/legacy_driver.rb +0 -1722
- data/lib/selenium/client/protocol.rb +0 -123
- data/lib/selenium/client/selenium_helper.rb +0 -49
- data/lib/selenium/rake/server_task.rb +0 -176
- data/lib/selenium/webdriver/android/bridge.rb +0 -68
- data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
- data/lib/selenium/webdriver/common/html5/location.rb +0 -19
- data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
- data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
- data/lib/selenium/webdriver/ie/bridge.rb +0 -88
- data/lib/selenium/webdriver/ie/server.rb +0 -133
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
- data/lib/selenium/webdriver/remote/commands.rb +0 -211
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
- data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
- data/lib/selenium/webdriver/safari/bridge.rb +0 -135
- data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
- data/lib/selenium/webdriver/safari/server.rb +0 -187
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Selenium
|
|
19
|
+
module WebDriver
|
|
20
|
+
module Edge
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Driver implementation for Microsoft Edge.
|
|
24
|
+
# @api private
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
class Driver < WebDriver::Driver
|
|
28
|
+
include DriverExtensions::TakesScreenshot
|
|
29
|
+
|
|
30
|
+
def initialize(opts = {})
|
|
31
|
+
opts[:desired_capabilities] ||= Remote::W3C::Capabilities.edge
|
|
32
|
+
|
|
33
|
+
unless opts.key?(:url)
|
|
34
|
+
driver_path = opts.delete(:driver_path) || Edge.driver_path
|
|
35
|
+
driver_opts = opts.delete(:driver_opts) || {}
|
|
36
|
+
port = opts.delete(:port) || Service::DEFAULT_PORT
|
|
37
|
+
|
|
38
|
+
@service = Service.new(driver_path, port, driver_opts)
|
|
39
|
+
@service.host = 'localhost' if @service.host == '127.0.0.1'
|
|
40
|
+
@service.start
|
|
41
|
+
opts[:url] = @service.uri
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
listener = opts.delete(:listener)
|
|
45
|
+
|
|
46
|
+
# Edge is mostly using W3C dialect, but a request to
|
|
47
|
+
# create session responds with OSS-like body,
|
|
48
|
+
# so we need to force W3C implementation.
|
|
49
|
+
desired_capabilities = opts.delete(:desired_capabilities)
|
|
50
|
+
bridge = Remote::Bridge.new(opts)
|
|
51
|
+
capabilities = bridge.create_session(desired_capabilities)
|
|
52
|
+
|
|
53
|
+
WebDriver.logger.info 'Forcing W3C dialect.'
|
|
54
|
+
@bridge = Remote::W3C::Bridge.new(capabilities, bridge.session_id, opts)
|
|
55
|
+
@bridge.extend Edge::Bridge
|
|
56
|
+
|
|
57
|
+
super(@bridge, listener: listener)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def browser
|
|
61
|
+
:edge
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def quit
|
|
65
|
+
super
|
|
66
|
+
ensure
|
|
67
|
+
@service.stop if @service
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end # Driver
|
|
71
|
+
end # Edge
|
|
72
|
+
end # WebDriver
|
|
73
|
+
end # Selenium
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,104 +18,37 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Edge
|
|
23
|
-
|
|
24
21
|
#
|
|
25
22
|
# @api private
|
|
26
23
|
#
|
|
27
24
|
|
|
28
|
-
class Service
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@executable_path ||= (
|
|
37
|
-
path = Platform.find_binary "MicrosoftWebDriver"
|
|
38
|
-
path or raise Error::WebDriverError, MISSING_TEXT
|
|
39
|
-
Platform.assert_executable path
|
|
40
|
-
|
|
41
|
-
path
|
|
42
|
-
)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def self.executable_path=(path)
|
|
46
|
-
Platform.assert_executable path
|
|
47
|
-
@executable_path = path
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def self.default_service(*extra_args)
|
|
51
|
-
new executable_path, DEFAULT_PORT, *extra_args
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def initialize(executable_path, port, *extra_args)
|
|
55
|
-
@executable_path = executable_path
|
|
56
|
-
@host = Platform.localhost
|
|
57
|
-
@port = Integer(port)
|
|
58
|
-
|
|
59
|
-
raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
|
|
60
|
-
|
|
61
|
-
@extra_args = extra_args
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def start
|
|
65
|
-
Platform.exit_hook { stop } # make sure we don't leave the server running
|
|
25
|
+
class Service < WebDriver::Service
|
|
26
|
+
DEFAULT_PORT = 17556
|
|
27
|
+
@executable = 'MicrosoftWebDriver'.freeze
|
|
28
|
+
@missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
|
|
29
|
+
Unable to find MicrosoftWebDriver. Please download the server from
|
|
30
|
+
https://www.microsoft.com/en-us/download/details.aspx?id=48212 and place it somewhere on your PATH.
|
|
31
|
+
More info at https://github.com/SeleniumHQ/selenium/wiki/MicrosoftWebDriver.
|
|
32
|
+
ERROR
|
|
66
33
|
|
|
67
|
-
|
|
68
|
-
find_free_port
|
|
69
|
-
start_process
|
|
70
|
-
connect_until_stable
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def stop
|
|
75
|
-
return if @process.nil? || @process.exited?
|
|
76
|
-
|
|
77
|
-
Net::HTTP.start(@host, @port) do |http|
|
|
78
|
-
http.open_timeout = STOP_TIMEOUT / 2
|
|
79
|
-
http.read_timeout = STOP_TIMEOUT / 2
|
|
80
|
-
|
|
81
|
-
http.head("/shutdown")
|
|
82
|
-
end
|
|
83
|
-
ensure
|
|
84
|
-
stop_process
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def uri
|
|
88
|
-
URI.parse "http://#{@host}:#{@port}"
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def find_free_port
|
|
92
|
-
@port = PortProber.above @port
|
|
93
|
-
end
|
|
34
|
+
private
|
|
94
35
|
|
|
95
36
|
def start_process
|
|
96
|
-
|
|
97
|
-
@process = ChildProcess.build(*server_command)
|
|
98
|
-
|
|
99
|
-
@process.io.inherit! if $DEBUG == true
|
|
37
|
+
@process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
|
|
100
38
|
@process.start
|
|
101
39
|
end
|
|
102
40
|
|
|
103
|
-
def
|
|
104
|
-
@
|
|
105
|
-
rescue ChildProcess::TimeoutError
|
|
106
|
-
@process.stop STOP_TIMEOUT
|
|
41
|
+
def cannot_connect_error_text
|
|
42
|
+
"unable to connect to MicrosoftWebDriver #{@host}:#{@port}"
|
|
107
43
|
end
|
|
108
44
|
|
|
109
|
-
def
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
45
|
+
def extract_service_args(driver_opts)
|
|
46
|
+
driver_args = super
|
|
47
|
+
driver_args << "–host=#{driver_opts[:host]}" if driver_opts.key? :host
|
|
48
|
+
driver_args << "–package=#{driver_opts[:package]}" if driver_opts.key? :package
|
|
49
|
+
driver_args << "-verbose" if driver_opts[:verbose] == true
|
|
50
|
+
driver_args
|
|
115
51
|
end
|
|
116
|
-
|
|
117
|
-
def socket_lock
|
|
118
|
-
@socket_lock ||= SocketLock.new(@port - 1, SOCKET_LOCK_TIMEOUT)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
52
|
end # Service
|
|
122
53
|
end # Edge
|
|
123
54
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -21,31 +19,42 @@ require 'timeout'
|
|
|
21
19
|
require 'socket'
|
|
22
20
|
require 'rexml/document'
|
|
23
21
|
|
|
22
|
+
require 'selenium/webdriver/firefox/driver'
|
|
23
|
+
|
|
24
24
|
require 'selenium/webdriver/firefox/util'
|
|
25
25
|
require 'selenium/webdriver/firefox/extension'
|
|
26
26
|
require 'selenium/webdriver/firefox/binary'
|
|
27
27
|
require 'selenium/webdriver/firefox/profiles_ini'
|
|
28
28
|
require 'selenium/webdriver/firefox/profile'
|
|
29
29
|
require 'selenium/webdriver/firefox/launcher'
|
|
30
|
-
require 'selenium/webdriver/firefox/
|
|
31
|
-
|
|
32
|
-
require 'selenium/webdriver/firefox/
|
|
30
|
+
require 'selenium/webdriver/firefox/legacy/driver'
|
|
31
|
+
|
|
32
|
+
require 'selenium/webdriver/firefox/marionette/bridge'
|
|
33
|
+
require 'selenium/webdriver/firefox/marionette/driver'
|
|
34
|
+
require 'selenium/webdriver/firefox/options'
|
|
33
35
|
require 'selenium/webdriver/firefox/service'
|
|
34
36
|
|
|
35
37
|
module Selenium
|
|
36
38
|
module WebDriver
|
|
37
39
|
module Firefox
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
DEFAULT_SECURE_SSL = false
|
|
40
|
+
DEFAULT_PORT = 7055
|
|
41
|
+
DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
|
|
42
|
+
DEFAULT_SECURE_SSL = false
|
|
42
43
|
DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
|
|
43
|
-
DEFAULT_LOAD_NO_FOCUS_LIB
|
|
44
|
+
DEFAULT_LOAD_NO_FOCUS_LIB = false
|
|
45
|
+
|
|
46
|
+
def self.driver_path=(path)
|
|
47
|
+
Platform.assert_executable path
|
|
48
|
+
@driver_path = path
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.driver_path
|
|
52
|
+
@driver_path ||= nil
|
|
53
|
+
end
|
|
44
54
|
|
|
45
55
|
def self.path=(path)
|
|
46
56
|
Binary.path = path
|
|
47
57
|
end
|
|
48
|
-
|
|
49
58
|
end # Firefox
|
|
50
59
|
end # WebDriver
|
|
51
60
|
end # Selenium
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,38 +18,37 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Firefox
|
|
23
|
-
|
|
24
21
|
# @api private
|
|
25
22
|
class Binary
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/x86/#{NO_FOCUS_LIBRARY_NAME}",
|
|
31
|
-
|
|
23
|
+
NO_FOCUS_LIBRARY_NAME = 'x_ignore_nofocus.so'.freeze
|
|
24
|
+
NO_FOCUS_LIBRARIES = [
|
|
25
|
+
["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/amd64/#{NO_FOCUS_LIBRARY_NAME}",
|
|
26
|
+
"amd64/#{NO_FOCUS_LIBRARY_NAME}"],
|
|
27
|
+
["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/x86/#{NO_FOCUS_LIBRARY_NAME}",
|
|
28
|
+
"x86/#{NO_FOCUS_LIBRARY_NAME}"]
|
|
29
|
+
].freeze
|
|
32
30
|
|
|
33
31
|
WAIT_TIMEOUT = 90
|
|
34
32
|
QUIT_TIMEOUT = 5
|
|
35
33
|
|
|
36
34
|
def start_with(profile, profile_path, *args)
|
|
37
35
|
if Platform.cygwin?
|
|
38
|
-
profile_path = Platform.cygwin_path(profile_path, :
|
|
36
|
+
profile_path = Platform.cygwin_path(profile_path, windows: true)
|
|
39
37
|
elsif Platform.windows?
|
|
40
|
-
profile_path = profile_path.
|
|
38
|
+
profile_path = profile_path.tr('/', '\\')
|
|
41
39
|
end
|
|
42
40
|
|
|
43
|
-
ENV['XRE_CONSOLE_LOG']
|
|
44
|
-
ENV['XRE_PROFILE_PATH']
|
|
45
|
-
ENV['MOZ_NO_REMOTE']
|
|
41
|
+
ENV['XRE_CONSOLE_LOG'] = profile.log_file if profile.log_file
|
|
42
|
+
ENV['XRE_PROFILE_PATH'] = profile_path
|
|
43
|
+
ENV['MOZ_NO_REMOTE'] = '1' # able to launch multiple instances
|
|
46
44
|
ENV['MOZ_CRASHREPORTER_DISABLE'] = '1' # disable breakpad
|
|
47
|
-
ENV['NO_EM_RESTART']
|
|
45
|
+
ENV['NO_EM_RESTART'] = '1' # prevent the binary from detaching from the console
|
|
48
46
|
|
|
49
47
|
if Platform.linux? && (profile.native_events? || profile.load_no_focus_lib?)
|
|
50
48
|
modify_link_library_path profile_path
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
execute(*args)
|
|
54
|
-
cope_with_mac_strangeness(args) if Platform.mac?
|
|
55
52
|
end
|
|
56
53
|
|
|
57
54
|
def quit
|
|
@@ -76,26 +73,12 @@ module Selenium
|
|
|
76
73
|
private
|
|
77
74
|
|
|
78
75
|
def execute(*extra_args)
|
|
79
|
-
args = [self.class.path,
|
|
76
|
+
args = [self.class.path, '-no-remote'] + extra_args
|
|
80
77
|
@process = ChildProcess.build(*args)
|
|
81
|
-
|
|
82
|
-
@process.start
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def cope_with_mac_strangeness(args)
|
|
86
|
-
sleep 0.3
|
|
78
|
+
WebDriver.logger.debug("Executing Process #{args}")
|
|
87
79
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
sleep 7
|
|
91
|
-
execute(*args)
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# ensure we're ok
|
|
95
|
-
sleep 0.3
|
|
96
|
-
if @process.crashed?
|
|
97
|
-
raise Error::WebDriverError, "unable to start Firefox cleanly, args: #{args.inspect}"
|
|
98
|
-
end
|
|
80
|
+
@process.io.stdout = @process.io.stderr = WebDriver.logger.io if WebDriver.logger.debug?
|
|
81
|
+
@process.start
|
|
99
82
|
end
|
|
100
83
|
|
|
101
84
|
def modify_link_library_path(profile_path)
|
|
@@ -112,11 +95,10 @@ module Selenium
|
|
|
112
95
|
paths += ENV['LD_LIBRARY_PATH'].to_s.split(File::PATH_SEPARATOR)
|
|
113
96
|
|
|
114
97
|
ENV['LD_LIBRARY_PATH'] = paths.uniq.join(File::PATH_SEPARATOR)
|
|
115
|
-
ENV['LD_PRELOAD']
|
|
98
|
+
ENV['LD_PRELOAD'] = NO_FOCUS_LIBRARY_NAME
|
|
116
99
|
end
|
|
117
100
|
|
|
118
101
|
class << self
|
|
119
|
-
|
|
120
102
|
#
|
|
121
103
|
# @api private
|
|
122
104
|
#
|
|
@@ -139,7 +121,7 @@ module Selenium
|
|
|
139
121
|
when :windows
|
|
140
122
|
windows_path
|
|
141
123
|
when :linux, :unix
|
|
142
|
-
Platform.find_binary(
|
|
124
|
+
Platform.find_binary('firefox3', 'firefox2', 'firefox') || '/usr/bin/firefox'
|
|
143
125
|
else
|
|
144
126
|
raise Error::WebDriverError, "unknown platform: #{Platform.os}"
|
|
145
127
|
end
|
|
@@ -147,7 +129,9 @@ module Selenium
|
|
|
147
129
|
@path = Platform.cygwin_path(@path) if Platform.cygwin?
|
|
148
130
|
|
|
149
131
|
unless File.file?(@path.to_s)
|
|
150
|
-
|
|
132
|
+
error = "Could not find Firefox binary (os=#{Platform.os}). "
|
|
133
|
+
error << "Make sure Firefox is installed or set the path manually with #{self}.path="
|
|
134
|
+
raise Error::WebDriverError, error
|
|
151
135
|
end
|
|
152
136
|
|
|
153
137
|
@path
|
|
@@ -155,27 +139,29 @@ module Selenium
|
|
|
155
139
|
|
|
156
140
|
def version
|
|
157
141
|
@version = case Platform.os
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
142
|
+
when :macosx
|
|
143
|
+
`#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i
|
|
144
|
+
when :windows
|
|
145
|
+
`\"#{path}\" -v | more`.strip[/[^\s]*$/][/^\d+/].to_i
|
|
146
|
+
when :linux
|
|
147
|
+
`#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i
|
|
148
|
+
else
|
|
149
|
+
0
|
|
150
|
+
end
|
|
167
151
|
end
|
|
168
152
|
|
|
169
153
|
private
|
|
170
154
|
|
|
171
155
|
def windows_path
|
|
172
|
-
windows_registry_path ||
|
|
156
|
+
windows_registry_path ||
|
|
157
|
+
Platform.find_in_program_files('\\Mozilla Firefox\\firefox.exe') ||
|
|
158
|
+
Platform.find_binary('firefox')
|
|
173
159
|
end
|
|
174
160
|
|
|
175
161
|
def macosx_path
|
|
176
|
-
path =
|
|
177
|
-
path = File.expand_path(
|
|
178
|
-
path = Platform.find_binary(
|
|
162
|
+
path = '/Applications/Firefox.app/Contents/MacOS/firefox-bin'
|
|
163
|
+
path = File.expand_path('~/Applications/Firefox.app/Contents/MacOS/firefox-bin') unless File.exist?(path)
|
|
164
|
+
path = Platform.find_binary('firefox-bin') unless File.exist?(path)
|
|
179
165
|
|
|
180
166
|
path
|
|
181
167
|
end
|
|
@@ -184,18 +170,16 @@ module Selenium
|
|
|
184
170
|
require 'win32/registry'
|
|
185
171
|
|
|
186
172
|
lm = Win32::Registry::HKEY_LOCAL_MACHINE
|
|
187
|
-
lm.open(
|
|
173
|
+
lm.open('SOFTWARE\\Mozilla\\Mozilla Firefox') do |reg|
|
|
188
174
|
main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
end
|
|
175
|
+
entry = main.find { |key, _type, _data| key =~ /pathtoexe/i }
|
|
176
|
+
return entry.last if entry
|
|
192
177
|
end
|
|
193
178
|
rescue LoadError
|
|
194
179
|
# older JRuby or IronRuby does not have win32/registry
|
|
195
180
|
rescue Win32::Registry::Error
|
|
196
181
|
end
|
|
197
182
|
end # class << self
|
|
198
|
-
|
|
199
183
|
end # Binary
|
|
200
184
|
end # Firefox
|
|
201
185
|
end # WebDriver
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Selenium
|
|
19
|
+
module WebDriver
|
|
20
|
+
module Firefox
|
|
21
|
+
module Driver
|
|
22
|
+
class << self
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Instantiates correct Firefox driver implementation
|
|
26
|
+
# @return [Marionette::Driver, Legacy::Driver]
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
def new(**opts)
|
|
30
|
+
if marionette?(opts)
|
|
31
|
+
Firefox::Marionette::Driver.new(opts)
|
|
32
|
+
else
|
|
33
|
+
Firefox::Legacy::Driver.new(opts)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def marionette?(opts)
|
|
40
|
+
opts.delete(:marionette) != false &&
|
|
41
|
+
(!opts[:desired_capabilities] || opts[:desired_capabilities][:marionette] != false)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end # Driver
|
|
46
|
+
end # Firefox
|
|
47
|
+
end # WebDriver
|
|
48
|
+
end # Selenium
|