Class: Capybara::Cuprite::Driver

Inherits:
Driver::Base
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/capybara/cuprite/driver.rb

Constant Summary collapse

DEFAULT_MAXIMIZE_SCREEN_SIZE =
[1366, 768].freeze
EXTENSION =
File.expand_path("javascripts/index.js", __dir__)

Instance Attribute Summary collapse

Instance Method Summary collapse

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, options = {})
  @app     = app
  @options = 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.expand_path(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

#appObject (readonly)

Returns the value of attribute app.



24
25
26
# File 'lib/capybara/cuprite/driver.rb', line 24

def app
  @app
end

#optionsObject (readonly)

Returns the value of attribute options.



24
25
26
# File 'lib/capybara/cuprite/driver.rb', line 24

def options
  @options
end

#paper_size=(value) ⇒ Object (writeonly)

Sets the attribute paper_size

Parameters:

  • value

    the value to set the attribute paper_size to.



172
173
174
# File 'lib/capybara/cuprite/driver.rb', line 172

def paper_size=(value)
  @paper_size = value
end

#screen_sizeObject (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, options = {})
  case type
  when :alert, :confirm
    browser.accept_confirm
  when :prompt
    browser.accept_prompt(options[:with])
  end

  yield if block_given?

  browser.find_modal(options)
end

#active_elementObject



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: authorize



277
278
279
280
281
# File 'lib/capybara/cuprite/driver.rb', line 277

def basic_authorize(user, password)
  browser.network.authorize(user: user, password: password) do |request, _index, _total|
    request.continue
  end
end

#browserObject



53
54
55
# File 'lib/capybara/cuprite/driver.rb', line 53

def browser
  @browser ||= Browser.new(@options)
end

#clear_cookiesObject



265
266
267
# File 'lib/capybara/cuprite/driver.rb', line 265

def clear_cookies
  browser.cookies.clear
end

#clear_memory_cacheObject



273
274
275
# File 'lib/capybara/cuprite/driver.rb', line 273

def clear_memory_cache
  browser.network.clear(:cache)
end

#clear_network_trafficObject



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

#cookiesObject



247
248
249
# File 'lib/capybara/cuprite/driver.rb', line 247

def cookies
  browser.cookies.all
end

#debugObject



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, options = {})
  case type
  when :confirm
    browser.dismiss_confirm
  when :prompt
    browser.dismiss_prompt
  end

  yield if block_given?

  browser.find_modal(options)
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_titleObject



70
71
72
# File 'lib/capybara/cuprite/driver.rb', line 70

def frame_title
  evaluate_script("document.title")
end

#frame_urlObject



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

#headersObject



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_errorsObject



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

Returns:

  • (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_errorObject



131
132
133
# File 'lib/capybara/cuprite/driver.rb', line 131

def no_such_window_error
  Ferrum::NoSuchPageError
end

#open_new_windowObject



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

#pauseObject



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


259
260
261
262
263
# File 'lib/capybara/cuprite/driver.rb', line 259

def remove_cookie(name, **options)
  options[:domain] = default_domain if options.empty?
  options = options.merge(name: name)
  browser.cookies.remove(**options)
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, options = {})
  if pdf?(nil, options)
    options[:paperWidth] = @paper_size[:width].to_f if @paper_size
    options[:paperHeight] = @paper_size[:height].to_f if @paper_size
    browser.pdf(encoding: :base64, **options)
  else
    browser.screenshot(format: format, encoding: :base64, **options)
  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_headersObject



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, options = {})
  options[:scale] = @zoom_factor if @zoom_factor

  if pdf?(path, options)
    options[:paperWidth] = @paper_size[:width].to_f if @paper_size
    options[:paperHeight] = @paper_size[:height].to_f if @paper_size
    browser.pdf(path: path, **options)
  else
    browser.screenshot(path: path, **options)
  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


251
252
253
254
255
256
257
# File 'lib/capybara/cuprite/driver.rb', line 251

def set_cookie(name, value, options = {})
  options = options.dup
  options[:name]   ||= name
  options[:value]  ||= value
  options[:domain] ||= default_domain
  browser.cookies.set(**options)
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

#sourceObject



66
67
68
# File 'lib/capybara/cuprite/driver.rb', line 66

def source
  browser.source.to_s
end

#switch_to_frame(locator) ⇒ Object

Raises:

  • (ArgumentError)


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

Returns:

  • (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(**options)
  browser.network.wait_for_idle(**options)
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