module Capybara::Selenium::Node::Html5Drag

Constants

ATTACH_FILE
DROP_FILE
DROP_STRING
HTML5_DRAG_DROP_SCRIPT
LEGACY_DRAG_CHECK
MOUSEDOWN_TRACKER

Public Instance Methods

drag_to(element, html5: nil, delay: 0.05, drop_modifiers: []) click to toggle source

Implement methods to emulate HTML5 drag and drop

# File lib/capybara/selenium/extensions/html5_drag.rb, line 7
def drag_to(element, html5: nil, delay: 0.05, drop_modifiers: [])
  drop_modifiers = Array(drop_modifiers)

  driver.execute_script MOUSEDOWN_TRACKER
  scroll_if_needed { browser_action.click_and_hold(native).perform }
  html5 = !driver.evaluate_script(LEGACY_DRAG_CHECK, self) if html5.nil?
  if html5
    perform_html5_drag(element, delay, drop_modifiers)
  else
    perform_legacy_drag(element, drop_modifiers)
  end
end

Private Instance Methods

html5_drop(*args) click to toggle source
# File lib/capybara/selenium/extensions/html5_drag.rb, line 36
def html5_drop(*args)
  if args[0].is_a? String
    input = driver.evaluate_script ATTACH_FILE
    input.set_file(args)
    driver.execute_script DROP_FILE, self, input
  else
    items = args.flat_map do |arg|
      arg.map { |(type, data)| { type: type, data: data } }
    end
    driver.execute_script DROP_STRING, items, self
  end
end
perform_html5_drag(element, delay, drop_modifiers) click to toggle source
# File lib/capybara/selenium/extensions/html5_drag.rb, line 31
def perform_html5_drag(element, delay, drop_modifiers)
  driver.evaluate_async_script HTML5_DRAG_DROP_SCRIPT, self, element, delay * 1000, normalize_keys(drop_modifiers)
  browser_action.release.perform
end
perform_legacy_drag(element, drop_modifiers) click to toggle source
# File lib/capybara/selenium/extensions/html5_drag.rb, line 22
def perform_legacy_drag(element, drop_modifiers)
  element.scroll_if_needed do
    # browser_action.move_to(element.native).release.perform
    keys_down = modifiers_down(browser_action, drop_modifiers)
    keys_up = modifiers_up(keys_down.move_to(element.native).release, drop_modifiers)
    keys_up.perform
  end
end