selenium-webdriver 4.0.0.alpha1 → 4.0.0.alpha6

Sign up to get free protection for your applications and to get access to all the features.
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']