123456789_123456789_123456789_123456789_123456789_

Class: Selenium::WebDriver::Firefox::Profile

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: rb/lib/selenium/webdriver/firefox/profile.rb

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(model = nil) ⇒ Profile

Create a new Profile instance

Examples:

User configured profile

profile = Selenium::WebDriver::Firefox::Profile.new
profile['network.proxy.http'] = 'localhost'
profile['network.proxy.http_port'] = 9090

driver = Selenium::WebDriver.for :firefox, :profile => profile
[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 72

def initialize(model = nil)
  @model = verify_model(model)

  @additional_prefs = read_model_prefs
end

Class Method Details

.decoded(json)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 55

def decoded(json)
  JSON.parse(json)
end

.from_name(name)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 48

def from_name(name)
  profile = ini[name]
  return profile if profile

  raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
end

.ini

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 44

def ini
  @ini ||= ProfilesIni.new
end

Instance Attribute Details

#log_file (rw)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 41

attr_reader :name, :log_file

#log_file=(file) (rw)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 108

def log_file=(file)
  @log_file = file
  self[WEBDRIVER_PREFS[:log_file]] = file
end

#name (readonly)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 41

attr_reader :name, :log_file

#proxy=(proxy) (writeonly)

Raises:

  • (TypeError)
[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 113

def proxy=(proxy)
  raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy

  case proxy.type
  when :manual
    self['network.proxy.type'] = 1

    set_manual_proxy_preference 'http', proxy.http
    set_manual_proxy_preference 'ssl', proxy.ssl
    set_manual_proxy_preference 'socks', proxy.socks

    self['network.proxy.no_proxies_on'] = proxy.no_proxy || ''
  when :pac
    self['network.proxy.type'] = 2
    self['network.proxy.autoconfig_url'] = proxy.pac
  when :auto_detect
    self['network.proxy.type'] = 4
  else
    raise ArgumentError, "unsupported proxy type #{proxy.type}"
  end
end

Instance Method Details

#[]=(key, value)

Set a preference for this particular profile.

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 96

def []=(key, value)
  unless VALID_PREFERENCE_TYPES.any? { |e| value.is_a? e }
    raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
  end

  if value.is_a?(String) && Util.stringified?(value)
    raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
  end

  @additional_prefs[key.to_s] = value
end

#as_json

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 135

alias as_json encoded

#delete_extensions_cache(directory) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 154

def delete_extensions_cache(directory)
  FileUtils.rm_f File.join(directory, 'extensions.cache')
end

#delete_lock_files(directory) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 158

def delete_lock_files(directory)
  LOCK_FILES.each do |name|
    FileUtils.rm_f File.join(directory, name)
  end
end

#layout_on_disk

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 78

def layout_on_disk
  profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
  FileReaper << profile_dir

  delete_lock_files(profile_dir)
  delete_extensions_cache(profile_dir)
  update_user_prefs_in(profile_dir)

  profile_dir
end

#read_model_prefs (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 148

def read_model_prefs
  return {} unless @model

  read_user_prefs(File.join(@model, 'user.js'))
end

#read_user_prefs(path) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 176

def read_user_prefs(path)
  prefs = {}
  return prefs unless File.exist?(path)

  File.read(path).split("\n").each do |line|
    next unless line =~ /user_pref\("([^"])"\s*,\s*(.?)\);/

    key = Regexp.last_match(1)&.strip
    value = Regexp.last_match(2)&.strip

    # wrap the value in an array to make it a valid JSON string.
    prefs[key] = JSON.parse("[#{value}]").first
  end

  prefs
end

#set_manual_proxy_preference(key, value) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 139

def set_manual_proxy_preference(key, value)
  return unless value

  host, port = value.to_s.split(':', 2)

  self["network.proxy.#{key}"] = host
  self["network.proxy.#{key}_port"] = Integer(port) if port
end

#update_user_prefs_in(directory) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 164

def update_user_prefs_in(directory)
  path = File.join(directory, 'user.js')
  prefs = read_user_prefs(path)
  prefs.merge! self.class::DEFAULT_PREFERENCES
  prefs.merge!(@additional_prefs)

  # If the user sets the home page, we should also start up there
  prefs['startup.homepage_welcome_url'] ||= prefs['browser.startup.homepage']

  write_prefs prefs, path
end

#write_prefs(prefs, path) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/firefox/profile.rb', line 193

def write_prefs(prefs, path)
  File.open(path, 'w') do |file|
    prefs.each do |key, value|
      file.puts %{user_pref("#{key}", #{value.to_json});}
    end
  end
end