Class: Capybara::Cuprite::Browser

Inherits:
Ferrum::Browser show all
Extended by:
Forwardable
Defined in:
lib/capybara/cuprite/browser.rb

Constant Summary collapse

DRAG_HTML5_JS =
File.read(File.expand_path("javascripts/drag.js", __dir__))

Instance Method Summary collapse

Constructor Details

#initialize(options = nil) ⇒ Browser

Returns a new instance of Browser.



16
17
18
19
20
21
22
23
24
# File 'lib/capybara/cuprite/browser.rb', line 16

def initialize(options = nil)
  super

  @options.raise_on_unhandled_modal = options&.dig(:raise_on_unhandled_modal)
  @options.url_blacklist = prepare_wildcards(options&.dig(:url_blacklist))
  @options.url_whitelist = prepare_wildcards(options&.dig(:url_whitelist))

  @page = nil
end

Instance Method Details

#active_elementObject



142
143
144
# File 'lib/capybara/cuprite/browser.rb', line 142

def active_element
  evaluate("document.activeElement")
end

#all_text(node) ⇒ Object



262
263
264
# File 'lib/capybara/cuprite/browser.rb', line 262

def all_text(node)
  node.text
end

#attribute(node, name) ⇒ Object



238
239
240
# File 'lib/capybara/cuprite/browser.rb', line 238

def attribute(node, name)
  evaluate_on(node: node, expression: %(_cuprite.getAttribute(this, "#{name}")))
end

#attributes(node) ⇒ Object



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

def attributes(node)
  value = evaluate_on(node: node, expression: "_cuprite.getAttributes(this)")
  JSON.parse(value)
end

#browser_errorObject



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

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

#close_window(target_id) ⇒ Object

Raises:

  • (Ferrum::NoSuchPageError)


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

def close_window(target_id)
  target = targets[target_id]
  raise Ferrum::NoSuchPageError unless target

  @page = ClosedPage.new if @page.target_id == target.id
  target.page.close
  targets.delete(target_id) # page.close is async, delete target asap
end

#commandObject



26
27
28
29
30
31
# File 'lib/capybara/cuprite/browser.rb', line 26

def command(...)
  super
rescue Ferrum::DeadBrowserError
  restart
  raise
end

#delete_text(node) ⇒ Object



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

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

#disabled?(node) ⇒ Boolean

Returns:

  • (Boolean)


250
251
252
# File 'lib/capybara/cuprite/browser.rb', line 250

def disabled?(node)
  evaluate_on(node: node, expression: "_cuprite.isDisabled(this)")
end

#drag(node, other, drop_modifiers, options = {}) ⇒ Object



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/capybara/cuprite/browser.rb', line 154

def drag(node, other, drop_modifiers, options = {})
  steps = options.fetch(:steps, 1)
  delay = options[:delay]
  scroll = options.fetch(:scroll, true)
  html5 = options[:html5]

  execute("_cuprite.dragMousedownTracker()")

  node.scroll_into_view if scroll
  x1, y1 = node.find_position

  mouse.move(x: x1, y: y1)
  mouse.down
  sleep delay if delay

  html5 = !evaluate_on(node: node, expression: "_cuprite.legacyDragCheck(this)") if html5.nil?

  if html5
    drag_html5(node, other, drop_modifiers, delay)
  else
    modifiers = keyboard.modifiers(drop_modifiers)

    other.scroll_into_view if scroll
    x2, y2 = other.find_position
    mouse.move(x: x2, y: y2, steps: steps)

    mouse.up(modifiers: modifiers)
  end
end

#drag_by(node, dx, dy, steps, delay = nil, scroll = true) ⇒ Object



190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/capybara/cuprite/browser.rb', line 190

def drag_by(node, dx, dy, steps, delay = nil, scroll = true)
  x1, y1 = node.find_position

  mouse.move(x: x1, y: y1)
  mouse.down

  sleep delay if delay

  evaluate("window.scrollBy(#{dx}, #{dy})") if scroll # should be extracted to Mouse#scroll_by in ferrum

  x2, y2 = node.find_position
  mouse.move(x: x2 + dx, y: y2 + dy, steps: steps)
  mouse.up
end

#drag_html5(node, other, drop_modifiers, delay) ⇒ Object



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

def drag_html5(node, other, drop_modifiers, delay)
  keys = drop_modifiers.map(&:to_s)
  evaluate_async(DRAG_HTML5_JS, timeout, node, other, (delay || 0.05) * 1000, keys)
  mouse.up
end

#drop(node, *args) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
# File 'lib/capybara/cuprite/browser.rb', line 205

def drop(node, *args)
  if args[0].is_a?(String)
    execute("_cuprite.attachDropInput()")
    input = find(:css, "#_cuprite_drop_file").first
    select_file(input, args)
    evaluate_on(node: node, expression: "_cuprite.dropFile(this)")
  else
    strings = args.flat_map { |arg| arg.map { |type, data| { "type" => type, "data" => data } } }
    evaluate_on(node: node, expression: "_cuprite.dropString(#{strings.to_json}, this)")
  end
end

#find(method, selector) ⇒ Object



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

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

#find_within(node, method, selector) ⇒ Object



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

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

#obscured?(node) ⇒ Boolean

Returns:

  • (Boolean)


258
259
260
# File 'lib/capybara/cuprite/browser.rb', line 258

def obscured?(node)
  evaluate_on(node: node, expression: "_cuprite.isObscured(this)")
end

#pageObject

Raises:

  • (Ferrum::NoSuchPageError)


33
34
35
36
37
# File 'lib/capybara/cuprite/browser.rb', line 33

def page
  raise Ferrum::NoSuchPageError if @page&.closed?

  @page ||= attach_page
end

#parents(node) ⇒ Object



221
222
223
# File 'lib/capybara/cuprite/browser.rb', line 221

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

#path(node) ⇒ Object



254
255
256
# File 'lib/capybara/cuprite/browser.rb', line 254

def path(node)
  evaluate_on(node: node, expression: "_cuprite.path(this)")
end

#property(node, name) ⇒ Object



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

def property(node, name)
  node.property(name)
end

#quitObject



45
46
47
48
# File 'lib/capybara/cuprite/browser.rb', line 45

def quit
  super
  @page = nil
end

#raise_on_unhandled_modalObject



55
56
57
# File 'lib/capybara/cuprite/browser.rb', line 55

def raise_on_unhandled_modal
  @options.raise_on_unhandled_modal
end

#raise_on_unhandled_modal=(value) ⇒ Object



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

def raise_on_unhandled_modal=(value)
  @options.raise_on_unhandled_modal = value
end

#resetObject



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

def reset
  super
  @options.reset_window_size
  @page = nil
end

#resize(**options) ⇒ Object



50
51
52
53
# File 'lib/capybara/cuprite/browser.rb', line 50

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

#select_file(node, value) ⇒ Object



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

def select_file(node, value)
  node.select_file(value)
end

#sourceObject

Raises:

  • (NotImplementedError)


150
151
152
# File 'lib/capybara/cuprite/browser.rb', line 150

def source
  raise NotImplementedError
end

#status_codeObject



89
90
91
# File 'lib/capybara/cuprite/browser.rb', line 89

def status_code
  network.status
end

#switch_to_window(target_id) ⇒ Object

Raises:

  • (Ferrum::NoSuchPageError)


125
126
127
128
129
130
131
# File 'lib/capybara/cuprite/browser.rb', line 125

def switch_to_window(target_id)
  target = targets[target_id]
  raise Ferrum::NoSuchPageError unless target

  @page = attach_page(target.id)
  @page.activate
end

#url_blacklistObject Also known as: url_blocklist



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

def url_blacklist
  @options.url_blacklist
end

#url_blacklist=(patterns) ⇒ Object Also known as: url_blocklist=



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

def url_blacklist=(patterns)
  @options.url_blacklist = prepare_wildcards(patterns)
  page.network.blacklist = @options.url_blacklist if @client && @options.url_blacklist.any?
end

#url_whitelistObject Also known as: url_allowlist



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

def url_whitelist
  @options.url_whitelist
end

#url_whitelist=(patterns) ⇒ Object Also known as: url_allowlist=



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

def url_whitelist=(patterns)
  @options.url_whitelist = prepare_wildcards(patterns)
  page.network.whitelist = @options.url_whitelist if @client && @options.url_whitelist.any?
end

#value(node) ⇒ Object



242
243
244
# File 'lib/capybara/cuprite/browser.rb', line 242

def value(node)
  evaluate_on(node: node, expression: "_cuprite.value(this)")
end

#visible?(node) ⇒ Boolean

Returns:

  • (Boolean)


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

def visible?(node)
  evaluate_on(node: node, expression: "_cuprite.isVisible(this)")
end

#visible_text(node) ⇒ Object



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

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

#visit(*args) ⇒ Object



85
86
87
# File 'lib/capybara/cuprite/browser.rb', line 85

def visit(*args)
  goto(*args)
end

#window_handleObject



107
108
109
# File 'lib/capybara/cuprite/browser.rb', line 107

def window_handle
  page.target_id
end

#window_handlesObject



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

def window_handles
  targets.keys
end

#within_window(locator = nil) ⇒ Object



115
116
117
118
119
120
121
122
123
# File 'lib/capybara/cuprite/browser.rb', line 115

def within_window(locator = nil)
  original = window_handle
  raise Ferrum::NoSuchPageError unless window_handles.include?(locator)

  switch_to_window(locator)
  yield
ensure
  switch_to_window(original)
end