Skip to content

Instantly share code, notes, and snippets.

@miry
Created September 10, 2017 21:13
Show Gist options
  • Save miry/72817c2dc5c529c02d94bcb6dbdbeb8b to your computer and use it in GitHub Desktop.
Save miry/72817c2dc5c529c02d94bcb6dbdbeb8b to your computer and use it in GitHub Desktop.
Test app to run headless chrome with capybara
#!/usr/bin/env ruby
require 'rubygems'
require 'bundler'
require 'logger'
Bundler.require
Capybara.register_driver(:headless_chrome) do |app|
# args << "--window-size=320,480"
# you can also set the user agent
# args << "--user-agent='Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'"
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w[headless disable-gpu use-mobile-user-agent] }
)
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: capabilities
)
end
Capybara::Screenshot.register_driver(:headless_chrome) do |driver, path|
driver.browser.save_screenshot(path)
end
Capybara.configure do |config|
# config.asset_root = 'tmp'
config.save_path = 'tmp'
config.run_server = false
config.default_max_wait_time = 5
end
Capybara.javascript_driver = :headless_chrome
Capybara.current_driver = :headless_chrome
Capybara.default_max_wait_time = 2
logger = Logger.new(STDOUT)
class Runner
include Capybara::DSL
attr_accessor :visited
def initialize(logger: Logger.new, max_depth: 10)
@visited = {}
@max_depth = max_depth
@logger = logger
end
def logger
@logger
end
def run(path='/')
process(path)
end
private
def process(path='/', depth: 0)
return if (@visited.key?(path) || depth >= @max_depth)
@visited[path] = true
indent = " " * depth
logger.debug "#{indent}#{path}"
sleep 2
visit(path)
all("a").each do |e|
u = e[:href]
next if u.nil?
process e[:href], depth: depth+1
end
rescue => e
screenshot_and_save_page rescue nil
logger.debug '--- Eception'
logger.debug e.class
logger.debug e.message
logger.debug "\n"+e.backtrace.join("\n")
logger.debug '---- Console'
logger.debug(page.driver.console_messages) rescue nil
logger.debug "---- Body"
# logger.debug page.body
logger.debug '-----'
end
end
Runner.new(logger: logger, max_depth: 3).run('https://www.wikipedia.org')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment