Class: Capybara::Cuprite::Driver
- Inherits:
-
Driver::Base
- Object
- Driver::Base
- Capybara::Cuprite::Driver
- Extended by:
- Forwardable
- Defined in:
- lib/capybara/cuprite/driver.rb
Constant Summary collapse
- DEFAULT_MAXIMIZE_SCREEN_SIZE =
[1366, 768].freeze
- EXTENSION =
File.("javascripts/index.js", __dir__)
Instance Attribute Summary collapse
-
#app ⇒ Object
readonly
Returns the value of attribute app.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#paper_size ⇒ Object
writeonly
Sets the attribute paper_size.
-
#screen_size ⇒ Object
readonly
Returns the value of attribute screen_size.
Instance Method Summary collapse
- #accept_modal(type, options = {}) ⇒ Object
- #active_element ⇒ Object
- #add_header(name, value, permanent: true) ⇒ Object
- #add_headers(headers) ⇒ Object
- #basic_authorize(user, password) ⇒ Object (also: #authorize)
- #browser ⇒ Object
- #clear_cookies ⇒ Object
- #clear_memory_cache ⇒ Object
- #clear_network_traffic ⇒ Object
- #click(x, y) ⇒ Object
- #cookies ⇒ Object
- #debug ⇒ Object
- #dismiss_modal(type, options = {}) ⇒ Object
- #evaluate_async_script(script, *args) ⇒ Object
- #evaluate_script(script, *args) ⇒ Object
- #execute_script(script, *args) ⇒ Object
- #find(method, selector) ⇒ Object
- #find_css(selector) ⇒ Object
- #find_xpath(selector) ⇒ Object
- #frame_title ⇒ Object
- #frame_url ⇒ Object
- #fullscreen_window(handle) ⇒ Object
- #headers ⇒ Object
- #headers=(headers) ⇒ Object
-
#initialize(app, options = {}) ⇒ Driver
constructor
A new instance of Driver.
- #invalid_element_errors ⇒ Object
- #maximize_window(handle) ⇒ Object
- #needs_server? ⇒ Boolean
- #network_traffic(type = nil) ⇒ Object
- #no_such_window_error ⇒ Object
- #open_new_window ⇒ Object
- #pause ⇒ Object
- #remove_cookie(name, **options) ⇒ Object
- #render_base64(format = :png, options = {}) ⇒ Object
- #reset! ⇒ Object
- #resize(width, height) ⇒ Object (also: #resize_window)
- #resize_window_to(handle, width, height) ⇒ Object
- #response_headers ⇒ Object
- #save_screenshot(path, options = {}) ⇒ Object (also: #render)
- #scroll_to(left, top) ⇒ Object
- #set_cookie(name, value, options = {}) ⇒ Object
- #set_proxy(host, port, user = nil, password = nil, bypass = nil) ⇒ Object
- #source ⇒ Object
- #switch_to_frame(locator) ⇒ Object
- #visit(url) ⇒ Object
- #wait? ⇒ Boolean
- #wait_for_network_idle(**options) ⇒ Object
- #window_size(handle) ⇒ Object
- #zoom_factor=(value) ⇒ Object
Constructor Details
#initialize(app, options = {}) ⇒ Driver
Returns a new instance of Driver.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/capybara/cuprite/driver.rb', line 26 def initialize(app, = {}) @app = app @options = .dup @started = false @options[:extensions] ||= [] @options[:extensions] << EXTENSION @screen_size = @options.delete(:screen_size) @screen_size ||= DEFAULT_MAXIMIZE_SCREEN_SIZE @options[:save_path] ||= File.(Capybara.save_path) if Capybara.save_path @options[:pending_connection_errors] = true unless @options.key?(:pending_connection_errors) # It's set for debug() to make devtools tab open correctly. @options[:browser_options] ||= {} unless @options[:browser_options][:"remote-allow-origins"] @options[:browser_options].merge!("remote-allow-origins": "*") end super() end |
Instance Attribute Details
#app ⇒ Object (readonly)
Returns the value of attribute app.
24 25 26 |
# File 'lib/capybara/cuprite/driver.rb', line 24 def app @app end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
24 25 26 |
# File 'lib/capybara/cuprite/driver.rb', line 24 def @options end |
#paper_size=(value) ⇒ Object (writeonly)
Sets the attribute paper_size
172 173 174 |
# File 'lib/capybara/cuprite/driver.rb', line 172 def paper_size=(value) @paper_size = value end |
#screen_size ⇒ Object (readonly)
Returns the value of attribute screen_size.
24 25 26 |
# File 'lib/capybara/cuprite/driver.rb', line 24 def screen_size @screen_size end |
Instance Method Details
#accept_modal(type, options = {}) ⇒ Object
336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/capybara/cuprite/driver.rb', line 336 def accept_modal(type, = {}) case type when :alert, :confirm browser.accept_confirm when :prompt browser.accept_prompt([:with]) end yield if block_given? browser.find_modal() end |
#active_element ⇒ Object
74 75 76 |
# File 'lib/capybara/cuprite/driver.rb', line 74 def active_element Node.new(self, browser.active_element) end |
#add_header(name, value, permanent: true) ⇒ Object
239 240 241 |
# File 'lib/capybara/cuprite/driver.rb', line 239 def add_header(name, value, permanent: true) browser.headers.add({ name => value }, permanent: permanent) end |
#add_headers(headers) ⇒ Object
235 236 237 |
# File 'lib/capybara/cuprite/driver.rb', line 235 def add_headers(headers) browser.headers.add(headers) end |
#basic_authorize(user, password) ⇒ Object Also known as:
277 278 279 280 281 |
# File 'lib/capybara/cuprite/driver.rb', line 277 def (user, password) browser.network.(user: user, password: password) do |request, _index, _total| request.continue end end |
#browser ⇒ Object
53 54 55 |
# File 'lib/capybara/cuprite/driver.rb', line 53 def browser @browser ||= Browser.new(@options) end |
#clear_cookies ⇒ Object
265 266 267 |
# File 'lib/capybara/cuprite/driver.rb', line 265 def browser..clear end |
#clear_memory_cache ⇒ Object
273 274 275 |
# File 'lib/capybara/cuprite/driver.rb', line 273 def clear_memory_cache browser.network.clear(:cache) end |
#clear_network_traffic ⇒ Object
219 220 221 |
# File 'lib/capybara/cuprite/driver.rb', line 219 def clear_network_traffic browser.network.clear(:traffic) end |
#click(x, y) ⇒ Object
90 91 92 |
# File 'lib/capybara/cuprite/driver.rb', line 90 def click(x, y) browser.mouse.click(x: x, y: y) end |
#cookies ⇒ Object
247 248 249 |
# File 'lib/capybara/cuprite/driver.rb', line 247 def browser..all end |
#debug ⇒ Object
284 285 286 |
# File 'lib/capybara/cuprite/driver.rb', line 284 def debug(...) browser.debug(...) end |
#dismiss_modal(type, options = {}) ⇒ Object
349 350 351 352 353 354 355 356 357 358 359 360 |
# File 'lib/capybara/cuprite/driver.rb', line 349 def dismiss_modal(type, = {}) case type when :confirm browser.dismiss_confirm when :prompt browser.dismiss_prompt end yield if block_given? browser.find_modal() end |
#evaluate_async_script(script, *args) ⇒ Object
99 100 101 102 |
# File 'lib/capybara/cuprite/driver.rb', line 99 def evaluate_async_script(script, *args) result = browser.evaluate_async(script, session_wait_time, *native_args(args)) unwrap_script_result(result) end |
#evaluate_script(script, *args) ⇒ Object
94 95 96 97 |
# File 'lib/capybara/cuprite/driver.rb', line 94 def evaluate_script(script, *args) result = browser.evaluate(script, *native_args(args)) unwrap_script_result(result) end |
#execute_script(script, *args) ⇒ Object
104 105 106 107 |
# File 'lib/capybara/cuprite/driver.rb', line 104 def execute_script(script, *args) browser.execute(script, *native_args(args)) nil end |
#find(method, selector) ⇒ Object
86 87 88 |
# File 'lib/capybara/cuprite/driver.rb', line 86 def find(method, selector) browser.find(method, selector).map { |native| Node.new(self, native) } end |
#find_css(selector) ⇒ Object
82 83 84 |
# File 'lib/capybara/cuprite/driver.rb', line 82 def find_css(selector) find(:css, selector) end |
#find_xpath(selector) ⇒ Object
78 79 80 |
# File 'lib/capybara/cuprite/driver.rb', line 78 def find_xpath(selector) find(:xpath, selector) end |
#frame_title ⇒ Object
70 71 72 |
# File 'lib/capybara/cuprite/driver.rb', line 70 def frame_title evaluate_script("document.title") end |
#frame_url ⇒ Object
62 63 64 |
# File 'lib/capybara/cuprite/driver.rb', line 62 def frame_url evaluate_script("window.location.href") end |
#fullscreen_window(handle) ⇒ Object
195 196 197 198 199 |
# File 'lib/capybara/cuprite/driver.rb', line 195 def fullscreen_window(handle) within_window(handle) do browser.resize(fullscreen: true) end end |
#headers ⇒ Object
227 228 229 |
# File 'lib/capybara/cuprite/driver.rb', line 227 def headers browser.headers.get end |
#headers=(headers) ⇒ Object
231 232 233 |
# File 'lib/capybara/cuprite/driver.rb', line 231 def headers=(headers) browser.headers.set(headers) end |
#invalid_element_errors ⇒ Object
328 329 330 331 332 333 334 |
# File 'lib/capybara/cuprite/driver.rb', line 328 def invalid_element_errors [Capybara::Cuprite::ObsoleteNode, Capybara::Cuprite::MouseEventFailed, Ferrum::CoordinatesNotFoundError, Ferrum::NoExecutionContextError, Ferrum::NodeNotFoundError] end |
#maximize_window(handle) ⇒ Object
185 186 187 |
# File 'lib/capybara/cuprite/driver.rb', line 185 def maximize_window(handle) resize_window_to(handle, *screen_size) end |
#needs_server? ⇒ Boolean
49 50 51 |
# File 'lib/capybara/cuprite/driver.rb', line 49 def needs_server? true end |
#network_traffic(type = nil) ⇒ Object
205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/capybara/cuprite/driver.rb', line 205 def network_traffic(type = nil) traffic = browser.network.traffic case type.to_s when "all" traffic when "blocked" traffic.select(&:blocked?) else # when request isn't blocked traffic.reject(&:blocked?) end end |
#no_such_window_error ⇒ Object
131 132 133 |
# File 'lib/capybara/cuprite/driver.rb', line 131 def no_such_window_error Ferrum::NoSuchPageError end |
#open_new_window ⇒ Object
124 125 126 127 128 129 |
# File 'lib/capybara/cuprite/driver.rb', line 124 def open_new_window target = browser.default_context.create_target target.maybe_sleep_if_new_window target.page = Page.new(target.client, context_id: target.context_id, target_id: target.id) target.page end |
#pause ⇒ Object
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
# File 'lib/capybara/cuprite/driver.rb', line 288 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 = Thread.new do IO.copy_stream($stdin, write) write.close end warn "Cuprite execution paused. Press enter (or run 'kill -CONT #{Process.pid}') to continue." signal = false old_trap = trap("SIGCONT") do signal = true warn "\nSignal SIGCONT received" end keyboard = read.wait_readable(1) until keyboard || signal # wait for data on STDIN or signal SIGCONT received unless signal begin input = read.read_nonblock(80) # clear out the read buffer puts unless input&.end_with?("\n") rescue EOFError, IO::WaitReadable # Ignore problems reading from STDIN. end end ensure thread.kill read.close trap("SIGCONT", old_trap) # Restore the previous signal handler, if there was one. warn "Continuing" end |
#remove_cookie(name, **options) ⇒ Object
259 260 261 262 263 |
# File 'lib/capybara/cuprite/driver.rb', line 259 def (name, **) [:domain] = default_domain if .empty? = .merge(name: name) browser..remove(**) end |
#render_base64(format = :png, options = {}) ⇒ Object
158 159 160 161 162 163 164 165 166 |
# File 'lib/capybara/cuprite/driver.rb', line 158 def render_base64(format = :png, = {}) if pdf?(nil, ) [:paperWidth] = @paper_size[:width].to_f if @paper_size [:paperHeight] = @paper_size[:height].to_f if @paper_size browser.pdf(encoding: :base64, **) else browser.screenshot(format: format, encoding: :base64, **) end end |
#reset! ⇒ Object
135 136 137 138 139 140 141 142 143 |
# File 'lib/capybara/cuprite/driver.rb', line 135 def reset! @zoom_factor = nil @paper_size = nil browser.url_blacklist = @options[:url_blacklist] browser.url_whitelist = @options[:url_whitelist] browser.raise_on_unhandled_modal = @options.fetch(:raise_on_unhandled_modal, false) browser.reset @started = false end |
#resize(width, height) ⇒ Object Also known as: resize_window
174 175 176 |
# File 'lib/capybara/cuprite/driver.rb', line 174 def resize(width, height) browser.resize(width: width, height: height) end |
#resize_window_to(handle, width, height) ⇒ Object
179 180 181 182 183 |
# File 'lib/capybara/cuprite/driver.rb', line 179 def resize_window_to(handle, width, height) within_window(handle) do resize(width, height) end end |
#response_headers ⇒ Object
243 244 245 |
# File 'lib/capybara/cuprite/driver.rb', line 243 def response_headers browser.network.response&.headers end |
#save_screenshot(path, options = {}) ⇒ Object Also known as: render
145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/capybara/cuprite/driver.rb', line 145 def save_screenshot(path, = {}) [:scale] = @zoom_factor if @zoom_factor if pdf?(path, ) [:paperWidth] = @paper_size[:width].to_f if @paper_size [:paperHeight] = @paper_size[:height].to_f if @paper_size browser.pdf(path: path, **) else browser.screenshot(path: path, **) end end |
#scroll_to(left, top) ⇒ Object
201 202 203 |
# File 'lib/capybara/cuprite/driver.rb', line 201 def scroll_to(left, top) browser.mouse.scroll_to(left, top) end |
#set_cookie(name, value, options = {}) ⇒ Object
251 252 253 254 255 256 257 |
# File 'lib/capybara/cuprite/driver.rb', line 251 def (name, value, = {}) = .dup [:name] ||= name [:value] ||= value [:domain] ||= default_domain browser..set(**) end |
#set_proxy(host, port, user = nil, password = nil, bypass = nil) ⇒ Object
223 224 225 |
# File 'lib/capybara/cuprite/driver.rb', line 223 def set_proxy(host, port, user = nil, password = nil, bypass = nil) @options.merge!(proxy: { host: host, port: port, user: user, password: password, bypass: bypass }) end |
#source ⇒ Object
66 67 68 |
# File 'lib/capybara/cuprite/driver.rb', line 66 def source browser.source.to_s end |
#switch_to_frame(locator) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# File 'lib/capybara/cuprite/driver.rb', line 109 def switch_to_frame(locator) handle = case locator when Capybara::Node::Element locator.native.description["frameId"] when Capybara::Cuprite::Node locator.description["frameId"] when :parent, :top locator end raise ArgumentError, "Unable to switch to frame from #{locator.class}" unless handle browser.switch_to_frame(handle) end |
#visit(url) ⇒ Object
57 58 59 60 |
# File 'lib/capybara/cuprite/driver.rb', line 57 def visit(url) @started = true browser.visit(url) end |
#wait? ⇒ Boolean
324 325 326 |
# File 'lib/capybara/cuprite/driver.rb', line 324 def wait? true end |
#wait_for_network_idle(**options) ⇒ Object
269 270 271 |
# File 'lib/capybara/cuprite/driver.rb', line 269 def wait_for_network_idle(**) browser.network.wait_for_idle(**) end |
#window_size(handle) ⇒ Object
189 190 191 192 193 |
# File 'lib/capybara/cuprite/driver.rb', line 189 def window_size(handle) within_window(handle) do evaluate_script("[window.innerWidth, window.innerHeight]") end end |
#zoom_factor=(value) ⇒ Object
168 169 170 |
# File 'lib/capybara/cuprite/driver.rb', line 168 def zoom_factor=(value) @zoom_factor = value.to_f end |