class Selenium::WebDriver::Firefox::Binary

@api private

Constants

NO_FOCUS_LIBRARIES
NO_FOCUS_LIBRARY_NAME
QUIT_TIMEOUT
WAIT_TIMEOUT

Private Class Methods

macosx_path() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 139
def macosx_path
  path = "/Applications/Firefox.app/Contents/MacOS/firefox-bin"
  path = Platform.find_binary("firefox-bin") unless File.exist?(path)

  path
end
path() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 112
def path
  @path ||= case Platform.os
            when :macosx
              macosx_path
            when :windows
              windows_path
            when :linux, :unix
              Platform.find_binary("firefox3", "firefox2", "firefox") || "/usr/bin/firefox"
            else
              raise Error::WebDriverError, "unknown platform: #{Platform.os}"
            end

  @path = Platform.cygwin_path(@path) if Platform.cygwin?

  unless File.file?(@path.to_s)
    raise Error::WebDriverError, "Could not find Firefox binary (os=#{Platform.os}). Make sure Firefox is installed or set the path manually with #{self}.path="
  end

  @path
end
path=(path) click to toggle source

@api private

@see Selenium::WebDriver::Firefox.path=

# File lib/selenium/webdriver/firefox/binary.rb, line 107
def path=(path)
  Platform.assert_executable(path)
  @path = path
end
windows_path() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 135
def windows_path
  windows_registry_path || Platform.find_in_program_files("\\Mozilla Firefox\\firefox.exe") || Platform.find_binary("firefox")
end
windows_registry_path() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 146
def windows_registry_path
  require 'win32/registry'

  lm = Win32::Registry::HKEY_LOCAL_MACHINE
  lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
    main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
    if entry = main.find { |key, type, data| key =~ /pathtoexe/i }
      return entry.last
    end
  end
rescue LoadError
  # older JRuby or IronRuby does not have win32/registry
rescue Win32::Registry::Error
end

Public Instance Methods

quit() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 38
def quit
  return unless @process
  @process.poll_for_exit QUIT_TIMEOUT
rescue ChildProcess::TimeoutError
  # ok, force quit
  @process.stop QUIT_TIMEOUT
end
start_with(profile, profile_path, *args) click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 17
def start_with(profile, profile_path, *args)
  if Platform.cygwin?
    profile_path = Platform.cygwin_path(profile_path, :windows => true)
  elsif Platform.windows?
    profile_path = profile_path.gsub("/", "\\")
  end

  ENV['XRE_CONSOLE_LOG']           = profile.log_file if profile.log_file
  ENV['XRE_PROFILE_PATH']          = profile_path
  ENV['MOZ_NO_REMOTE']             = '1' # able to launch multiple instances
  ENV['MOZ_CRASHREPORTER_DISABLE'] = '1' # disable breakpad
  ENV['NO_EM_RESTART']             = '1' # prevent the binary from detaching from the console

  if Platform.linux? && (profile.native_events? || profile.load_no_focus_lib?)
    modify_link_library_path profile_path
  end

  execute(*args)
  cope_with_mac_strangeness(args) if Platform.mac?
end
wait() click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 46
def wait
  return unless @process

  begin
    @process.poll_for_exit(WAIT_TIMEOUT)
  rescue ChildProcess::TimeoutError => e
    @process.stop
    raise e
  end
end

Private Instance Methods

cope_with_mac_strangeness(args) click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 66
def cope_with_mac_strangeness(args)
  sleep 0.3

  if @process.crashed?
    # ok, trying a restart
    sleep 7
    execute(*args)
  end

  # ensure we're ok
  sleep 0.3
  if @process.crashed?
    raise Error::WebDriverError, "unable to start Firefox cleanly, args: #{args.inspect}"
  end
end
execute(*extra_args) click to toggle source
# File lib/selenium/webdriver/firefox/binary.rb, line 59
def execute(*extra_args)
  args = [self.class.path, "-no-remote"] + extra_args
  @process = ChildProcess.build(*args)
  @process.io.inherit! if $DEBUG
  @process.start
end