class Selenium::WebDriver::Firefox::Binary
@api private
def execute(*extra_args)
def execute(*extra_args) args = [self.class.path, '-no-remote'] + extra_args @process = ChildProcess.build(*args) WebDriver.logger.debug("Executing Process #{args}") @process.io.stdout = @process.io.stderr = WebDriver.logger.io @process.start end
def macosx_path
def macosx_path path = '/Applications/Firefox.app/Contents/MacOS/firefox-bin' path = File.expand_path('~/Applications/Firefox.app/Contents/MacOS/firefox-bin') unless File.exist?(path) path = Platform.find_binary('firefox-bin') unless File.exist?(path) path end
def modify_link_library_path(profile_path)
def modify_link_library_path(profile_path) paths = [] NO_FOCUS_LIBRARIES.each do |from, to| dest = File.join(profile_path, to) FileUtils.mkdir_p File.dirname(dest) FileUtils.cp from, dest paths << File.expand_path(File.dirname(dest)) end paths += ENV['LD_LIBRARY_PATH'].to_s.split(File::PATH_SEPARATOR) ENV['LD_LIBRARY_PATH'] = paths.uniq.join(File::PATH_SEPARATOR) ENV['LD_PRELOAD'] = NO_FOCUS_LIBRARY_NAME end
def path
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) error = "Could not find Firefox binary (os=#{Platform.os}). " error << "Make sure Firefox is installed or set the path manually with #{self}.path=" raise Error::WebDriverError, error end @path end
def path=(path)
def path=(path) Platform.assert_executable(path) @path = path end
def quit
def quit return unless @process @process.poll_for_exit QUIT_TIMEOUT rescue ChildProcess::TimeoutError # ok, force quit @process.stop QUIT_TIMEOUT end
def reset_path!
def reset_path! @path = nil end
def start_with(profile, profile_path, *args)
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.tr('/', '\\') 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) end
def version
def version @version = case Platform.os when :macosx `#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i when :windows `\"#{path}\" -v | more`.strip[/[^\s]*$/][/^\d+/].to_i when :linux `#{path} -v`.strip[/[^\s]*$/][/^\d+/].to_i else 0 end end
def wait
def wait return unless @process begin @process.poll_for_exit(WAIT_TIMEOUT) rescue ChildProcess::TimeoutError => e @process.stop raise e end end
def windows_path
def windows_path windows_registry_path || Platform.find_in_program_files('\\Mozilla Firefox\\firefox.exe') || Platform.find_binary('firefox') end
def windows_registry_path
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") entry = main.find { |key, _type, _data| key =~ /pathtoexe/i } return entry.last if entry end rescue LoadError # older JRuby or IronRuby does not have win32/registry rescue Win32::Registry::Error end