Module: Capybara::Screenshot::BrowserHelpers

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

Constant Summary collapse

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

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