Module: Capybara::Screenshot::BrowserHelpers

Defined in:
lib/capybara/screenshot/diff/browser_helpers.rb

Constant Summary collapse

IMAGE_WAIT_SCRIPT =
"function pending_image() {\n  const images = document.images\n  for (var i = 0; i < images.length; i++) {\n    if (!images[i].complete && images[i].loading !== \"lazy\") {\n        return images[i].src\n    }\n  }\n  return false\n}(window)\n"
HIDE_CARET_SCRIPT =
"if (!document.getElementById('csdHideCaretStyle')) {\n  let style = document.createElement('style');\n  style.setAttribute('id', 'csdHideCaretStyle');\n  document.head.appendChild(style);\n  let styleSheet = style.sheet;\n  styleSheet.insertRule(\"* { caret-color: transparent !important; }\", 0);\n}\n"
FIND_ACTIVE_ELEMENT_SCRIPT =
"function activeElement(){\n  const ae = document.activeElement; \n  if (ae.nodeName === \"INPUT\" || ae.nodeName === \"TEXTAREA\") { \n    ae.blur();      \n    return ae;\n  }\n  return null;\n}(window);\n"
GET_BOUNDING_CLIENT_RECT_SCRIPT =
"[\n  this.getBoundingClientRect().left,\n  this.getBoundingClientRect().top,\n  this.getBoundingClientRect().right,\n  this.getBoundingClientRect().bottom\n]\n"

Class Method Summary collapse

Class Method Details

.all_visible_regions_for(selector) ⇒ Object



87
88
89
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 87

def self.all_visible_regions_for(selector)
  BrowserHelpers.session.all(selector, visible: true).map(&method(:region_for))
end

.blur_from_focused_elementObject



74
75
76
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 74

def self.blur_from_focused_element
  session.evaluate_script(FIND_ACTIVE_ELEMENT_SCRIPT)
end

.bounds_for_css(*css_selectors) ⇒ Object



31
32
33
34
35
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 31

def self.bounds_for_css(*css_selectors)
  css_selectors.reduce([]) do |regions, selector|
    regions.concat(all_visible_regions_for(selector))
  end
end

.current_capybara_driver_classObject



103
104
105
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 103

def self.current_capybara_driver_class
  session.driver.class
end

.hide_caretObject



59
60
61
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 59

def self.hide_caret
  session.execute_script(HIDE_CARET_SCRIPT)
end

.pending_image_to_loadObject



99
100
101
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 99

def self.pending_image_to_load
  BrowserHelpers.session.evaluate_script(IMAGE_WAIT_SCRIPT)
end

.region_for(element) ⇒ Object



91
92
93
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 91

def self.region_for(element)
  element.evaluate_script(GET_BOUNDING_CLIENT_RECT_SCRIPT).map { |point| point.negative? ? 0 : point.ceil.to_i }
end

.resize_to(window_size) ⇒ Object



14
15
16
17
18
19
20
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 14

def self.resize_to(window_size)
  if session.driver.respond_to?(:resize)
    session.driver.resize(*window_size)
  elsif BrowserHelpers.selenium?
    session.driver.browser.manage.window.resize_to(*window_size)
  end
end

.resize_window_if_neededObject



8
9
10
11
12
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 8

def self.resize_window_if_needed
  if ::Capybara::Screenshot.respond_to?(:window_size) && ::Capybara::Screenshot.window_size
    resize_to(::Capybara::Screenshot.window_size)
  end
end

.selenium?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 22

def self.selenium?
  current_capybara_driver_class <= Capybara::Selenium::Driver
end

.sessionObject



95
96
97
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 95

def self.session
  Capybara.current_session
end

.window_size_is_wrong?(expected_window_size = nil) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
29
# File 'lib/capybara/screenshot/diff/browser_helpers.rb', line 26

def self.window_size_is_wrong?(expected_window_size = nil)
  selenium? && expected_window_size &&
    session.driver.browser.manage.window.size != ::Selenium::WebDriver::Dimension.new(*expected_window_size)
end