selenium-webdriver 4.0.0.alpha6 → 4.0.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +137 -4
  3. data/Gemfile +3 -1
  4. data/LICENSE +1 -1
  5. data/NOTICE +2 -0
  6. data/README.md +4 -5
  7. data/lib/selenium/server.rb +18 -26
  8. data/lib/selenium/webdriver.rb +1 -4
  9. data/lib/selenium/webdriver/atoms/findElements.js +93 -93
  10. data/lib/selenium/webdriver/atoms/getAttribute.js +75 -59
  11. data/lib/selenium/webdriver/atoms/isDisplayed.js +72 -72
  12. data/lib/selenium/webdriver/atoms/mutationListener.js +55 -0
  13. data/lib/selenium/webdriver/chrome.rb +1 -1
  14. data/lib/selenium/webdriver/chrome/driver.rb +25 -10
  15. data/lib/selenium/webdriver/chrome/{bridge.rb → features.rb} +3 -3
  16. data/lib/selenium/webdriver/chrome/options.rb +51 -39
  17. data/lib/selenium/webdriver/chrome/profile.rb +6 -3
  18. data/lib/selenium/webdriver/chrome/service.rb +4 -2
  19. data/lib/selenium/webdriver/common.rb +8 -2
  20. data/lib/selenium/webdriver/common/driver.rb +36 -8
  21. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +43 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +89 -0
  23. data/lib/selenium/webdriver/{edge_html/driver.rb → common/driver_extensions/has_cdp.rb} +12 -13
  24. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +6 -1
  25. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -8
  26. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +149 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_logs.rb +30 -0
  28. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +6 -27
  29. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +67 -0
  30. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +1 -0
  31. data/lib/selenium/webdriver/common/driver_extensions/{rotatable.rb → prints_page.rb} +18 -20
  32. data/lib/selenium/webdriver/common/element.rb +66 -12
  33. data/lib/selenium/webdriver/common/interactions/interaction.rb +4 -1
  34. data/lib/selenium/webdriver/common/logger.rb +5 -2
  35. data/lib/selenium/webdriver/common/manager.rb +6 -1
  36. data/lib/selenium/webdriver/common/options.rb +76 -14
  37. data/lib/selenium/webdriver/common/platform.rb +3 -1
  38. data/lib/selenium/webdriver/common/proxy.rb +6 -3
  39. data/lib/selenium/webdriver/common/search_context.rb +4 -1
  40. data/lib/selenium/webdriver/common/service.rb +1 -8
  41. data/lib/selenium/webdriver/common/service_manager.rb +1 -1
  42. data/lib/selenium/webdriver/common/socket_poller.rb +19 -30
  43. data/lib/selenium/webdriver/common/takes_screenshot.rb +66 -0
  44. data/lib/selenium/webdriver/common/target_locator.rb +4 -4
  45. data/lib/selenium/webdriver/devtools.rb +44 -18
  46. data/lib/selenium/webdriver/devtools/console_event.rb +38 -0
  47. data/lib/selenium/webdriver/devtools/exception_event.rb +36 -0
  48. data/lib/selenium/webdriver/devtools/mutation_event.rb +37 -0
  49. data/lib/selenium/webdriver/devtools/{console.rb → request.rb} +22 -22
  50. data/lib/selenium/webdriver/edge.rb +7 -29
  51. data/lib/selenium/webdriver/{edge_chrome → edge}/driver.rb +8 -6
  52. data/lib/selenium/webdriver/{edge_chrome/bridge.rb → edge/features.rb} +9 -7
  53. data/lib/selenium/webdriver/{edge_chrome → edge}/options.rb +11 -4
  54. data/lib/selenium/webdriver/{edge_chrome → edge}/profile.rb +2 -2
  55. data/lib/selenium/webdriver/{edge_chrome → edge}/service.rb +2 -2
  56. data/lib/selenium/webdriver/firefox.rb +5 -1
  57. data/lib/selenium/webdriver/firefox/driver.rb +18 -5
  58. data/lib/selenium/webdriver/firefox/{bridge.rb → features.rb} +9 -4
  59. data/lib/selenium/webdriver/firefox/options.rb +20 -21
  60. data/lib/selenium/webdriver/firefox/profile.rb +12 -2
  61. data/lib/selenium/webdriver/firefox/service.rb +1 -1
  62. data/lib/selenium/webdriver/ie/driver.rb +1 -2
  63. data/lib/selenium/webdriver/ie/options.rb +1 -11
  64. data/lib/selenium/webdriver/ie/service.rb +4 -2
  65. data/lib/selenium/webdriver/remote/bridge.rb +48 -30
  66. data/lib/selenium/webdriver/remote/capabilities.rb +105 -64
  67. data/lib/selenium/webdriver/remote/commands.rb +3 -0
  68. data/lib/selenium/webdriver/remote/driver.rb +10 -3
  69. data/lib/selenium/webdriver/remote/http/common.rb +0 -5
  70. data/lib/selenium/webdriver/remote/http/default.rb +8 -7
  71. data/lib/selenium/webdriver/remote/http/persistent.rb +6 -0
  72. data/lib/selenium/webdriver/safari.rb +8 -1
  73. data/lib/selenium/webdriver/safari/driver.rb +3 -8
  74. data/lib/selenium/webdriver/safari/{bridge.rb → features.rb} +3 -3
  75. data/lib/selenium/webdriver/safari/options.rb +0 -25
  76. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
  77. data/lib/selenium/webdriver/support/cdp/domain.rb.erb +63 -0
  78. data/lib/selenium/webdriver/support/cdp_client_generator.rb +44 -13
  79. data/lib/selenium/webdriver/support/event_firing_bridge.rb +1 -1
  80. data/lib/selenium/webdriver/support/guards.rb +95 -0
  81. data/lib/selenium/webdriver/support/guards/guard.rb +89 -0
  82. data/lib/selenium/webdriver/support/guards/guard_condition.rb +52 -0
  83. data/lib/selenium/webdriver/support/select.rb +2 -2
  84. data/lib/selenium/webdriver/version.rb +1 -1
  85. data/selenium-webdriver.gemspec +26 -12
  86. metadata +91 -108
  87. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -65
  88. data/lib/selenium/webdriver/devtools/accessibility.rb +0 -62
  89. data/lib/selenium/webdriver/devtools/animation.rb +0 -98
  90. data/lib/selenium/webdriver/devtools/application_cache.rb +0 -64
  91. data/lib/selenium/webdriver/devtools/audits.rb +0 -61
  92. data/lib/selenium/webdriver/devtools/background_service.rb +0 -67
  93. data/lib/selenium/webdriver/devtools/browser.rb +0 -123
  94. data/lib/selenium/webdriver/devtools/cache_storage.rb +0 -73
  95. data/lib/selenium/webdriver/devtools/cast.rb +0 -70
  96. data/lib/selenium/webdriver/devtools/css.rb +0 -165
  97. data/lib/selenium/webdriver/devtools/database.rb +0 -64
  98. data/lib/selenium/webdriver/devtools/debugger.rb +0 -229
  99. data/lib/selenium/webdriver/devtools/device_orientation.rb +0 -53
  100. data/lib/selenium/webdriver/devtools/dom.rb +0 -320
  101. data/lib/selenium/webdriver/devtools/domdebugger.rb +0 -93
  102. data/lib/selenium/webdriver/devtools/domsnapshot.rb +0 -65
  103. data/lib/selenium/webdriver/devtools/domstorage.rb +0 -79
  104. data/lib/selenium/webdriver/devtools/emulation.rb +0 -180
  105. data/lib/selenium/webdriver/devtools/fetch.rb +0 -97
  106. data/lib/selenium/webdriver/devtools/headless_experimental.rb +0 -61
  107. data/lib/selenium/webdriver/devtools/heap_profiler.rb +0 -107
  108. data/lib/selenium/webdriver/devtools/indexed_db.rb +0 -100
  109. data/lib/selenium/webdriver/devtools/input.rb +0 -140
  110. data/lib/selenium/webdriver/devtools/inspector.rb +0 -55
  111. data/lib/selenium/webdriver/devtools/io.rb +0 -59
  112. data/lib/selenium/webdriver/devtools/layer_tree.rb +0 -95
  113. data/lib/selenium/webdriver/devtools/log.rb +0 -66
  114. data/lib/selenium/webdriver/devtools/media.rb +0 -57
  115. data/lib/selenium/webdriver/devtools/memory.rb +0 -86
  116. data/lib/selenium/webdriver/devtools/network.rb +0 -228
  117. data/lib/selenium/webdriver/devtools/overlay.rb +0 -157
  118. data/lib/selenium/webdriver/devtools/page.rb +0 -374
  119. data/lib/selenium/webdriver/devtools/performance.rb +0 -63
  120. data/lib/selenium/webdriver/devtools/profiler.rb +0 -111
  121. data/lib/selenium/webdriver/devtools/runtime.rb +0 -193
  122. data/lib/selenium/webdriver/devtools/schema.rb +0 -46
  123. data/lib/selenium/webdriver/devtools/security.rb +0 -71
  124. data/lib/selenium/webdriver/devtools/service_worker.rb +0 -116
  125. data/lib/selenium/webdriver/devtools/storage.rb +0 -95
  126. data/lib/selenium/webdriver/devtools/system_info.rb +0 -50
  127. data/lib/selenium/webdriver/devtools/target.rb +0 -141
  128. data/lib/selenium/webdriver/devtools/tethering.rb +0 -55
  129. data/lib/selenium/webdriver/devtools/tracing.rb +0 -76
  130. data/lib/selenium/webdriver/devtools/web_audio.rb +0 -70
  131. data/lib/selenium/webdriver/devtools/web_authn.rb +0 -94
  132. data/lib/selenium/webdriver/edge_html/options.rb +0 -84
  133. data/lib/selenium/webdriver/edge_html/service.rb +0 -47
@@ -17,41 +17,41 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- # This file is automatically generated. Any changes will be lost!
21
20
  module Selenium
22
21
  module WebDriver
23
22
  class DevTools
24
- def console
25
- @console ||= Console.new(self)
26
- end
23
+ class Request
27
24
 
28
- class Console
29
- EVENTS = {
30
- message_added: 'messageAdded',
31
- }
25
+ attr_reader :url, :method, :headers
32
26
 
33
- def initialize(devtools)
27
+ def initialize(devtools:, id:, url:, method:, headers:)
34
28
  @devtools = devtools
29
+ @id = id
30
+ @url = url
31
+ @method = method
32
+ @headers = headers
35
33
  end
36
34
 
37
- def on(event, &block)
38
- event = EVENTS[event] if event.is_a?(Symbol)
39
- @devtools.callbacks["Console.#{event}"] << block
35
+ def continue
36
+ @devtools.fetch.continue_request(request_id: @id)
40
37
  end
41
38
 
42
- def clear_messages
43
- @devtools.send_cmd('Console.clearMessages')
39
+ def respond(code: 200, headers: {}, body: '')
40
+ @devtools.fetch.fulfill_request(
41
+ request_id: @id,
42
+ body: Base64.strict_encode64(body),
43
+ response_code: code,
44
+ response_headers: headers.map do |k, v|
45
+ {name: k, value: v}
46
+ end
47
+ )
44
48
  end
45
49
 
46
- def disable
47
- @devtools.send_cmd('Console.disable')
50
+ def inspect
51
+ %(#<#{self.class.name} @method="#{method}" @url="#{url}")
48
52
  end
49
53
 
50
- def enable
51
- @devtools.send_cmd('Console.enable')
52
- end
53
-
54
- end # Console
54
+ end # Request
55
55
  end # DevTools
56
56
  end # WebDriver
57
- end # Selenium
57
+ end # Selenium
@@ -21,32 +21,12 @@ require 'net/http'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeHtml
25
- autoload :Driver, 'selenium/webdriver/edge_html/driver'
26
- autoload :Options, 'selenium/webdriver/edge_html/options'
27
- autoload :Service, 'selenium/webdriver/edge_html/service'
28
-
29
- def self.driver_path=(path)
30
- WebDriver.logger.deprecate 'Selenium::WebDriver::Edge#driver_path=',
31
- 'Selenium::WebDriver::Edge::Service#driver_path=',
32
- id: :driver_path
33
- Selenium::WebDriver::Edge::Service.driver_path = path
34
- end
35
-
36
- def self.driver_path
37
- WebDriver.logger.deprecate 'Selenium::WebDriver::Edge#driver_path',
38
- 'Selenium::WebDriver::Edge::Service#driver_path',
39
- id: :driver_path
40
- Selenium::WebDriver::Edge::Service.driver_path
41
- end
42
- end # EdgeHtml
43
-
44
- module EdgeChrome
45
- autoload :Bridge, 'selenium/webdriver/edge_chrome/bridge'
46
- autoload :Driver, 'selenium/webdriver/edge_chrome/driver'
47
- autoload :Profile, 'selenium/webdriver/edge_chrome/profile'
48
- autoload :Options, 'selenium/webdriver/edge_chrome/options'
49
- autoload :Service, 'selenium/webdriver/edge_chrome/service'
24
+ module Edge
25
+ autoload :Features, 'selenium/webdriver/edge/features'
26
+ autoload :Driver, 'selenium/webdriver/edge/driver'
27
+ autoload :Profile, 'selenium/webdriver/edge/profile'
28
+ autoload :Options, 'selenium/webdriver/edge/options'
29
+ autoload :Service, 'selenium/webdriver/edge/service'
50
30
 
51
31
  def self.path=(path)
52
32
  Platform.assert_executable path
@@ -56,8 +36,6 @@ module Selenium
56
36
  def self.path
57
37
  @path ||= nil
58
38
  end
59
- end # EdgeChrome
60
-
61
- Edge = EdgeHtml # Alias EdgeHtml as Edge for now
39
+ end # Edge
62
40
  end # WebDriver
63
41
  end # Selenium
@@ -21,22 +21,24 @@ require 'selenium/webdriver/chrome/driver'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeChrome
24
+ module Edge
25
25
 
26
26
  #
27
- # Driver implementation for EdgeChrome.
27
+ # Driver implementation for Microsoft Edge.
28
28
  # @api private
29
29
  #
30
30
 
31
31
  class Driver < Selenium::WebDriver::Chrome::Driver
32
32
  def browser
33
- :edge_chrome
33
+ :edge
34
34
  end
35
35
 
36
- def bridge_class
37
- Bridge
36
+ private
37
+
38
+ def devtools_address
39
+ "http://#{capabilities['ms:edgeOptions']['debuggerAddress']}"
38
40
  end
39
41
  end # Driver
40
- end # EdgeChrome
42
+ end # Edge
41
43
  end # WebDriver
42
44
  end # Selenium
@@ -17,21 +17,23 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'selenium/webdriver/chrome/bridge'
20
+ require 'selenium/webdriver/chrome/features'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeChrome
25
- class Bridge < WebDriver::Chrome::Bridge
24
+ module Edge
25
+ module Features
26
26
 
27
- COMMANDS = WebDriver::Chrome::Bridge::COMMANDS.merge(
27
+ include WebDriver::Chrome::Features
28
+
29
+ EDGE_COMMANDS = {
28
30
  send_command: [:post, 'session/:session_id/ms/cdp/execute']
29
- ).freeze
31
+ }.freeze
30
32
 
31
33
  def commands(command)
32
- COMMANDS[command] || super
34
+ EDGE_COMMANDS[command] || Chrome::Features::CHROME_COMMANDS[command] || self.class::COMMANDS[command]
33
35
  end
34
36
  end # Bridge
35
- end # EdgeChrome
37
+ end # Edge
36
38
  end # WebDriver
37
39
  end # Selenium
@@ -21,16 +21,23 @@ require 'selenium/webdriver/chrome/options'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeChrome
24
+ module Edge
25
25
  class Options < Selenium::WebDriver::Chrome::Options
26
- BROWSER = 'MSEdge'
26
+ KEY = 'ms:edgeOptions'
27
+ BROWSER = 'MicrosoftEdge'
28
+
29
+ protected
30
+
31
+ def enable_logging(browser_options)
32
+ browser_options['ms:loggingPrefs'] = @logging_prefs
33
+ end
27
34
 
28
35
  private
29
36
 
30
37
  def binary_path
31
- EdgeChrome.path
38
+ Edge.path
32
39
  end
33
40
  end # Options
34
- end # EdgeChrome
41
+ end # Edge
35
42
  end # WebDriver
36
43
  end # Selenium
@@ -21,13 +21,13 @@ require 'selenium/webdriver/chrome/profile'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeChrome
24
+ module Edge
25
25
  #
26
26
  # @private
27
27
  #
28
28
 
29
29
  class Profile < Selenium::WebDriver::Chrome::Profile
30
30
  end # Profile
31
- end # EdgeChrome
31
+ end # Edge
32
32
  end # WebDriver
33
33
  end # Selenium
@@ -21,7 +21,7 @@ require 'selenium/webdriver/chrome/service'
21
21
 
22
22
  module Selenium
23
23
  module WebDriver
24
- module EdgeChrome
24
+ module Edge
25
25
  class Service < Selenium::WebDriver::Chrome::Service
26
26
  DEFAULT_PORT = 9515
27
27
  EXECUTABLE = 'msedgedriver'
@@ -31,6 +31,6 @@ module Selenium
31
31
  ERROR
32
32
  SHUTDOWN_SUPPORTED = true
33
33
  end # Service
34
- end # EdgeChrome
34
+ end # Edge
35
35
  end # WebDriver
36
36
  end # Selenium
@@ -27,7 +27,7 @@ module Selenium
27
27
  autoload :Extension, 'selenium/webdriver/firefox/extension'
28
28
  autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
29
29
  autoload :Profile, 'selenium/webdriver/firefox/profile'
30
- autoload :Bridge, 'selenium/webdriver/firefox/bridge'
30
+ autoload :Features, 'selenium/webdriver/firefox/features'
31
31
  autoload :Driver, 'selenium/webdriver/firefox/driver'
32
32
  autoload :Options, 'selenium/webdriver/firefox/options'
33
33
  autoload :Service, 'selenium/webdriver/firefox/service'
@@ -38,6 +38,10 @@ module Selenium
38
38
  DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
39
39
  DEFAULT_LOAD_NO_FOCUS_LIB = false
40
40
 
41
+ # Mozilla Automation Team asked to only support 85
42
+ # until WebDriver Bidi is available.
43
+ DEVTOOLS_VERSION = 85
44
+
41
45
  def self.driver_path=(path)
42
46
  WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
43
47
  'Selenium::WebDriver::Firefox::Service#driver_path=',
@@ -27,16 +27,29 @@ module Selenium
27
27
  #
28
28
 
29
29
  class Driver < WebDriver::Driver
30
- include DriverExtensions::HasAddons
31
- include DriverExtensions::HasWebStorage
32
- include DriverExtensions::TakesScreenshot
30
+ EXTENSIONS = [DriverExtensions::HasAddons,
31
+ DriverExtensions::FullPageScreenshot,
32
+ DriverExtensions::HasDevTools,
33
+ DriverExtensions::HasLogEvents,
34
+ DriverExtensions::HasNetworkInterception,
35
+ DriverExtensions::HasWebStorage,
36
+ DriverExtensions::PrintsPage].freeze
33
37
 
34
38
  def browser
35
39
  :firefox
36
40
  end
37
41
 
38
- def bridge_class
39
- Bridge
42
+ private
43
+
44
+ def devtools_url
45
+ uri = URI("http://#{capabilities['moz:debuggerAddress']}")
46
+ response = Net::HTTP.get(uri.hostname, '/json/version', uri.port)
47
+
48
+ JSON.parse(response)['webSocketDebuggerUrl']
49
+ end
50
+
51
+ def devtools_version
52
+ Firefox::DEVTOOLS_VERSION
40
53
  end
41
54
  end # Driver
42
55
  end # Firefox
@@ -20,15 +20,16 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Firefox
23
- class Bridge < WebDriver::Remote::Bridge
23
+ module Features
24
24
 
25
- COMMANDS = {
25
+ FIREFOX_COMMANDS = {
26
26
  install_addon: [:post, 'session/:session_id/moz/addon/install'],
27
- uninstall_addon: [:post, 'session/:session_id/moz/addon/uninstall']
27
+ uninstall_addon: [:post, 'session/:session_id/moz/addon/uninstall'],
28
+ full_page_screenshot: [:get, 'session/:session_id/moz/screenshot/full']
28
29
  }.freeze
29
30
 
30
31
  def commands(command)
31
- COMMANDS[command] || super
32
+ FIREFOX_COMMANDS[command] || self.class::COMMANDS[command]
32
33
  end
33
34
 
34
35
  def install_addon(path, temporary)
@@ -41,6 +42,10 @@ module Selenium
41
42
  execute :uninstall_addon, {}, {id: id}
42
43
  end
43
44
 
45
+ def full_screenshot
46
+ execute :full_page_screenshot
47
+ end
48
+
44
49
  end # Bridge
45
50
  end # Firefox
46
51
  end # WebDriver
@@ -21,25 +21,19 @@ module Selenium
21
21
  module WebDriver
22
22
  module Firefox
23
23
  class Options < WebDriver::Options
24
+ attr_accessor :debugger_address
25
+
24
26
  KEY = 'moz:firefoxOptions'
25
27
 
26
28
  # see: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
27
29
  CAPABILITIES = {binary: 'binary',
28
30
  args: 'args',
29
- profile: 'profile',
30
31
  log: 'log',
31
32
  prefs: 'prefs'}.freeze
32
33
  BROWSER = 'firefox'
33
34
 
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
35
+ # NOTE: special handling of 'profile' to validate when set instead of when used
36
+ attr_reader :profile
43
37
 
44
38
  #
45
39
  # Create a new Options instance, only for W3C-capable versions of Firefox.
@@ -58,10 +52,15 @@ module Selenium
58
52
  #
59
53
 
60
54
  def initialize(log_level: nil, **opts)
55
+ @debugger_address = opts.delete(:debugger_address)
56
+
61
57
  super(**opts)
62
58
 
59
+ @options[:args] ||= []
60
+ @options[:prefs] ||= {}
63
61
  @options[:log] ||= {level: log_level} if log_level
64
- process_profile(@options[:profile]) if @options.key?(:profile)
62
+
63
+ process_profile(@options.delete(:profile))
65
64
  end
66
65
 
67
66
  #
@@ -75,7 +74,6 @@ module Selenium
75
74
  #
76
75
 
77
76
  def add_argument(arg)
78
- @options[:args] ||= []
79
77
  @options[:args] << arg
80
78
  end
81
79
 
@@ -91,7 +89,6 @@ module Selenium
91
89
  #
92
90
 
93
91
  def add_preference(name, value)
94
- @options[:prefs] ||= {}
95
92
  @options[:prefs][name] = value
96
93
  end
97
94
 
@@ -122,7 +119,6 @@ module Selenium
122
119
  # @param [Profile, String] profile Profile to be used
123
120
  #
124
121
 
125
- undef profile=
126
122
  def profile=(profile)
127
123
  process_profile(profile)
128
124
  end
@@ -138,18 +134,21 @@ module Selenium
138
134
  private
139
135
 
140
136
  def process_browser_options(browser_options)
137
+ browser_options['moz:debuggerAddress'] = true if @debugger_address
141
138
  options = browser_options[KEY]
142
139
  options['binary'] ||= Firefox.path if Firefox.path
140
+ options['profile'] = @profile if @profile
143
141
  end
144
142
 
145
143
  def process_profile(profile)
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
144
+ @profile = case profile
145
+ when nil
146
+ nil
147
+ when Profile
148
+ profile
149
+ else
150
+ Profile.from_name(profile)
151
+ end
153
152
  end
154
153
  end # Options
155
154
  end # Firefox
@@ -25,6 +25,14 @@ module Selenium
25
25
 
26
26
  VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
27
27
 
28
+ DEFAULT_PREFERENCES = {
29
+ "browser.newtabpage.enabled" => false,
30
+ "browser.startup.homepage" => "about:blank",
31
+ "browser.usedOnWindows10.introURL" => "about:blank",
32
+ "network.captive-portal-service.enabled" => false,
33
+ "security.csp.enable" => false
34
+ }.freeze
35
+
28
36
  attr_reader :name, :log_file
29
37
  attr_writer :secure_ssl, :load_no_focus_lib
30
38
 
@@ -179,10 +187,12 @@ module Selenium
179
187
 
180
188
  def update_user_prefs_in(directory)
181
189
  path = File.join(directory, 'user.js')
182
- prefs = read_user_prefs(path).merge(@additional_prefs)
190
+ prefs = read_user_prefs(path)
191
+ prefs.merge! self.class::DEFAULT_PREFERENCES
192
+ prefs.merge!(@additional_prefs)
183
193
 
184
194
  # If the user sets the home page, we should also start up there
185
- prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
195
+ prefs['startup.homepage_welcome_url'] ||= prefs['browser.startup.homepage']
186
196
 
187
197
  write_prefs prefs, path
188
198
  end