class Capybara::Apparition::Browser

Attributes

client[R]
console[R]
debug[W]
ignore_https_errors[RW]
js_errors[RW]
paper_size[R]
proxy_auth[R]
zoom_factor[R]

Public Class Methods

new(client, logger = nil) { |self| ... } click to toggle source
# File lib/capybara/apparition/browser.rb, line 32
def initialize(client, logger = nil)
  @client = client
  @current_page_handle = nil
  @pages = PageManager.new(self)
  @context_id = nil
  @js_errors = true
  @ignore_https_errors = false
  @logger = logger
  @console = Console.new(logger)
  @proxy_auth = nil

  initialize_handlers

  command('Target.setDiscoverTargets', discover: true)
  yield self if block_given?
  reset
end

Public Instance Methods

body() click to toggle source
# File lib/capybara/apparition/browser.rb, line 61
def body
  current_page.content
end
clear_memory_cache() click to toggle source
# File lib/capybara/apparition/browser.rb, line 152
def clear_memory_cache
  current_page.command('Network.clearBrowserCache')
end
click_coordinates(x, y) click to toggle source
# File lib/capybara/apparition/browser.rb, line 70
def click_coordinates(x, y)
  current_page.click_at(x, y)
end
command(name, **params) click to toggle source
# File lib/capybara/apparition/browser.rb, line 156
def command(name, **params)
  result = client.send_cmd(name, params).result
  log result

  result || raise(Capybara::Apparition::ObsoleteNode.new(nil, nil))
rescue DeadClient
  restart
  raise
end
command_for_session(session_id, name, params) click to toggle source
# File lib/capybara/apparition/browser.rb, line 166
def command_for_session(session_id, name, params)
  client.send_cmd_to_session(session_id, name, params)
rescue DeadClient
  restart
  raise
end
console_messages(type = nil) click to toggle source
# File lib/capybara/apparition/browser.rb, line 183
def console_messages(type = nil)
  console.messages(type)
end
current_page(allow_nil: false) click to toggle source
# File lib/capybara/apparition/browser.rb, line 173
def current_page(allow_nil: false)
  @pages[@current_page_handle] || begin
    puts "No current page: #{@current_page_handle} : #{caller}" if ENV['DEBUG']
    @current_page_handle = nil
    raise NoSuchWindowError unless allow_nil

    @current_page_handle
  end
end
extensions=(filenames) click to toggle source
# File lib/capybara/apparition/browser.rb, line 135
def extensions=(filenames)
  @extensions = filenames
  Array(filenames).each do |name|
    current_page(allow_nil: true)&.add_extension(name)
  end
end
network_traffic(type = nil) click to toggle source
# File lib/capybara/apparition/browser.rb, line 124
def network_traffic(type = nil)
  case type
  when :blocked
    current_page.network_traffic.select(&:blocked?)
  else
    current_page.network_traffic
  end
end
refresh_pages(opener:) click to toggle source
# File lib/capybara/apparition/browser.rb, line 112
def refresh_pages(opener:)
  @pages.refresh(opener: opener,
                 ignore_https_errors: ignore_https_errors,
                 js_errors: js_errors,
                 url_blacklist: @url_blacklist,
                 url_whitelist: @url_whitelist)
end
reset() click to toggle source
# File lib/capybara/apparition/browser.rb, line 82
def reset
  new_context_id = command('Target.createBrowserContext')['browserContextId']
  new_target_response = client.send_cmd('Target.createTarget', url: 'about:blank', browserContextId: new_context_id)

  @pages.reset

  new_target_id = new_target_response['targetId']

  session_id = command('Target.attachToTarget', targetId: new_target_id)['sessionId']
  session = Capybara::Apparition::DevToolsProtocol::Session.new(self, client, session_id)

  @pages.create(new_target_id, session, new_context_id,
                ignore_https_errors: ignore_https_errors,
                js_errors: js_errors, extensions: @extensions,
                url_blacklist: @url_blacklist,
                url_whitelist: @url_whitelist).send(:main_frame).loaded!

  timer = Capybara::Helpers.timer(expire_in: 10)
  until @pages[new_target_id].usable?
    if timer.expired?
      puts 'Timedout waiting for reset'
      raise TimeoutError, 'reset'
    end
    sleep 0.01
  end
  console.clear
  @current_page_handle = new_target_id
  true
end
resize(width, height, screen: nil) click to toggle source
# File lib/capybara/apparition/browser.rb, line 120
def resize(width, height, screen: nil)
  current_page.set_viewport width: width, height: height, screen: screen
end
restart() click to toggle source
# File lib/capybara/apparition/browser.rb, line 50
def restart
  # puts 'handle client restart'
  # client.restart

  self.debug = @debug if defined?(@debug)
  self.js_errors = @js_errors if defined?(@js_errors)
  self.zoom_factor = @zoom_factor if defined?(@zoom_factor)
  self.extensions = @extensions if @extensions
  current_page.clear_network_traffic
end
source() click to toggle source
# File lib/capybara/apparition/browser.rb, line 65
def source
  # Is this still useful?
  # command 'source'
end
url_blacklist=(blacklist) click to toggle source
# File lib/capybara/apparition/browser.rb, line 146
def url_blacklist=(blacklist)
  @url_blacklist = @pages.blacklist = blacklist
end
url_whitelist=(whitelist) click to toggle source
# File lib/capybara/apparition/browser.rb, line 142
def url_whitelist=(whitelist)
  @url_whitelist = @pages.whitelist = whitelist
end

Private Instance Methods

find_window_handle(locator) click to toggle source
# File lib/capybara/apparition/browser/window.rb, line 53
def find_window_handle(locator)
  original = current_window_handle
  return locator if window_handles.include? locator

  window_handles.each do |handle|
    switch_to_window(handle)
    return handle if evaluate('[window.name, document.title, window.location.href]').include? locator
  end
  raise NoSuchWindowError
ensure
  switch_to_window(original) if original
end
initialize_handlers() click to toggle source
# File lib/capybara/apparition/browser.rb, line 199
def initialize_handlers
  # @client.on 'Target.targetCreated' do |info|
  #   byebug
  #   puts "Target Created Info: #{info}" if ENV['DEBUG']
  #   target_info = info['targetInfo']
  #   if !@pages.key?(target_info['targetId'])
  #     @pages.add(target_info['targetId'], target_info)
  #     puts "**** Target Added #{info}" if ENV['DEBUG']
  #   elsif ENV['DEBUG']
  #     puts "Target already existed #{info}"
  #   end
  #   @current_page_handle ||= target_info['targetId'] if target_info['type'] == 'page'
  # end

  @client.on 'Target.targetDestroyed' do |target_id:, **info|
    puts "**** Target Destroyed Info: #{target_id} - #{info}" if ENV['DEBUG']
    @pages.delete(target_id)
  end

  # @client.on 'Target.targetInfoChanged' do |info|
  #   byebug
  #   puts "**** Target Info Changed: #{info}" if ENV['DEBUG']
  #   target_info = info['targetInfo']
  #   page = @pages[target_info['targetId']]
  #   if page
  #     page.update(target_info)
  #   else
  #     puts '****No target for the info change- creating****' if ENV['DEBUG']
  #     @pages.add(target_info['targetId'], target_info)
  #   end
  # end
end
log(message) click to toggle source
# File lib/capybara/apparition/browser.rb, line 189
def log(message)
  return unless @logger && ENV['DEBUG']

  if @logger.respond_to?(:puts)
    @logger.puts(message)
  else
    @logger.debug(message)
  end
end