diff --git a/lib/capybara/node/element.rb b/lib/capybara/node/element.rb index 8754c02b..fcd66977 100644 --- a/lib/capybara/node/element.rb +++ b/lib/capybara/node/element.rb @@ -396,8 +396,13 @@ module Capybara # # @param [Capybara::Node::Element] node The element to drag to # @param [Hash] options Driver specific options for dragging. May not be supported by all drivers. + # @option options [Numeric] :delay (0.05) When using Chrome/Firefox with Selenium and HTML5 dragging this is the number + # of seconds between each stage of the drag. + # @option options [Boolean] :html5 When using Chrome/Firefox with Selenium enables to force the use of HTML5 + # (true) or legacy (false) dragging. If not specified the driver will attempt to + # detect the correct method to use. # - # @return [Capybara::Node::Element] The element + # @return [Capybara::Node::Element] The dragged element def drag_to(node, **options) synchronize { base.drag_to(node.base, **options) } self diff --git a/lib/capybara/selenium/extensions/html5_drag.rb b/lib/capybara/selenium/extensions/html5_drag.rb index 285e1023..9233f44f 100644 --- a/lib/capybara/selenium/extensions/html5_drag.rb +++ b/lib/capybara/selenium/extensions/html5_drag.rb @@ -4,13 +4,14 @@ class Capybara::Selenium::Node module Html5Drag # Implement methods to emulate HTML5 drag and drop - def drag_to(element, delay: 0.05) + def drag_to(element, html5: nil, delay: 0.05) driver.execute_script MOUSEDOWN_TRACKER scroll_if_needed { browser_action.click_and_hold(native).perform } - if driver.evaluate_script(LEGACY_DRAG_CHECK, self) - perform_legacy_drag(element) - else + html5 = !driver.evaluate_script(LEGACY_DRAG_CHECK, self) if html5.nil? + if html5 perform_html5_drag(element, delay) + else + perform_legacy_drag(element) end end