selenium-webdriver 2.45.0 → 3.142.7

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.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
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
+ module Bridge
24
+
25
+ def commands(command)
26
+ unsupported = %i[execute_script execute_async_script submit_element double_click
27
+ mouse_down mouse_up mouse_move_to click
28
+ send_keys_to_active_element get_window_handles get_current_window_handle
29
+ get_window_size set_window_size get_window_position set_window_position
30
+ maximize_window get_alert_text accept_alert dismiss_alert]
31
+ if unsupported.include? command
32
+ Remote::OSS::Bridge::COMMANDS[command]
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ def send_keys_to_active_element(key)
39
+ execute :send_keys_to_active_element, {}, {value: key}
40
+ end
41
+
42
+ def window_handle
43
+ execute :get_current_window_handle
44
+ end
45
+
46
+ def window_size(handle = :current)
47
+ data = execute :get_window_size, window_handle: handle
48
+
49
+ Dimension.new data['width'], data['height']
50
+ end
51
+
52
+ def resize_window(width, height, handle = :current)
53
+ execute :set_window_size, {window_handle: handle},
54
+ {width: width,
55
+ height: height}
56
+ end
57
+
58
+ def window_position(handle = :current)
59
+ data = execute :get_window_position, window_handle: handle
60
+
61
+ Point.new data['x'], data['y']
62
+ end
63
+
64
+ def reposition_window(x, y, handle = :current)
65
+ execute :set_window_position, {window_handle: handle},
66
+ {x: x, y: y}
67
+ end
68
+
69
+ def maximize_window(handle = :current)
70
+ execute :maximize_window, window_handle: handle
71
+ end
72
+
73
+ end # Bridge
74
+ end # Edge
75
+ end # WebDriver
76
+ end # Selenium
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
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
+ #
25
+ # Driver implementation for Microsoft Edge.
26
+ # @api private
27
+ #
28
+
29
+ class Driver < WebDriver::Driver
30
+ include DriverExtensions::TakesScreenshot
31
+
32
+ def initialize(opts = {})
33
+ opts[:desired_capabilities] ||= Remote::Capabilities.edge
34
+
35
+ opts[:url] ||= service_url(opts)
36
+
37
+ listener = opts.delete(:listener)
38
+
39
+ # Edge is mostly using W3C dialect, but a request to
40
+ # create session responds with OSS-like body,
41
+ # so we need to force W3C implementation.
42
+ desired_capabilities = opts.delete(:desired_capabilities)
43
+ bridge = Remote::Bridge.new(opts)
44
+ capabilities = bridge.create_session(desired_capabilities)
45
+
46
+ WebDriver.logger.info 'Forcing W3C dialect.'
47
+ @bridge = Remote::W3C::Bridge.new(capabilities, bridge.session_id, **opts)
48
+ @bridge.extend Edge::Bridge
49
+
50
+ super(@bridge, listener: listener)
51
+ end
52
+
53
+ def browser
54
+ :edge
55
+ end
56
+
57
+ def quit
58
+ super
59
+ ensure
60
+ @service&.stop
61
+ end
62
+
63
+ end # Driver
64
+ end # Edge
65
+ end # WebDriver
66
+ end # Selenium
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
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
+ class Options
24
+ attr_accessor :in_private, :start_page
25
+ attr_reader :extension_paths
26
+
27
+ #
28
+ # Create a new Options instance for Edge.
29
+ #
30
+ # @example
31
+ # options = Selenium::WebDriver::Edge::Options.new(in_private: true)
32
+ # driver = Selenium::WebDriver.for :edge, options: options
33
+ #
34
+ # @param [Hash] opts the pre-defined options to create the Edge::Options with
35
+ # @option opts [Boolean] :in_private Start in private mode. Default is false
36
+ # @option opts [Array<String>] :extension_paths A list of full paths to extensions to install on startup
37
+ # @option opts [String] :start_page Default page to start with
38
+ #
39
+ # @see https://docs.microsoft.com/en-us/microsoft-edge/webdriver
40
+ #
41
+
42
+ def initialize(**opts)
43
+ @in_private = opts.delete(:in_private) || false
44
+ @extension_paths = opts.delete(:extension_paths) || []
45
+ @start_page = opts.delete(:start_page)
46
+ end
47
+
48
+ #
49
+ # Add an extension by local path.
50
+ #
51
+ # @example
52
+ # options = Selenium::WebDriver::Edge::Options.new
53
+ # options.add_extension_path('C:\path\to\extension')
54
+ #
55
+ # @param [String] path The local path to the extension folder
56
+ #
57
+
58
+ def add_extension_path(path)
59
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
60
+
61
+ @extension_paths << path
62
+ end
63
+
64
+ #
65
+ # @api private
66
+ #
67
+
68
+ def as_json(*)
69
+ opts = {}
70
+
71
+ opts['ms:inPrivate'] = true if @in_private
72
+ opts['ms:extensionPaths'] = @extension_paths if @extension_paths.any?
73
+ opts['ms:startPage'] = @start_page if @start_page
74
+
75
+ opts
76
+ end
77
+ end # Options
78
+ end # Edge
79
+ end # WebDriver
80
+ end # Selenium
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
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
+ # @api private
25
+ #
26
+
27
+ class Service < WebDriver::Service
28
+ @default_port = 17556
29
+ @executable = 'MicrosoftWebDriver'
30
+ @missing_text = <<~ERROR
31
+ Unable to find MicrosoftWebDriver. Please download the server from
32
+ https://www.microsoft.com/en-us/download/details.aspx?id=48212 and place it somewhere on your PATH.
33
+ More info at https://github.com/SeleniumHQ/selenium/wiki/MicrosoftWebDriver.
34
+ ERROR
35
+ @shutdown_supported = true
36
+
37
+ private
38
+
39
+ # Note: This processing is deprecated
40
+ def extract_service_args(driver_opts)
41
+ driver_args = super
42
+ driver_opts = driver_opts.dup
43
+ driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key? :host
44
+ driver_args << "--package=#{driver_opts[:package]}" if driver_opts.key? :package
45
+ driver_args << "--silent" if driver_opts[:silent] == true
46
+ driver_args << "--verbose" if driver_opts[:verbose] == true
47
+ driver_args
48
+ end
49
+ end # Service
50
+ end # Edge
51
+ end # WebDriver
52
+ end # Service
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
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
+ require 'net/http'
21
+
22
+ require 'selenium/webdriver/edge/bridge'
23
+ require 'selenium/webdriver/edge/driver'
24
+ require 'selenium/webdriver/edge/options'
25
+
26
+ module Selenium
27
+ module WebDriver
28
+ module Edge
29
+ def self.driver_path=(path)
30
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Edge#driver_path=',
31
+ 'Selenium::WebDriver::Edge::Service#driver_path='
32
+ Selenium::WebDriver::Edge::Service.driver_path = path
33
+ end
34
+
35
+ def self.driver_path
36
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Edge#driver_path',
37
+ 'Selenium::WebDriver::Edge::Service#driver_path'
38
+ Selenium::WebDriver::Edge::Service.driver_path
39
+ end
40
+ end # Edge
41
+ end # WebDriver
42
+ end # Selenium
43
+
44
+ require 'selenium/webdriver/edge/service'
@@ -1,42 +1,59 @@
1
+ # frozen_string_literal: true
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Firefox
4
-
5
23
  # @api private
6
24
  class Binary
7
-
8
- NO_FOCUS_LIBRARY_NAME = "x_ignore_nofocus.so"
9
- NO_FOCUS_LIBRARIES = [
10
- ["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/amd64/#{NO_FOCUS_LIBRARY_NAME}", "amd64/#{NO_FOCUS_LIBRARY_NAME}"],
11
- ["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/x86/#{NO_FOCUS_LIBRARY_NAME}", "x86/#{NO_FOCUS_LIBRARY_NAME}"],
12
- ]
25
+ NO_FOCUS_LIBRARY_NAME = 'x_ignore_nofocus.so'
26
+ NO_FOCUS_LIBRARIES = [
27
+ ["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/amd64/#{NO_FOCUS_LIBRARY_NAME}",
28
+ "amd64/#{NO_FOCUS_LIBRARY_NAME}"],
29
+ ["#{WebDriver.root}/selenium/webdriver/firefox/native/linux/x86/#{NO_FOCUS_LIBRARY_NAME}",
30
+ "x86/#{NO_FOCUS_LIBRARY_NAME}"]
31
+ ].freeze
13
32
 
14
33
  WAIT_TIMEOUT = 90
15
34
  QUIT_TIMEOUT = 5
16
35
 
17
36
  def start_with(profile, profile_path, *args)
18
37
  if Platform.cygwin?
19
- profile_path = Platform.cygwin_path(profile_path, :windows => true)
38
+ profile_path = Platform.cygwin_path(profile_path, windows: true)
20
39
  elsif Platform.windows?
21
- profile_path = profile_path.gsub("/", "\\")
40
+ profile_path = Platform.windows_path(profile_path)
22
41
  end
23
42
 
24
- ENV['XRE_CONSOLE_LOG'] = profile.log_file if profile.log_file
25
- ENV['XRE_PROFILE_PATH'] = profile_path
26
- ENV['MOZ_NO_REMOTE'] = '1' # able to launch multiple instances
43
+ ENV['XRE_CONSOLE_LOG'] = profile.log_file if profile.log_file
44
+ ENV['XRE_PROFILE_PATH'] = profile_path
45
+ ENV['MOZ_NO_REMOTE'] = '1' # able to launch multiple instances
27
46
  ENV['MOZ_CRASHREPORTER_DISABLE'] = '1' # disable breakpad
28
- ENV['NO_EM_RESTART'] = '1' # prevent the binary from detaching from the console
47
+ ENV['NO_EM_RESTART'] = '1' # prevent the binary from detaching from the console
29
48
 
30
- if Platform.linux? && (profile.native_events? || profile.load_no_focus_lib?)
31
- modify_link_library_path profile_path
32
- end
49
+ modify_link_library_path profile_path if Platform.linux? && (profile.native_events? || profile.load_no_focus_lib?)
33
50
 
34
51
  execute(*args)
35
- cope_with_mac_strangeness(args) if Platform.mac?
36
52
  end
37
53
 
38
54
  def quit
39
55
  return unless @process
56
+
40
57
  @process.poll_for_exit QUIT_TIMEOUT
41
58
  rescue ChildProcess::TimeoutError
42
59
  # ok, force quit
@@ -57,26 +74,12 @@ module Selenium
57
74
  private
58
75
 
59
76
  def execute(*extra_args)
60
- args = [self.class.path, "-no-remote"] + extra_args
77
+ args = [self.class.path, '-no-remote'] + extra_args
61
78
  @process = ChildProcess.build(*args)
62
- @process.io.inherit! if $DEBUG
63
- @process.start
64
- end
65
-
66
- def cope_with_mac_strangeness(args)
67
- sleep 0.3
68
-
69
- if @process.crashed?
70
- # ok, trying a restart
71
- sleep 7
72
- execute(*args)
73
- end
79
+ WebDriver.logger.debug("Executing Process #{args}")
74
80
 
75
- # ensure we're ok
76
- sleep 0.3
77
- if @process.crashed?
78
- raise Error::WebDriverError, "unable to start Firefox cleanly, args: #{args.inspect}"
79
- end
81
+ @process.io.stdout = @process.io.stderr = WebDriver.logger.io if WebDriver.logger.debug?
82
+ @process.start
80
83
  end
81
84
 
82
85
  def modify_link_library_path(profile_path)
@@ -93,11 +96,10 @@ module Selenium
93
96
  paths += ENV['LD_LIBRARY_PATH'].to_s.split(File::PATH_SEPARATOR)
94
97
 
95
98
  ENV['LD_LIBRARY_PATH'] = paths.uniq.join(File::PATH_SEPARATOR)
96
- ENV['LD_PRELOAD'] = NO_FOCUS_LIBRARY_NAME
99
+ ENV['LD_PRELOAD'] = NO_FOCUS_LIBRARY_NAME
97
100
  end
98
101
 
99
102
  class << self
100
-
101
103
  #
102
104
  # @api private
103
105
  #
@@ -109,6 +111,10 @@ module Selenium
109
111
  @path = path
110
112
  end
111
113
 
114
+ def reset_path!
115
+ @path = nil
116
+ end
117
+
112
118
  def path
113
119
  @path ||= case Platform.os
114
120
  when :macosx
@@ -116,29 +122,47 @@ module Selenium
116
122
  when :windows
117
123
  windows_path
118
124
  when :linux, :unix
119
- Platform.find_binary("firefox3", "firefox2", "firefox") || "/usr/bin/firefox"
125
+ Platform.find_binary('firefox3', 'firefox2', 'firefox') || '/usr/bin/firefox'
120
126
  else
121
127
  raise Error::WebDriverError, "unknown platform: #{Platform.os}"
122
128
  end
123
129
 
124
- @path = Platform.cygwin_path(@path) if Platform.cygwin?
130
+ @path = Platform.cygwin_path(@path, windows: true) if Platform.cygwin?
125
131
 
126
132
  unless File.file?(@path.to_s)
127
- raise Error::WebDriverError, "Could not find Firefox binary (os=#{Platform.os}). Make sure Firefox is installed or set the path manually with #{self}.path="
133
+ error = "Could not find Firefox binary (os=#{Platform.os}). " \
134
+ "Make sure Firefox is installed or set the path manually with #{self}.path="
135
+ raise Error::WebDriverError, error
128
136
  end
129
137
 
130
138
  @path
131
139
  end
132
140
 
141
+ def version
142
+ @version = case Platform.os
143
+ when :macosx
144
+ `#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i
145
+ when :windows
146
+ `\"#{path}\" -v | more`.strip[/[^\s]*$/][/^\d+/].to_i
147
+ when :linux
148
+ `#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i
149
+ else
150
+ 0
151
+ end
152
+ end
153
+
133
154
  private
134
155
 
135
156
  def windows_path
136
- windows_registry_path || Platform.find_in_program_files("\\Mozilla Firefox\\firefox.exe") || Platform.find_binary("firefox")
157
+ windows_registry_path ||
158
+ Platform.find_in_program_files('\\Mozilla Firefox\\firefox.exe') ||
159
+ Platform.find_binary('firefox')
137
160
  end
138
161
 
139
162
  def macosx_path
140
- path = "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
141
- path = Platform.find_binary("firefox-bin") unless File.exist?(path)
163
+ path = '/Applications/Firefox.app/Contents/MacOS/firefox-bin'
164
+ path = File.expand_path('~/Applications/Firefox.app/Contents/MacOS/firefox-bin') unless File.exist?(path)
165
+ path = Platform.find_binary('firefox-bin') unless File.exist?(path)
142
166
 
143
167
  path
144
168
  end
@@ -147,18 +171,16 @@ module Selenium
147
171
  require 'win32/registry'
148
172
 
149
173
  lm = Win32::Registry::HKEY_LOCAL_MACHINE
150
- lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
174
+ lm.open('SOFTWARE\\Mozilla\\Mozilla Firefox') do |reg|
151
175
  main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
152
- if entry = main.find { |key, type, data| key =~ /pathtoexe/i }
153
- return entry.last
154
- end
176
+ entry = main.find { |key, _type, _data| key =~ /pathtoexe/i }
177
+ return entry.last if entry
155
178
  end
156
179
  rescue LoadError
157
180
  # older JRuby or IronRuby does not have win32/registry
158
181
  rescue Win32::Registry::Error
159
182
  end
160
183
  end # class << self
161
-
162
184
  end # Binary
163
185
  end # Firefox
164
186
  end # WebDriver
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
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 Firefox
23
+ module Driver
24
+ class << self
25
+
26
+ #
27
+ # Instantiates correct Firefox driver implementation
28
+ # @return [Marionette::Driver, Legacy::Driver]
29
+ #
30
+
31
+ def new(**opts)
32
+ if marionette?(opts)
33
+ Firefox::Marionette::Driver.new(opts)
34
+ else
35
+ Firefox::Legacy::Driver.new(opts)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def marionette?(opts)
42
+ opts.delete(:marionette) != false &&
43
+ (!opts[:desired_capabilities] || opts[:desired_capabilities][:marionette] != false)
44
+ end
45
+ end
46
+
47
+ end # Driver
48
+ end # Firefox
49
+ end # WebDriver
50
+ end # Selenium
@@ -2,15 +2,18 @@
2
2
  "frozen": {
3
3
  "app.update.auto": false,
4
4
  "app.update.enabled": false,
5
+ "browser.displayedE10SNotice": 4,
5
6
  "browser.download.manager.showWhenStarting": false,
6
7
  "browser.EULA.override": true,
7
8
  "browser.EULA.3.accepted": true,
8
9
  "browser.link.open_external": 2,
9
10
  "browser.link.open_newwindow": 2,
10
11
  "browser.offline": false,
12
+ "browser.reader.detectedFirstArticle": true,
11
13
  "browser.safebrowsing.enabled": false,
12
14
  "browser.safebrowsing.malware.enabled": false,
13
15
  "browser.search.update": false,
16
+ "browser.selfsupport.url" : "",
14
17
  "browser.sessionstore.resume_from_crash": false,
15
18
  "browser.shell.checkDefaultBrowser": false,
16
19
  "browser.tabs.warnOnClose": false,
@@ -25,43 +28,41 @@
25
28
  "dom.disable_open_during_load": false,
26
29
  "extensions.autoDisableScopes": 10,
27
30
  "extensions.blocklist.enabled": false,
28
- "extensions.logging.enabled": true,
31
+ "extensions.checkCompatibility.nightly": false,
29
32
  "extensions.update.enabled": false,
30
33
  "extensions.update.notifyUser": false,
34
+ "javascript.enabled": true,
31
35
  "network.manage-offline-status": false,
32
36
  "network.http.phishy-userpass-length": 255,
33
37
  "offline-apps.allow_by_default": true,
34
38
  "prompts.tab_modal.enabled": false,
35
- "security.csp.enable": false,
36
39
  "security.fileuri.origin_policy": 3,
37
40
  "security.fileuri.strict_origin_policy": false,
38
- "security.warn_entering_secure": false,
39
- "security.warn_entering_secure.show_once": false,
40
- "security.warn_entering_weak": false,
41
- "security.warn_entering_weak.show_once": false,
42
- "security.warn_leaving_secure": false,
43
- "security.warn_leaving_secure.show_once": false,
44
- "security.warn_submit_insecure": false,
45
- "security.warn_viewing_mixed": false,
46
- "security.warn_viewing_mixed.show_once": false,
47
41
  "signon.rememberSignons": false,
48
42
  "toolkit.networkmanager.disable": true,
49
43
  "toolkit.telemetry.prompted": 2,
50
44
  "toolkit.telemetry.enabled": false,
51
- "toolkit.telemetry.rejected": true
45
+ "toolkit.telemetry.rejected": true,
46
+ "xpinstall.signatures.required": false,
47
+ "xpinstall.whitelist.required": false
52
48
  },
53
49
  "mutable": {
54
50
  "browser.dom.window.dump.enabled": true,
51
+ "browser.laterrun.enabled": false,
55
52
  "browser.newtab.url": "about:blank",
56
53
  "browser.newtabpage.enabled": false,
57
54
  "browser.startup.page": 0,
58
55
  "browser.startup.homepage": "about:blank",
56
+ "browser.startup.homepage_override.mstone": "ignore",
57
+ "browser.usedOnWindows10.introURL": "about:blank",
59
58
  "dom.max_chrome_script_run_time": 30,
60
59
  "dom.max_script_run_time": 30,
61
60
  "dom.report_all_js_exceptions": true,
62
61
  "javascript.options.showInConsole": true,
63
- "network.http.max-connections-per-server": 10,
62
+ "network.captive-portal-service.enabled": false,
63
+ "security.csp.enable": false,
64
64
  "startup.homepage_welcome_url": "about:blank",
65
+ "startup.homepage_welcome_url.additional": "about:blank",
65
66
  "webdriver_accept_untrusted_certs": true,
66
67
  "webdriver_assume_untrusted_issuer": true
67
68
  }