diff --git a/lib/capybara/cuprite/browser.rb b/lib/capybara/cuprite/browser.rb index 162cbb8..5aad56d 100644 --- a/lib/capybara/cuprite/browser.rb +++ b/lib/capybara/cuprite/browser.rb @@ -139,26 +139,33 @@ def source raise NotImplementedError end - def drag(node, other, steps, delay = nil) + def drag(node, other, steps, delay = nil, scroll = true) x1, y1 = node.find_position - x2, y2 = other.find_position mouse.move(x: x1, y: y1) mouse.down sleep delay if delay + + other.scroll_into_view if scroll + + x2, y2 = other.find_position mouse.move(x: x2, y: y2, steps: steps) + mouse.up end - def drag_by(node, x, y, steps, delay = nil) + def drag_by(node, dx, dy, steps, delay = nil, scroll = true) x1, y1 = node.find_position - x2 = x1 + x - y2 = y1 + y mouse.move(x: x1, y: y1) mouse.down + sleep delay if delay - mouse.move(x: x2, y: y2, steps: steps) + + 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 diff --git a/lib/capybara/cuprite/node.rb b/lib/capybara/cuprite/node.rb index db0e125..f7e68f4 100644 --- a/lib/capybara/cuprite/node.rb +++ b/lib/capybara/cuprite/node.rb @@ -161,14 +161,16 @@ def hover def drag_to(other, **options) options[:steps] ||= 1 + options[:scroll] = true unless options.key?(:scroll) - command(:drag, other.node, options[:steps], options[:delay]) + command(:drag, other.node, options[:steps], options[:delay], options[:scroll]) end def drag_by(x, y, **options) options[:steps] ||= 1 + options[:scroll] = true unless options.key?(:scroll) - command(:drag_by, x, y, options[:steps], options[:delay]) + command(:drag_by, x, y, options[:steps], options[:delay], options[:scroll]) end def trigger(event) diff --git a/spec/features/session_spec.rb b/spec/features/session_spec.rb index db0e640..277d538 100644 --- a/spec/features/session_spec.rb +++ b/spec/features/session_spec.rb @@ -592,13 +592,13 @@ top_before = @session.evaluate_script(%($("#drag_by .draggable").position().top)) left_before = @session.evaluate_script(%($("#drag_by .draggable").position().left)) - draggable.native.drag_by(15, 15) + draggable.native.drag_by(8000, 8000) top_after = @session.evaluate_script(%($("#drag_by .draggable").position().top)) left_after = @session.evaluate_script(%($("#drag_by .draggable").position().left)) - expect(top_after).to eq(top_before + 15) - expect(left_after).to eq(left_before + 15) + expect(top_after).to eq(top_before + 8000) + expect(left_after).to eq(left_before + 8000) end end diff --git a/spec/support/views/drag.erb b/spec/support/views/drag.erb index d25f42e..0e333ed 100644 --- a/spec/support/views/drag.erb +++ b/spec/support/views/drag.erb @@ -18,7 +18,7 @@ } #drag_by div{ position: absolute; left: 0; } #draggable { width: 60px; height: 60px; padding: 0.2em; } - #droppable { width: 100px; height: 100px; padding: 0.2em; } + #droppable { width: 100px; height: 100px; padding: 0.2em; margin: 9000px; }