selenium-webdriver 4.0.0.alpha1 → 4.0.0.alpha6

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 (137) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +139 -1
  3. data/LICENSE +1 -1
  4. data/lib/selenium/server.rb +3 -3
  5. data/lib/selenium/webdriver.rb +11 -7
  6. data/lib/selenium/webdriver/atoms/findElements.js +122 -0
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +84 -7
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +75 -77
  9. data/lib/selenium/webdriver/chrome.rb +10 -9
  10. data/lib/selenium/webdriver/chrome/bridge.rb +20 -4
  11. data/lib/selenium/webdriver/chrome/driver.rb +3 -52
  12. data/lib/selenium/webdriver/chrome/options.rb +97 -57
  13. data/lib/selenium/webdriver/chrome/profile.rb +2 -2
  14. data/lib/selenium/webdriver/chrome/service.rb +0 -4
  15. data/lib/selenium/webdriver/common.rb +3 -0
  16. data/lib/selenium/webdriver/common/driver.rb +76 -17
  17. data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_devtools.rb} +10 -8
  18. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -1
  19. data/lib/selenium/webdriver/common/logger.rb +48 -16
  20. data/lib/selenium/webdriver/common/manager.rb +5 -0
  21. data/lib/selenium/webdriver/common/options.rb +60 -121
  22. data/lib/selenium/webdriver/common/platform.rb +3 -0
  23. data/lib/selenium/webdriver/common/port_prober.rb +4 -6
  24. data/lib/selenium/webdriver/common/profile_helper.rb +10 -2
  25. data/lib/selenium/webdriver/common/proxy.rb +0 -0
  26. data/lib/selenium/webdriver/common/search_context.rb +3 -2
  27. data/lib/selenium/webdriver/common/service.rb +30 -113
  28. data/lib/selenium/webdriver/common/service_manager.rb +151 -0
  29. data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
  30. data/lib/selenium/webdriver/common/wait.rb +1 -1
  31. data/lib/selenium/webdriver/devtools.rb +118 -0
  32. data/lib/selenium/webdriver/devtools/accessibility.rb +62 -0
  33. data/lib/selenium/webdriver/devtools/animation.rb +98 -0
  34. data/lib/selenium/webdriver/devtools/application_cache.rb +64 -0
  35. data/lib/selenium/webdriver/devtools/audits.rb +61 -0
  36. data/lib/selenium/webdriver/devtools/background_service.rb +67 -0
  37. data/lib/selenium/webdriver/devtools/browser.rb +123 -0
  38. data/lib/selenium/webdriver/devtools/cache_storage.rb +73 -0
  39. data/lib/selenium/webdriver/devtools/cast.rb +70 -0
  40. data/lib/selenium/webdriver/devtools/console.rb +57 -0
  41. data/lib/selenium/webdriver/devtools/css.rb +165 -0
  42. data/lib/selenium/webdriver/devtools/database.rb +64 -0
  43. data/lib/selenium/webdriver/devtools/debugger.rb +229 -0
  44. data/lib/selenium/webdriver/devtools/device_orientation.rb +53 -0
  45. data/lib/selenium/webdriver/devtools/dom.rb +320 -0
  46. data/lib/selenium/webdriver/devtools/domdebugger.rb +93 -0
  47. data/lib/selenium/webdriver/devtools/domsnapshot.rb +65 -0
  48. data/lib/selenium/webdriver/devtools/domstorage.rb +79 -0
  49. data/lib/selenium/webdriver/devtools/emulation.rb +180 -0
  50. data/lib/selenium/webdriver/devtools/fetch.rb +97 -0
  51. data/lib/selenium/webdriver/devtools/headless_experimental.rb +61 -0
  52. data/lib/selenium/webdriver/devtools/heap_profiler.rb +107 -0
  53. data/lib/selenium/webdriver/devtools/indexed_db.rb +100 -0
  54. data/lib/selenium/webdriver/devtools/input.rb +140 -0
  55. data/lib/selenium/webdriver/devtools/inspector.rb +55 -0
  56. data/lib/selenium/webdriver/devtools/io.rb +59 -0
  57. data/lib/selenium/webdriver/devtools/layer_tree.rb +95 -0
  58. data/lib/selenium/webdriver/devtools/log.rb +66 -0
  59. data/lib/selenium/webdriver/devtools/media.rb +57 -0
  60. data/lib/selenium/webdriver/devtools/memory.rb +86 -0
  61. data/lib/selenium/webdriver/devtools/network.rb +228 -0
  62. data/lib/selenium/webdriver/devtools/overlay.rb +157 -0
  63. data/lib/selenium/webdriver/devtools/page.rb +374 -0
  64. data/lib/selenium/webdriver/devtools/performance.rb +63 -0
  65. data/lib/selenium/webdriver/devtools/profiler.rb +111 -0
  66. data/lib/selenium/webdriver/devtools/runtime.rb +193 -0
  67. data/lib/selenium/webdriver/devtools/schema.rb +46 -0
  68. data/lib/selenium/webdriver/devtools/security.rb +71 -0
  69. data/lib/selenium/webdriver/devtools/service_worker.rb +116 -0
  70. data/lib/selenium/webdriver/devtools/storage.rb +95 -0
  71. data/lib/selenium/webdriver/devtools/system_info.rb +50 -0
  72. data/lib/selenium/webdriver/devtools/target.rb +141 -0
  73. data/lib/selenium/webdriver/devtools/tethering.rb +55 -0
  74. data/lib/selenium/webdriver/devtools/tracing.rb +76 -0
  75. data/lib/selenium/webdriver/devtools/web_audio.rb +70 -0
  76. data/lib/selenium/webdriver/devtools/web_authn.rb +94 -0
  77. data/lib/selenium/webdriver/edge.rb +29 -9
  78. data/lib/selenium/webdriver/{firefox/util.rb → edge_chrome/bridge.rb} +11 -20
  79. data/lib/selenium/webdriver/{common/w3c_options.rb → edge_chrome/driver.rb} +14 -17
  80. data/lib/selenium/webdriver/edge_chrome/options.rb +36 -0
  81. data/lib/selenium/webdriver/edge_chrome/profile.rb +33 -0
  82. data/lib/selenium/webdriver/edge_chrome/service.rb +36 -0
  83. data/lib/selenium/webdriver/{common/w3c_manager.rb → edge_html/driver.rb} +11 -17
  84. data/lib/selenium/webdriver/{edge → edge_html}/options.rb +26 -22
  85. data/lib/selenium/webdriver/{edge → edge_html}/service.rb +2 -6
  86. data/lib/selenium/webdriver/firefox.rb +18 -15
  87. data/lib/selenium/webdriver/firefox/bridge.rb +1 -1
  88. data/lib/selenium/webdriver/firefox/driver.rb +2 -30
  89. data/lib/selenium/webdriver/firefox/extension.rb +8 -0
  90. data/lib/selenium/webdriver/firefox/options.rb +47 -52
  91. data/lib/selenium/webdriver/firefox/profile.rb +7 -78
  92. data/lib/selenium/webdriver/firefox/service.rb +0 -4
  93. data/lib/selenium/webdriver/ie.rb +8 -7
  94. data/lib/selenium/webdriver/ie/driver.rb +0 -32
  95. data/lib/selenium/webdriver/ie/options.rb +10 -33
  96. data/lib/selenium/webdriver/ie/service.rb +5 -9
  97. data/lib/selenium/webdriver/remote.rb +16 -10
  98. data/lib/selenium/webdriver/remote/bridge.rb +34 -42
  99. data/lib/selenium/webdriver/remote/capabilities.rb +22 -6
  100. data/lib/selenium/webdriver/remote/driver.rb +6 -12
  101. data/lib/selenium/webdriver/remote/http/default.rb +9 -4
  102. data/lib/selenium/webdriver/remote/http/persistent.rb +5 -6
  103. data/lib/selenium/webdriver/safari.rb +9 -8
  104. data/lib/selenium/webdriver/safari/bridge.rb +4 -4
  105. data/lib/selenium/webdriver/safari/driver.rb +3 -29
  106. data/lib/selenium/webdriver/safari/options.rb +18 -19
  107. data/lib/selenium/webdriver/safari/service.rb +0 -4
  108. data/lib/selenium/webdriver/support.rb +1 -0
  109. data/lib/selenium/webdriver/support/cdp_client_generator.rb +77 -0
  110. data/lib/selenium/webdriver/support/color.rb +2 -2
  111. data/lib/selenium/webdriver/support/event_firing_bridge.rb +1 -1
  112. data/lib/selenium/webdriver/support/relative_locator.rb +51 -0
  113. data/lib/selenium/webdriver/version.rb +1 -1
  114. data/selenium-webdriver.gemspec +5 -4
  115. metadata +81 -42
  116. data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
  117. data/lib/selenium/webdriver/common/keyboard.rb +0 -70
  118. data/lib/selenium/webdriver/common/mouse.rb +0 -89
  119. data/lib/selenium/webdriver/common/touch_action_builder.rb +0 -78
  120. data/lib/selenium/webdriver/common/touch_screen.rb +0 -123
  121. data/lib/selenium/webdriver/common/w3c_action_builder.rb +0 -212
  122. data/lib/selenium/webdriver/edge/bridge.rb +0 -76
  123. data/lib/selenium/webdriver/edge/driver.rb +0 -70
  124. data/lib/selenium/webdriver/firefox/binary.rb +0 -110
  125. data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
  126. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  127. data/lib/selenium/webdriver/firefox/launcher.rb +0 -111
  128. data/lib/selenium/webdriver/firefox/legacy/driver.rb +0 -83
  129. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +0 -49
  130. data/lib/selenium/webdriver/firefox/marionette/driver.rb +0 -90
  131. data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
  132. data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
  133. data/lib/selenium/webdriver/remote/oss/bridge.rb +0 -594
  134. data/lib/selenium/webdriver/remote/oss/commands.rb +0 -223
  135. data/lib/selenium/webdriver/remote/w3c/bridge.rb +0 -605
  136. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +0 -310
  137. data/lib/selenium/webdriver/remote/w3c/commands.rb +0 -157
@@ -0,0 +1,36 @@
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 'selenium/webdriver/chrome/service'
21
+
22
+ module Selenium
23
+ module WebDriver
24
+ module EdgeChrome
25
+ class Service < Selenium::WebDriver::Chrome::Service
26
+ DEFAULT_PORT = 9515
27
+ EXECUTABLE = 'msedgedriver'
28
+ MISSING_TEXT = <<~ERROR
29
+ Unable to find msedgedriver. Please download the server from
30
+ https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ and place it somewhere on your PATH.
31
+ ERROR
32
+ SHUTDOWN_SUPPORTED = true
33
+ end # Service
34
+ end # EdgeChrome
35
+ end # WebDriver
36
+ end # Selenium
@@ -19,27 +19,21 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- class W3CManager < Manager
22
+ module EdgeHtml
23
23
 
24
24
  #
25
- # Get the cookie with the given name
26
- #
27
- # @param [String] name the name of the cookie
28
- # @return [Hash, nil] the cookie, or nil if it wasn't found.
29
- #
30
-
31
- def cookie_named(name)
32
- convert_cookie(@bridge.cookie(name))
33
- end
34
-
35
- #
36
- # Delete all cookies
25
+ # Driver implementation for Microsoft Edge.
26
+ # @api private
37
27
  #
38
28
 
39
- def delete_all_cookies
40
- @bridge.delete_all_cookies
41
- end
29
+ class Driver < WebDriver::Driver
30
+ include DriverExtensions::HasWebStorage
31
+ include DriverExtensions::TakesScreenshot
42
32
 
43
- end # WC3Options
33
+ def browser
34
+ :edge
35
+ end
36
+ end # Driver
37
+ end # EdgeHtml
44
38
  end # WebDriver
45
39
  end # Selenium
@@ -19,10 +19,23 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Edge
23
- class Options
24
- attr_accessor :in_private, :start_page
25
- attr_reader :extension_paths
22
+ module EdgeHtml
23
+ class Options < WebDriver::Options
24
+ # see https://docs.microsoft.com/en-us/microsoft-edge/webdriver#capabilities
25
+ CAPABILITIES = {in_private: 'ms:inPrivate',
26
+ extension_paths: 'ms:extensionPaths',
27
+ start_page: 'ms:startPage'}.freeze
28
+ BROWSER = 'MicrosoftEdge'
29
+
30
+ CAPABILITIES.each_key do |key|
31
+ define_method key do
32
+ @options[key]
33
+ end
34
+
35
+ define_method "#{key}=" do |value|
36
+ @options[key] = value
37
+ end
38
+ end
26
39
 
27
40
  #
28
41
  # Create a new Options instance for Edge.
@@ -40,9 +53,8 @@ module Selenium
40
53
  #
41
54
 
42
55
  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)
56
+ super(**opts)
57
+ @options[:extensions]&.each(&method(:validate_extension))
46
58
  end
47
59
 
48
60
  #
@@ -56,25 +68,17 @@ module Selenium
56
68
  #
57
69
 
58
70
  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
71
+ validate_extension(path)
72
+ @options[:extension_paths] ||= []
73
+ @options[:extension_paths] << path
62
74
  end
63
75
 
64
- #
65
- # @api private
66
- #
67
-
68
- def as_json(*)
69
- opts = {}
76
+ private
70
77
 
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
78
+ def validate_extension(path)
79
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
76
80
  end
77
81
  end # Options
78
- end # Edge
82
+ end # EdgeHtml
79
83
  end # WebDriver
80
84
  end # Selenium
@@ -19,11 +19,7 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Edge
23
- #
24
- # @api private
25
- #
26
-
22
+ module EdgeHtml
27
23
  class Service < WebDriver::Service
28
24
  DEFAULT_PORT = 17556
29
25
  EXECUTABLE = 'MicrosoftWebDriver'
@@ -46,6 +42,6 @@ module Selenium
46
42
  driver_args
47
43
  end
48
44
  end # Service
49
- end # Edge
45
+ end # EdgeHtml
50
46
  end # WebDriver
51
47
  end # Service
@@ -21,19 +21,17 @@ require 'timeout'
21
21
  require 'socket'
22
22
  require 'rexml/document'
23
23
 
24
- require 'selenium/webdriver/firefox/driver'
25
-
26
- require 'selenium/webdriver/firefox/extension'
27
- require 'selenium/webdriver/firefox/binary'
28
- require 'selenium/webdriver/firefox/profiles_ini'
29
- require 'selenium/webdriver/firefox/profile'
30
- require 'selenium/webdriver/firefox/bridge'
31
- require 'selenium/webdriver/firefox/driver'
32
- require 'selenium/webdriver/firefox/options'
33
-
34
24
  module Selenium
35
25
  module WebDriver
36
26
  module Firefox
27
+ autoload :Extension, 'selenium/webdriver/firefox/extension'
28
+ autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
29
+ autoload :Profile, 'selenium/webdriver/firefox/profile'
30
+ autoload :Bridge, 'selenium/webdriver/firefox/bridge'
31
+ autoload :Driver, 'selenium/webdriver/firefox/driver'
32
+ autoload :Options, 'selenium/webdriver/firefox/options'
33
+ autoload :Service, 'selenium/webdriver/firefox/service'
34
+
37
35
  DEFAULT_PORT = 7055
38
36
  DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
39
37
  DEFAULT_SECURE_SSL = false
@@ -42,21 +40,26 @@ module Selenium
42
40
 
43
41
  def self.driver_path=(path)
44
42
  WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
45
- 'Selenium::WebDriver::Firefox::Service#driver_path='
43
+ 'Selenium::WebDriver::Firefox::Service#driver_path=',
44
+ id: :driver_path
46
45
  Selenium::WebDriver::Firefox::Service.driver_path = path
47
46
  end
48
47
 
49
48
  def self.driver_path
50
49
  WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path',
51
- 'Selenium::WebDriver::Firefox::Service#driver_path'
50
+ 'Selenium::WebDriver::Firefox::Service#driver_path',
51
+ id: :driver_path
52
52
  Selenium::WebDriver::Firefox::Service.driver_path
53
53
  end
54
54
 
55
55
  def self.path=(path)
56
- Binary.path = path
56
+ Platform.assert_executable path
57
+ @path = path
58
+ end
59
+
60
+ def self.path
61
+ @path ||= nil
57
62
  end
58
63
  end # Firefox
59
64
  end # WebDriver
60
65
  end # Selenium
61
-
62
- require 'selenium/webdriver/firefox/service'
@@ -20,7 +20,7 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Firefox
23
- module Bridge
23
+ class Bridge < WebDriver::Remote::Bridge
24
24
 
25
25
  COMMANDS = {
26
26
  install_addon: [:post, 'session/:session_id/moz/addon/install'],
@@ -31,40 +31,12 @@ module Selenium
31
31
  include DriverExtensions::HasWebStorage
32
32
  include DriverExtensions::TakesScreenshot
33
33
 
34
- def initialize(opts = {})
35
- opts[:desired_capabilities] = create_capabilities(opts)
36
-
37
- opts[:url] ||= service_url(opts)
38
-
39
- listener = opts.delete(:listener)
40
- desired_capabilities = opts.delete(:desired_capabilities)
41
-
42
- @bridge = Remote::Bridge.new(opts)
43
- @bridge.extend Bridge
44
- @bridge.create_session(desired_capabilities)
45
-
46
- super(@bridge, listener: listener)
47
- end
48
-
49
34
  def browser
50
35
  :firefox
51
36
  end
52
37
 
53
- def quit
54
- super
55
- ensure
56
- @service&.stop
57
- end
58
-
59
- private
60
-
61
- def create_capabilities(opts)
62
- caps = opts.delete(:desired_capabilities) { Remote::Capabilities.firefox }
63
- options = opts.delete(:options) { Options.new }
64
- options = options.as_json
65
- caps.merge!(options) unless options.empty?
66
-
67
- caps
38
+ def bridge_class
39
+ Bridge
68
40
  end
69
41
  end # Driver
70
42
  end # Firefox
@@ -87,6 +87,14 @@ module Selenium
87
87
  return unless File.exist?(manifest_path)
88
88
 
89
89
  manifest = JSON.parse(File.read(manifest_path))
90
+ applications_gecko_id(manifest) || name_and_version(manifest)
91
+ end
92
+
93
+ def applications_gecko_id(manifest)
94
+ manifest.dig('applications', 'gecko', 'id')&.strip
95
+ end
96
+
97
+ def name_and_version(manifest)
90
98
  [manifest['name'].delete(' '), manifest['version']].join('@')
91
99
  end
92
100
  end # Extension
@@ -20,12 +20,27 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Firefox
23
- class Options
24
- attr_reader :args, :prefs, :options, :profile
25
- attr_accessor :binary, :log_level
26
-
23
+ class Options < WebDriver::Options
27
24
  KEY = 'moz:firefoxOptions'
28
25
 
26
+ # see: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
27
+ CAPABILITIES = {binary: 'binary',
28
+ args: 'args',
29
+ profile: 'profile',
30
+ log: 'log',
31
+ prefs: 'prefs'}.freeze
32
+ BROWSER = 'firefox'
33
+
34
+ CAPABILITIES.each_key do |key|
35
+ define_method key do
36
+ @options[key]
37
+ end
38
+
39
+ define_method "#{key}=" do |value|
40
+ @options[key] = value
41
+ end
42
+ end
43
+
29
44
  #
30
45
  # Create a new Options instance, only for W3C-capable versions of Firefox.
31
46
  #
@@ -42,13 +57,11 @@ module Selenium
42
57
  # @option opts [Hash] :options A hash for raw options
43
58
  #
44
59
 
45
- def initialize(**opts)
46
- @args = Set.new(opts.delete(:args) || [])
47
- @binary = opts.delete(:binary)
48
- @profile = process_profile(opts.delete(:profile))
49
- @log_level = opts.delete(:log_level)
50
- @prefs = opts.delete(:prefs) || {}
51
- @options = opts.delete(:options) || {}
60
+ def initialize(log_level: nil, **opts)
61
+ super(**opts)
62
+
63
+ @options[:log] ||= {level: log_level} if log_level
64
+ process_profile(@options[:profile]) if @options.key?(:profile)
52
65
  end
53
66
 
54
67
  #
@@ -62,22 +75,8 @@ module Selenium
62
75
  #
63
76
 
64
77
  def add_argument(arg)
65
- @args << arg
66
- end
67
-
68
- #
69
- # Add a new option not yet handled by these bindings.
70
- #
71
- # @example
72
- # options = Selenium::WebDriver::Firefox::Options.new
73
- # options.add_option(:foo, 'bar')
74
- #
75
- # @param [String, Symbol] name Name of the option
76
- # @param [Boolean, String, Integer] value Value of the option
77
- #
78
-
79
- def add_option(name, value)
80
- @options[name] = value
78
+ @options[:args] ||= []
79
+ @options[:args] << arg
81
80
  end
82
81
 
83
82
  #
@@ -92,7 +91,8 @@ module Selenium
92
91
  #
93
92
 
94
93
  def add_preference(name, value)
95
- prefs[name] = value
94
+ @options[:prefs] ||= {}
95
+ @options[:prefs][name] = value
96
96
  end
97
97
 
98
98
  #
@@ -122,39 +122,34 @@ module Selenium
122
122
  # @param [Profile, String] profile Profile to be used
123
123
  #
124
124
 
125
+ undef profile=
125
126
  def profile=(profile)
126
- @profile = process_profile(profile)
127
+ process_profile(profile)
127
128
  end
128
129
 
129
- #
130
- # @api private
131
- #
132
-
133
- def as_json(*)
134
- opts = @options
135
-
136
- opts[:profile] = @profile.encoded if @profile
137
- opts[:args] = @args.to_a if @args.any?
138
- opts[:binary] = @binary if @binary
139
- opts[:prefs] = @prefs unless @prefs.empty?
140
- opts[:log] = {level: @log_level} if @log_level
130
+ def log_level
131
+ @options.dig(:log, :level)
132
+ end
141
133
 
142
- {KEY => opts}
134
+ def log_level=(level)
135
+ @options[:log] = {level: level}
143
136
  end
144
137
 
145
138
  private
146
139
 
140
+ def process_browser_options(browser_options)
141
+ options = browser_options[KEY]
142
+ options['binary'] ||= Firefox.path if Firefox.path
143
+ end
144
+
147
145
  def process_profile(profile)
148
- return unless profile
149
-
150
- case profile
151
- when Profile
152
- profile
153
- when String
154
- Profile.from_name(profile)
155
- else
156
- raise Error::WebDriverError, "don't know how to handle profile: #{profile.inspect}"
157
- end
146
+ @options[:profile] = if profile.nil?
147
+ nil
148
+ elsif profile.is_a? Profile
149
+ profile
150
+ else
151
+ Profile.from_name(profile)
152
+ end
158
153
  end
159
154
  end # Options
160
155
  end # Firefox
@@ -23,18 +23,10 @@ module Selenium
23
23
  class Profile
24
24
  include ProfileHelper
25
25
 
26
- VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
27
- WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
28
- WEBDRIVER_PREFS = {
29
- native_events: 'webdriver_enable_native_events',
30
- untrusted_certs: 'webdriver_accept_untrusted_certs',
31
- untrusted_issuer: 'webdriver_assume_untrusted_issuer',
32
- port: 'webdriver_firefox_port',
33
- log_file: 'webdriver.log.file'
34
- }.freeze
26
+ VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
35
27
 
36
28
  attr_reader :name, :log_file
37
- attr_writer :secure_ssl, :native_events, :load_no_focus_lib
29
+ attr_writer :secure_ssl, :load_no_focus_lib
38
30
 
39
31
  class << self
40
32
  def ini
@@ -48,10 +40,8 @@ module Selenium
48
40
  raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
49
41
  end
50
42
 
51
- def default_preferences
52
- @default_preferences ||= JSON.parse(
53
- File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
54
- ).freeze
43
+ def decoded(json)
44
+ JSON.parse(json)
55
45
  end
56
46
  end
57
47
 
@@ -70,14 +60,7 @@ module Selenium
70
60
  def initialize(model = nil)
71
61
  @model = verify_model(model)
72
62
 
73
- model_prefs = read_model_prefs
74
-
75
- if model_prefs.empty?
76
- assign_default_preferences
77
- else
78
- assign_updated_preferences(model_prefs)
79
- end
80
-
63
+ @additional_prefs = read_model_prefs
81
64
  @extensions = {}
82
65
  end
83
66
 
@@ -121,12 +104,6 @@ module Selenium
121
104
  self[WEBDRIVER_PREFS[:log_file]] = file
122
105
  end
123
106
 
124
- def add_webdriver_extension
125
- return if @extensions.key?(:webdriver)
126
-
127
- add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
128
- end
129
-
130
107
  #
131
108
  # Add the extension (directory, .zip or .xpi) at the given path to the profile.
132
109
  #
@@ -135,26 +112,6 @@ module Selenium
135
112
  @extensions[name] = Extension.new(path)
136
113
  end
137
114
 
138
- def native_events?
139
- @native_events == true
140
- end
141
-
142
- def load_no_focus_lib?
143
- @load_no_focus_lib == true
144
- end
145
-
146
- def secure_ssl?
147
- @secure_ssl == true
148
- end
149
-
150
- def assume_untrusted_certificate_issuer?
151
- @untrusted_issuer == true
152
- end
153
-
154
- def assume_untrusted_certificate_issuer=(bool)
155
- @untrusted_issuer = bool
156
- end
157
-
158
115
  def proxy=(proxy)
159
116
  raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy
160
117
 
@@ -178,30 +135,10 @@ module Selenium
178
135
  end
179
136
  end
180
137
 
181
- def encoded
182
- Zipper.zip(layout_on_disk)
183
- end
138
+ alias_method :as_json, :encoded
184
139
 
185
140
  private
186
141
 
187
- def assign_default_preferences
188
- @native_events = DEFAULT_ENABLE_NATIVE_EVENTS
189
- @secure_ssl = DEFAULT_SECURE_SSL
190
- @untrusted_issuer = DEFAULT_ASSUME_UNTRUSTED_ISSUER
191
- @load_no_focus_lib = DEFAULT_LOAD_NO_FOCUS_LIB
192
-
193
- @additional_prefs = {}
194
- end
195
-
196
- def assign_updated_preferences(model_prefs)
197
- @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
198
- @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
199
- @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
200
- # not stored in profile atm, so will always be false.
201
- @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
202
- @additional_prefs = model_prefs
203
- end
204
-
205
142
  def set_manual_proxy_preference(key, value)
206
143
  return unless value
207
144
 
@@ -242,15 +179,7 @@ module Selenium
242
179
 
243
180
  def update_user_prefs_in(directory)
244
181
  path = File.join(directory, 'user.js')
245
- prefs = read_user_prefs(path)
246
-
247
- prefs.merge! self.class.default_preferences.fetch 'mutable'
248
- prefs.merge! @additional_prefs
249
- prefs.merge! self.class.default_preferences.fetch 'frozen'
250
-
251
- prefs[WEBDRIVER_PREFS[:untrusted_certs]] = !secure_ssl?
252
- prefs[WEBDRIVER_PREFS[:native_events]] = native_events?
253
- prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
182
+ prefs = read_user_prefs(path).merge(@additional_prefs)
254
183
 
255
184
  # If the user sets the home page, we should also start up there
256
185
  prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']