Class: Capybara::Cuprite::Browser

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/capybara/cuprite/browser.rb,
lib/capybara/cuprite/browser/dom.rb,
lib/capybara/cuprite/browser/net.rb,
lib/capybara/cuprite/browser/page.rb,
lib/capybara/cuprite/browser/frame.rb,
lib/capybara/cuprite/browser/input.rb,
lib/capybara/cuprite/browser/client.rb,
lib/capybara/cuprite/browser/process.rb,
lib/capybara/cuprite/browser/runtime.rb,
lib/capybara/cuprite/browser/targets.rb,
lib/capybara/cuprite/browser/web_socket.rb

Defined Under Namespace

Modules: DOM, Frame, Input, Net, Runtime Classes: Client, Page, Process, Targets, WebSocket

Constant Summary collapse

TIMEOUT =
5
WINDOW_SIZE =
[1024, 768].freeze
EXTENSIONS =
[
  File.expand_path("browser/javascripts/index.js", __dir__)
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = nil) ⇒ Browser

Returns a new instance of Browser.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/capybara/cuprite/browser.rb', line 43

def initialize(options = nil)
  # Doesn't work on MacOS, so we need to set it by CDP as well
  options ||= {}
  @window_size = options.fetch(:window_size, WINDOW_SIZE)
  @original_window_size = @window_size

  @options = Hash(options.merge(window_size: @window_size))
  @logger, @timeout = @options.values_at(:logger, :timeout)
  @js_errors = @options.fetch(:js_errors, false)
  @slowmo = @options[:slowmo]

  self.url_blacklist = @options[:url_blacklist]
  self.url_whitelist = @options[:url_whitelist]

  if ENV["CUPRITE_DEBUG"] && !@logger
    STDOUT.sync = true
    @logger = STDOUT
    @options[:logger] = @logger
  end

  @options.freeze

  start
end

Instance Attribute Details

#headersObject

Returns the value of attribute headers.



20
21
22
# File 'lib/capybara/cuprite/browser.rb', line 20

def headers
  @headers
end

#js_errorsObject (readonly)

Returns the value of attribute js_errors.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def js_errors
  @js_errors
end

#loggerObject (readonly)

Returns the value of attribute logger.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def logger
  @logger
end

#processObject (readonly)

Returns the value of attribute process.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def process
  @process
end

#slowmoObject (readonly)

Returns the value of attribute slowmo.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def slowmo
  @slowmo
end

#timeoutObject



75
76
77
# File 'lib/capybara/cuprite/browser.rb', line 75

def timeout
  @timeout || TIMEOUT
end

#url_blacklistObject

Returns the value of attribute url_blacklist.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def url_blacklist
  @url_blacklist
end

#url_whitelistObject

Returns the value of attribute url_whitelist.



39
40
41
# File 'lib/capybara/cuprite/browser.rb', line 39

def url_whitelist
  @url_whitelist
end

#window_sizeObject (readonly)

Returns the value of attribute window_size.



20
21
22
# File 'lib/capybara/cuprite/browser.rb', line 20

def window_size
  @window_size
end

Class Method Details

.start(*args) ⇒ Object



22
23
24
# File 'lib/capybara/cuprite/browser.rb', line 22

def self.start(*args)
  new(*args)
end

Instance Method Details

#add_header(header, permanent: true) ⇒ Object



157
158
159
# File 'lib/capybara/cuprite/browser.rb', line 157

def add_header(header, permanent: true)
  add_headers(header, permanent: permanent)
end

#add_headers(headers, permanent: true) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/capybara/cuprite/browser.rb', line 143

def add_headers(headers, permanent: true)
  if headers["Referer"]
    page.referrer = headers["Referer"]
    headers.delete("Referer") unless permanent
  end

  @headers.merge!(headers)
  user_agent = @headers["User-Agent"]
  accept_language = @headers["Accept-Language"]

  set_overrides(user_agent: user_agent, accept_language: accept_language)
  page.command("Network.setExtraHTTPHeaders", headers: @headers)
end

#browser_errorObject



223
224
225
# File 'lib/capybara/cuprite/browser.rb', line 223

def browser_error
  page.evaluate("_cuprite.browserError()")
end

#clear_cookiesObject



183
184
185
# File 'lib/capybara/cuprite/browser.rb', line 183

def clear_cookies
  page.command("Network.clearBrowserCookies")
end

#clear_memory_cacheObject



197
198
199
# File 'lib/capybara/cuprite/browser.rb', line 197

def clear_memory_cache
  page.command("Network.clearBrowserCache")
end

#command(*args) ⇒ Object



232
233
234
235
236
237
238
# File 'lib/capybara/cuprite/browser.rb', line 232

def command(*args)
  id = @client.command(*args)
  @client.wait(id: id)
rescue DeadBrowser
  restart
  raise
end

#cookiesObject



170
171
172
173
# File 'lib/capybara/cuprite/browser.rb', line 170

def cookies
  cookies = page.command("Network.getAllCookies")["cookies"]
  cookies.map { |c| [c["name"], Cookie.new(c)] }.to_h
end

#crashObject



219
220
221
# File 'lib/capybara/cuprite/browser.rb', line 219

def crash
  command("Browser.crash")
end

#delete_text(node) ⇒ Object



101
102
103
# File 'lib/capybara/cuprite/browser.rb', line 101

def delete_text(node)
  evaluate_on(node: node, expr: "_cuprite.deleteText(this)")
end

#extensionsObject



68
69
70
71
72
73
# File 'lib/capybara/cuprite/browser.rb', line 68

def extensions
  @extensions ||= begin
    exts = @options.fetch(:extensions, [])
    (EXTENSIONS + exts).map { |p| File.read(p) }
  end
end

#find(method, selector) ⇒ Object



87
88
89
# File 'lib/capybara/cuprite/browser.rb', line 87

def find(method, selector)
  find_all(method, selector)
end

#find_within(node, method, selector) ⇒ Object



91
92
93
94
95
# File 'lib/capybara/cuprite/browser.rb', line 91

def find_within(node, method, selector)
  resolved = page.command("DOM.resolveNode", nodeId: node["nodeId"])
  object_id = resolved.dig("object", "objectId")
  find_all(method, selector, { "objectId" => object_id })
end

#parents(node) ⇒ Object



83
84
85
# File 'lib/capybara/cuprite/browser.rb', line 83

def parents(node)
  evaluate_on(node: node, expr: "_cuprite.parents(this)", by_value: false)
end

#quitObject



213
214
215
216
217
# File 'lib/capybara/cuprite/browser.rb', line 213

def quit
  @client.close
  @process.stop
  @client = @process = @targets = nil
end


179
180
181
# File 'lib/capybara/cuprite/browser.rb', line 179

def remove_cookie(options)
  page.command("Network.deleteCookies", **options)
end

#render(path, options = {}) ⇒ Object



109
110
111
112
113
114
# File 'lib/capybara/cuprite/browser.rb', line 109

def render(path, options = {})
  format = options.delete(:format)
  options = options.merge(path: path)
  bin = Base64.decode64(render_base64(format, options))
  File.open(path.to_s, "wb") { |f| f.write(bin) }
end

#render_base64(format, options = {}) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/capybara/cuprite/browser.rb', line 116

def render_base64(format, options = {})
  options = render_options(format, options)

  if options[:format].to_s == "pdf"
    options = {}
    options[:paperWidth] = @paper_size[:width].to_f if @paper_size
    options[:paperHeight] = @paper_size[:height].to_f if @paper_size
    options[:scale] = @zoom_factor if @zoom_factor
    page.command("Page.printToPDF", **options)
  else
    page.command("Page.captureScreenshot", **options)
  end.fetch("data")
end

#resetObject



201
202
203
204
205
206
# File 'lib/capybara/cuprite/browser.rb', line 201

def reset
  @headers = {}
  @zoom_factor = nil
  @window_size = @original_window_size
  targets.reset
end

#resize(**options) ⇒ Object



227
228
229
230
# File 'lib/capybara/cuprite/browser.rb', line 227

def resize(**options)
  @window_size = [options[:width], options[:height]]
  page.resize(**options)
end

#restartObject



208
209
210
211
# File 'lib/capybara/cuprite/browser.rb', line 208

def restart
  quit
  start
end

#select_file(node, value) ⇒ Object



105
106
107
# File 'lib/capybara/cuprite/browser.rb', line 105

def select_file(node, value)
  page.command("DOM.setFileInputFiles", nodeId: node["nodeId"], files: Array(value))
end


175
176
177
# File 'lib/capybara/cuprite/browser.rb', line 175

def set_cookie(cookie)
  page.command("Network.setCookie", **cookie)
end

#set_overrides(user_agent: nil, accept_language: nil, platform: nil) ⇒ Object



161
162
163
164
165
166
167
168
# File 'lib/capybara/cuprite/browser.rb', line 161

def set_overrides(user_agent: nil, accept_language: nil, platform: nil)
  options = Hash.new
  options[:userAgent] = user_agent if user_agent
  options[:acceptLanguage] = accept_language if accept_language
  options[:platform] if platform

  page.command("Network.setUserAgentOverride", **options) if !options.empty?
end

#set_paper_size(size) ⇒ Object



134
135
136
# File 'lib/capybara/cuprite/browser.rb', line 134

def set_paper_size(size)
  @paper_size = size
end

#set_zoom_factor(zoom_factor) ⇒ Object



130
131
132
# File 'lib/capybara/cuprite/browser.rb', line 130

def set_zoom_factor(zoom_factor)
  @zoom_factor = zoom_factor.to_f
end

#sourceObject

Raises:

  • (NotImplementedError)


79
80
81
# File 'lib/capybara/cuprite/browser.rb', line 79

def source
  raise NotImplementedError
end

#targetsObject



240
241
242
# File 'lib/capybara/cuprite/browser.rb', line 240

def targets
  @targets ||= Targets.new(self)
end

#visible_text(node) ⇒ Object



97
98
99
# File 'lib/capybara/cuprite/browser.rb', line 97

def visible_text(node)
  evaluate_on(node: node, expr: "_cuprite.visibleText(this)")
end