class Capybara::Poltergeist::Driver
Constants
- DEFAULT_TIMEOUT
Attributes
app[R]
options[R]
Public Class Methods
new(app, options = {})
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 10 def initialize(app, options = {}) @app = app @options = options @browser = nil @inspector = nil @server = nil @client = nil @started = false end
Public Instance Methods
accept_modal(type, options = {}) { || ... }
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 391 def accept_modal(type, options = {}) case type when :confirm browser.accept_confirm when :prompt browser.accept_prompt options[:with] end yield if block_given? find_modal(options) end
add_header(name, value, options = {})
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 279 def add_header(name, value, options = {}) browser.add_header({ name => value }, { permanent: true }.merge(options)) end
add_headers(headers)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 275 def add_headers(headers) browser.add_headers(headers) end
browser()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 24 def browser @browser ||= begin browser = Browser.new(server, client, logger) browser.js_errors = options[:js_errors] if options.key?(:js_errors) browser.extensions = options.fetch(:extensions, []) browser.debug = true if options[:debug] browser.url_blacklist = options[:url_blacklist] if options.key?(:url_blacklist) browser.url_whitelist = options[:url_whitelist] if options.key?(:url_whitelist) browser.page_settings = options[:page_settings] if options.key?(:page_settings) browser end end
clear_memory_cache()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 317 def clear_memory_cache browser.clear_memory_cache end
clear_network_traffic()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 259 def clear_network_traffic browser.clear_network_traffic end
click(x, y)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 151 def click(x, y) browser.click_coordinates(x, y) end
client()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 45 def client @client ||= Client.start(server, :path => options[:phantomjs], :window_size => options[:window_size], :phantomjs_options => phantomjs_options, :phantomjs_logger => phantomjs_logger ) end
client_pid()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 66 def client_pid client.pid end
close_window(handle)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 186 def close_window(handle) browser.close_window(handle) end
current_url()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 102 def current_url if Capybara::VERSION.to_f < 3.0 frame_url else browser.current_url.gsub(' ', '%20') # PhantomJS < 2.1 doesn't escape spaces end end
current_window_handle()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 178 def current_window_handle browser.window_handle end
debug()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 332 def debug if @options[:inspector] # Fall back to default scheme scheme = URI.parse(browser.current_url).scheme rescue nil scheme = 'http' if scheme != 'https' inspector.open(scheme) pause else raise Error, "To use the remote debugging, you have to launch the driver " \ "with `:inspector => true` configuration option" end end
dismiss_modal(type, options = {}) { || ... }
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 404 def dismiss_modal(type, options = {}) case type when :confirm browser.dismiss_confirm when :prompt browser.dismiss_prompt end yield if block_given? find_modal(options) end
evaluate_async_script(script, *args)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 160 def evaluate_async_script(script, *args) result = browser.evaluate_async(script, session_wait_time, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ? arg.native : arg}) unwrap_script_result(result) end
evaluate_script(script, *args)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 155 def evaluate_script(script, *args) result = browser.evaluate(script, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ? arg.native : arg}) unwrap_script_result(result) end
execute_script(script, *args)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 165 def execute_script(script, *args) browser.execute(script, *args.map { |arg| arg.is_a?(Capybara::Poltergeist::Node) ? arg.native : arg}) nil end
find(method, selector)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 139 def find(method, selector) browser.find(method, selector).map { |page_id, id| Capybara::Poltergeist::Node.new(self, page_id, id) } end
find_css(selector)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 147 def find_css(selector) find :css, selector end
find_xpath(selector)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 143 def find_xpath(selector) find :xpath, selector end
frame_title()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 135 def frame_title browser.frame_title end
frame_url()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 110 def frame_url browser.frame_url.gsub(' ', '%20') # PhantomJS < 2.1 doesn't escape spaces end
go_back()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 379 def go_back browser.go_back end
go_forward()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 383 def go_forward browser.go_forward end
headers()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 267 def headers browser.get_headers end
headers=(headers)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 271 def headers=(headers) browser.set_headers(headers) end
html()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 118 def html browser.body end
Also aliased as: body
inspector()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 37 def inspector @inspector ||= options[:inspector] && Inspector.new(options[:inspector]) end
invalid_element_errors()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 375 def invalid_element_errors [Capybara::Poltergeist::ObsoleteNode, Capybara::Poltergeist::MouseEventFailed] end
logger()
click to toggle source
logger should be an object that responds to puts, or nil
# File lib/capybara/poltergeist/driver.rb, line 88 def logger options[:logger] || (options[:debug] && STDERR) end
maximize_window(handle)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 241 def maximize_window(handle) resize_window_to(handle, *screen_size) end
needs_server?()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 20 def needs_server? true end
network_traffic(type = nil)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 255 def network_traffic(type = nil) browser.network_traffic(type) end
no_such_window_error()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 202 def no_such_window_error NoSuchWindowError end
open_new_window()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 190 def open_new_window browser.open_new_window end
paper_size=(size = {})
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 222 def paper_size=(size = {}) browser.set_paper_size(size) end
pause()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 345 def pause # STDIN is not necessarily connected to a keyboard. It might even be closed. # So we need a method other than keypress to continue. # In jRuby - STDIN returns immediately from select # see https://github.com/jruby/jruby/issues/1783 read, write = IO.pipe Thread.new { IO.copy_stream(STDIN, write); write.close } STDERR.puts "Poltergeist execution paused. Press enter (or run 'kill -CONT #{Process.pid}') to continue." signal = false old_trap = trap('SIGCONT') { signal = true; STDERR.puts "\nSignal SIGCONT received" } keyboard = IO.select([read], nil, nil, 1) until keyboard || signal # wait for data on STDIN or signal SIGCONT received begin input = read.read_nonblock(80) # clear out the read buffer puts unless input && input =~ /\n\z/ rescue EOFError, IO::WaitReadable # Ignore problems reading from STDIN. end unless signal ensure trap('SIGCONT', old_trap) # Restore the previous signal handler, if there was one. STDERR.puts 'Continuing' end
phantomjs_logger()
click to toggle source
logger should be an object that behaves like IO or nil
# File lib/capybara/poltergeist/driver.rb, line 93 def phantomjs_logger options.fetch(:phantomjs_logger, nil) end
phantomjs_options()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 54 def phantomjs_options list = options[:phantomjs_options] || [] # PhantomJS defaults to only using SSLv3, which since POODLE (Oct 2014) # many sites have dropped from their supported protocols (eg PayPal, # Braintree). list += ["--ignore-ssl-errors=yes"] unless list.grep(/ignore-ssl-errors/).any? list += ["--ssl-protocol=TLSv1"] unless list.grep(/ssl-protocol/).any? list += ["--remote-debugger-port=#{inspector.port}", "--remote-debugger-autorun=yes"] if inspector list end
quit()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 82 def quit server.stop client.stop end
refresh()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 387 def refresh browser.refresh end
render_base64(format = :png, options = {})
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 218 def render_base64(format = :png, options = {}) browser.render_base64(format, options) end
reset!()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 206 def reset! browser.reset browser.url_blacklist = options[:url_blacklist] if options.key?(:url_blacklist) browser.url_whitelist = options[:url_whitelist] if options.key?(:url_whitelist) @started = false end
resize(width, height)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 230 def resize(width, height) browser.resize(width, height) end
Also aliased as: resize_window
resize_window_to(handle, width, height)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 235 def resize_window_to(handle, width, height) within_window(handle) do resize(width, height) end end
response_headers()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 283 def response_headers browser.response_headers end
restart()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 78 def restart browser.restart end
save_screenshot(path, options = {})
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 213 def save_screenshot(path, options = {}) browser.render(path, options) end
Also aliased as: render
scroll_to(left, top)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 251 def scroll_to(left, top) browser.scroll_to(left, top) end
server()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 41 def server @server ||= Server.new(options[:port], options.fetch(:timeout) { DEFAULT_TIMEOUT }, options[:host]) end
set_proxy(ip, port, type = "http", user = nil, password = nil)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 263 def set_proxy(ip, port, type = "http", user = nil, password = nil) browser.set_proxy(ip, port, type, user, password) end
source()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 123 def source browser.source.to_s end
status_code()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 114 def status_code browser.status_code end
switch_to_frame(locator)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 174 def switch_to_frame(locator) browser.switch_to_frame(locator) end
switch_to_window(handle)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 194 def switch_to_window(handle) browser.switch_to_window(handle) end
timeout()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 70 def timeout server.timeout end
timeout=(sec)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 74 def timeout=(sec) server.timeout = sec end
title()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 127 def title if Capybara::VERSION.to_f < 3.0 frame_title else browser.title end end
visit(url)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 97 def visit(url) @started = true browser.visit(url) end
wait?()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 371 def wait? true end
window_handles()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 182 def window_handles browser.window_handles end
window_size(handle)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 245 def window_size(handle) within_window(handle) do evaluate_script('[window.innerWidth, window.innerHeight]') end end
within_frame(name, &block)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 170 def within_frame(name, &block) browser.within_frame(name, &block) end
within_window(name, &block)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 198 def within_window(name, &block) browser.within_window(name, &block) end
zoom_factor=(zoom_factor)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 226 def zoom_factor=(zoom_factor) browser.set_zoom_factor(zoom_factor) end
Private Instance Methods
find_modal(options)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 422 def find_modal(options) start_time = Time.now timeout_sec = options.fetch(:wait) { session_wait_time } expect_text = options[:text] expect_regexp = expect_text.is_a?(Regexp) ? expect_text : Regexp.escape(expect_text.to_s) not_found_msg = 'Unable to find modal dialog' not_found_msg += " with #{expect_text}" if expect_text begin modal_text = browser.modal_message raise Capybara::ModalNotFound if modal_text.nil? || (expect_text && !modal_text.match(expect_regexp)) rescue Capybara::ModalNotFound => e raise e, not_found_msg if (Time.now - start_time) >= timeout_sec sleep(0.05) retry end modal_text end
screen_size()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 418 def screen_size options[:screen_size] || [1366,768] end
session_wait_time()
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 441 def session_wait_time if respond_to?(:session_options) session_options.default_max_wait_time else begin Capybara.default_max_wait_time rescue Capybara.default_wait_time end end end def default_cookie_host if respond_to?(:session_options) session_options.app_host else Capybara.app_host end || '' end def unwrap_script_result(arg) case arg when Array arg.map { |e| unwrap_script_result(e) } when Hash return Capybara::Poltergeist::Node.new(self, arg['ELEMENT']['page_id'], arg['ELEMENT']['id']) if arg['ELEMENT'] arg.each { |k, v| arg[k] = unwrap_script_result(v) } else arg end end end
unwrap_script_result(arg)
click to toggle source
# File lib/capybara/poltergeist/driver.rb, line 457 def unwrap_script_result(arg) case arg when Array arg.map { |e| unwrap_script_result(e) } when Hash return Capybara::Poltergeist::Node.new(self, arg['ELEMENT']['page_id'], arg['ELEMENT']['id']) if arg['ELEMENT'] arg.each { |k, v| arg[k] = unwrap_script_result(v) } else arg end end