lib/selenium/webdriver/chrome/options.rb in selenium-webdriver-4.0.0.alpha7 vs lib/selenium/webdriver/chrome/options.rb in selenium-webdriver-4.0.0.beta1
- old
+ new
@@ -19,39 +19,31 @@
module Selenium
module WebDriver
module Chrome
class Options < WebDriver::Options
- attr_accessor :profile
+ attr_accessor :profile, :logging_prefs
KEY = 'goog:chromeOptions'
BROWSER = 'chrome'
# see: http://chromedriver.chromium.org/capabilities
CAPABILITIES = {args: 'args',
binary: 'binary',
- extensions: 'extensions',
local_state: 'localState',
prefs: 'prefs',
detach: 'detach',
debugger_address: 'debuggerAddress',
exclude_switches: 'excludeSwitches',
minidump_path: 'minidumpPath',
emulation: 'mobileEmulation',
perf_logging_prefs: 'perfLoggingPrefs',
window_types: 'windowTypes'}.freeze
- CAPABILITIES.each_key do |key|
- define_method key do
- @options[key]
- end
+ # NOTE: special handling of 'extensions' to validate when set instead of when used
+ attr_reader :extensions
- define_method "#{key}=" do |value|
- @options[key] = value
- end
- end
-
# Create a new Options instance.
#
# @example
# options = Selenium::WebDriver::Chrome::Options.new(args: ['start-maximized', 'user-data-dir=/tmp/temp_profile'])
# driver = Selenium::WebDriver.for(:chrome, options: options)
@@ -72,16 +64,28 @@
# @option opts [String] :minidump_path Directory to store Chrome minidumps (linux only)
# @option opts [Hash] :perf_logging_prefs A hash for performance logging preferences
# @option opts [Array<String>] :window_types A list of window types to appear in the list of window handles
#
- def initialize(profile: nil, encoded_extensions: nil, **opts)
+ def initialize(profile: nil, **opts)
super(**opts)
@profile = profile
- @options[:encoded_extensions] = encoded_extensions if encoded_extensions
- @options[:extensions]&.each(&method(:validate_extension))
+
+ @options = {args: [],
+ prefs: {},
+ emulation: {},
+ extensions: [],
+ local_state: {},
+ exclude_switches: [],
+ perf_logging_prefs: {},
+ window_types: []}.merge(@options)
+
+ @logging_prefs = options.delete(:logging_prefs) || {}
+ @encoded_extensions = @options.delete(:encoded_extensions) || []
+ @extensions = []
+ (@options.delete(:extensions)).each(&method(:validate_extension))
end
#
# Add an extension by local path.
#
@@ -92,29 +96,40 @@
# @param [String] path The local path to the .crx file
#
def add_extension(path)
validate_extension(path)
- @options[:extensions] ||= []
- @options[:extensions] << path
end
#
+ # Add an extension by local path.
+ #
+ # @example
+ # extensions = ['/path/to/extension.crx', '/path/to/other.crx']
+ # options = Selenium::WebDriver::Chrome::Options.new
+ # options.extensions = extensions
+ #
+ # @param [Array<String>] :extensions A list of paths to (.crx) Chrome extensions to install on startup
+ #
+
+ def extensions=(extensions)
+ extensions.each(&method(:validate_extension))
+ end
+
+ #
# Add an extension by Base64-encoded string.
#
# @example
# options = Selenium::WebDriver::Chrome::Options.new
# options.add_encoded_extension(encoded_string)
#
# @param [String] encoded The Base64-encoded string of the .crx file
#
def add_encoded_extension(encoded)
- @options[:encoded_extensions] ||= []
- @options[:encoded_extensions] << encoded
+ @encoded_extensions << encoded
end
- alias_method :encoded_extension=, :add_encoded_extension
#
# Add a command-line argument to use when starting Chrome.
#
# @example Start Chrome maximized
@@ -123,11 +138,10 @@
#
# @param [String] arg The command-line argument to add
#
def add_argument(arg)
- @options[:args] ||= []
@options[:args] << arg
end
#
# Add a preference that is only applied to the user profile in use.
@@ -139,11 +153,10 @@
# @param [String] name Key of the preference
# @param [Boolean, String, Integer] value Value of the preference
#
def add_preference(name, value)
- @options[:prefs] ||= {}
@options[:prefs][name] = value
end
#
# Run Chrome in headless mode.
@@ -180,23 +193,27 @@
@options[:emulation] = opts
end
private
+ def enable_logging(browser_options)
+ browser_options['goog:loggingPrefs'] = @logging_prefs
+ end
+
def process_browser_options(browser_options)
- options = browser_options[KEY]
+ enable_logging(browser_options) unless @logging_prefs.empty?
+
+ options = browser_options[self.class::KEY]
options['binary'] ||= binary_path if binary_path
- (options['args'] || []) << "--user-data-dir=#{@profile.directory}" if @profile
- merge_extensions(options)
- end
+ if @profile
+ options['args'] ||= []
+ options['args'] << "--user-data-dir=#{@profile.directory}"
+ end
- def merge_extensions(browser_options)
- extensions = browser_options['extensions'] || []
- encoded_extensions = browser_options.delete(:encoded_extensions) || []
+ return if (@encoded_extensions + @extensions).empty?
- browser_options['extensions'] = extensions.map(&method(:encode_extension)) + encoded_extensions
- browser_options.delete('extensions') if browser_options['extensions'].empty?
+ options['extensions'] = @encoded_extensions + @extensions.map(&method(:encode_extension))
end
def binary_path
Chrome.path
end
@@ -206,20 +223,15 @@
end
def validate_extension(path)
raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.file?(path)
raise Error::WebDriverError, "file was not an extension #{path.inspect}" unless File.extname(path) == '.crx'
+
+ @extensions << path
end
- def generate_as_json(value, camelize_keys: true)
- if value.is_a?(Hash)
- value.each_with_object({}) do |(key, val), hash|
- key = convert_json_key(key, camelize: camelize_keys)
- hash[key] = generate_as_json(val, camelize_keys: key != 'prefs')
- end
- else
- super
- end
+ def camelize?(key)
+ !['prefs'].include?(key)
end
end # Options
end # Chrome
end # WebDriver
end # Selenium