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/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, Runtime Classes: Client, Page, Process, Targets, WebSocket

Constant Summary collapse

TIMEOUT =
5
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.



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/capybara/cuprite/browser.rb', line 39

def initialize(options = nil)
  @options = Hash(options)
  @logger, @timeout = @options.values_at(:logger, :timeout)

  if ENV["CUPRITE_DEBUG"]
    STDOUT.sync = true
    @logger = STDOUT
  end

  start
end

Instance Attribute Details

#headersObject

Returns the value of attribute headers.



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

def headers
  @headers
end

#loggerObject (readonly)

Returns the value of attribute logger.



36
37
38
# File 'lib/capybara/cuprite/browser.rb', line 36

def logger
  @logger
end

#processObject (readonly)

Returns the value of attribute process.



36
37
38
# File 'lib/capybara/cuprite/browser.rb', line 36

def process
  @process
end

#timeoutObject



58
59
60
# File 'lib/capybara/cuprite/browser.rb', line 58

def timeout
  @timeout || TIMEOUT
end

Class Method Details

.start(*args) ⇒ Object



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

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

Instance Method Details

#accept_confirmObject

Raises:

  • (NotImplementedError)


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

def accept_confirm
  raise NotImplementedError
end

#accept_prompt(response) ⇒ Object

Raises:

  • (NotImplementedError)


206
207
208
# File 'lib/capybara/cuprite/browser.rb', line 206

def accept_prompt(response)
  raise NotImplementedError
end

#add_header(header, permanent: true) ⇒ Object



145
146
147
# File 'lib/capybara/cuprite/browser.rb', line 145

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

#add_headers(headers, permanent: true) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/capybara/cuprite/browser.rb', line 131

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

#clear_cookiesObject



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

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

#clear_memory_cacheObject



194
195
196
# File 'lib/capybara/cuprite/browser.rb', line 194

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

#command(*args) ⇒ Object



238
239
240
241
242
243
244
# File 'lib/capybara/cuprite/browser.rb', line 238

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

#cookiesObject



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

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

#crashObject



234
235
236
# File 'lib/capybara/cuprite/browser.rb', line 234

def crash
  command("Browser.crash")
end

#delete_text(node) ⇒ Object



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

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

#dismiss_confirmObject

Raises:

  • (NotImplementedError)


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

def dismiss_confirm
  raise NotImplementedError
end

#dismiss_promptObject

Raises:

  • (NotImplementedError)


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

def dismiss_prompt
  raise NotImplementedError
end

#extensionsObject



51
52
53
54
55
56
# File 'lib/capybara/cuprite/browser.rb', line 51

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

#find(method, selector) ⇒ Object



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

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

#find_within(node, method, selector) ⇒ Object



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

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

Raises:

  • (NotImplementedError)


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

def modal_message
  raise NotImplementedError
end

#page_settings=(settings) ⇒ Object

Raises:

  • (NotImplementedError)


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

def page_settings=(settings)
  raise NotImplementedError
end

#parents(node) ⇒ Object



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

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

#quitObject



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

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


167
168
169
# File 'lib/capybara/cuprite/browser.rb', line 167

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

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



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

def render(path, _options = {})
  # check_render_options!(options)
  # options[:full] = !!options[:full]
  data = Base64.decode64(render_base64)
  File.open(path.to_s, "wb") { |f| f.write(data) }
end

#render_base64(format = "png", _options = {}) ⇒ Object



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

def render_base64(format = "png", _options = {})
  # check_render_options!(options)
  # options[:full] = !!options[:full]
  page.command("Page.captureScreenshot", format: format)["data"]
end

#resetObject



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

def reset
  @headers = {}
  targets.reset
end

#restartObject



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

def restart
  quit
  start
end

#select_file(node, value) ⇒ Object

Raises:

  • (NotImplementedError)


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

def select_file(node, value)
  raise NotImplementedError
end


163
164
165
# File 'lib/capybara/cuprite/browser.rb', line 163

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

#set_http_auth(user, password) ⇒ Object

Raises:

  • (NotImplementedError)


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

def set_http_auth(user, password)
  raise NotImplementedError
end

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



149
150
151
152
153
154
155
156
# File 'lib/capybara/cuprite/browser.rb', line 149

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

Raises:

  • (NotImplementedError)


118
119
120
# File 'lib/capybara/cuprite/browser.rb', line 118

def set_paper_size(size)
  raise NotImplementedError
end

#set_proxy(ip, port, type, user, password) ⇒ Object

Raises:

  • (NotImplementedError)


122
123
124
# File 'lib/capybara/cuprite/browser.rb', line 122

def set_proxy(ip, port, type, user, password)
  raise NotImplementedError
end

#set_zoom_factor(zoom_factor) ⇒ Object

Raises:

  • (NotImplementedError)


114
115
116
# File 'lib/capybara/cuprite/browser.rb', line 114

def set_zoom_factor(zoom_factor)
  raise NotImplementedError
end

#sourceObject

Raises:

  • (NotImplementedError)


62
63
64
# File 'lib/capybara/cuprite/browser.rb', line 62

def source
  raise NotImplementedError
end

#targetsObject



246
247
248
# File 'lib/capybara/cuprite/browser.rb', line 246

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

#url_blacklist=(blacklist) ⇒ Object



188
189
190
191
192
# File 'lib/capybara/cuprite/browser.rb', line 188

def url_blacklist=(blacklist)
  # FIXME: We have to change the format and make it compatible with Chrome not PhantomJS
  @url_blacklist = Array(blacklist).map { |p| { urlPattern: p.include?("*") ? p : "*#{p}*" } }
  page.command("Network.setRequestInterception", patterns: @url_blacklist)
end

#url_whitelist=(whitelist) ⇒ Object



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

def url_whitelist=(whitelist)
  @url_whitelist = Array(whitelist).map { |p| { urlPattern: p } }
  page.command("Network.setRequestInterception", patterns: @url_whitelist)
end

#visible_text(node) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/capybara/cuprite/browser.rb', line 80

def visible_text(node)
  begin
    evaluate_on(node: node, expr: "_cuprite.visibleText(this)")
  rescue BrowserError => e
    # FIXME: ObsoleteNode first arg is node, so it should be in node class
    if e.message == "No node with given id found"
      raise ObsoleteNode.new(self, e.response)
    end

    raise
  end
end