Skip to content

Commit

Permalink
Mouse events (#453)
Browse files Browse the repository at this point in the history
* Added support for move_mouse_to WebDriver command and implemented move_mouse_by function that supplements hover
* Added support for click-based mouse WebDriver commands: click (at the current mouse position), double_click (at the current mouse position), button_down, button_up
  • Loading branch information
jangromko authored and michallepicki committed Aug 14, 2019
1 parent c0ad66f commit 2678b5d
Show file tree
Hide file tree
Showing 19 changed files with 798 additions and 210 deletions.
35 changes: 35 additions & 0 deletions integration_test/cases/browser/button_down_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
defmodule Wallaby.Integration.Browser.ButtonDownTest do
use Wallaby.Integration.SessionCase, async: true
import Wallaby.Browser

setup %{session: session} do
{:ok, page: visit(session, "mouse_down_and_up.html")}
end

describe "button_down/2" do
test "clicks and holds left mouse button at the current cursor position", %{page: page} do
button_down_test(page, :left, "Left")
end

test "clicks and holds middle mouse button at the current cursor position", %{page: page} do
button_down_test(page, :middle, "Middle")
end

test "clicks and holds right mouse button at the current cursor position", %{page: page} do
button_down_test(page, :right, "Right")
end
end

defp button_down_test(page, button, expected_log_prefix) do
refute page
|> visible?(Query.text("#{expected_log_prefix} Down"))

assert page
|> hover(Query.text("Button 1"))
|> button_down(button)
|> visible?(Query.text("#{expected_log_prefix} Down"))

refute page
|> visible?(Query.text("#{expected_log_prefix} Up"))
end
end
65 changes: 65 additions & 0 deletions integration_test/cases/browser/button_up_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
defmodule Wallaby.Integration.Browser.ButtonUpTest do
use Wallaby.Integration.SessionCase, async: true
import Wallaby.Browser

setup %{session: session} do
{:ok, page: visit(session, "mouse_down_and_up.html")}
end

describe "button_down/2 releases previously held mouse button at the current cursor position" do
test "for left button", %{page: page} do
button_up_test(page, :left, "Left")
end

test "for middle button", %{page: page} do
button_up_test(page, :middle, "Middle")
end

test "for right button", %{page: page} do
button_up_test(page, :right, "Right")
end
end

describe "button_down/2 releases previously held mouse button if cursor is moved from the position where the buton was pressed" do
test "for left button", %{page: page} do
move_cursor_then_button_up_test(page, :left, "Left")
end

test "for middle button", %{page: page} do
move_cursor_then_button_up_test(page, :middle, "Middle")
end

test "for right button", %{page: page} do
move_cursor_then_button_up_test(page, :right, "Right")
end
end

defp button_up_test(page, button, expected_log_prefix) do
refute page
|> visible?(Query.text("#{expected_log_prefix} Up"))

assert page
|> hover(Query.text("Button 1"))
|> button_down(button)
|> button_up(button)
|> visible?(Query.text("#{expected_log_prefix} Up"))

refute page
|> visible?(Query.text("#{expected_log_prefix} Down"))
end

defp move_cursor_then_button_up_test(page, button, expected_log_prefix) do
refute page
|> visible?(Query.text("#{expected_log_prefix} Up"))

assert page
|> hover(Query.text("Button 1"))
|> button_down(button)
|> hover(Query.text("Button 2"))
|> button_up(button)
|> visible?(Query.text("#{expected_log_prefix} Up"))

refute page
|> visible?(Query.text("#{expected_log_prefix} Down"))
end
end
41 changes: 41 additions & 0 deletions integration_test/cases/browser/click_mouse_button_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
defmodule Wallaby.Integration.Browser.ClickMouseButtonTest do
use Wallaby.Integration.SessionCase, async: true

setup %{session: session} do
page = visit(session, "click.html")

{:ok, %{page: page}}
end

describe "click/2 for clicking at current mouse position" do
test "clicks left button", %{page: page} do
refute page
|> visible?(Query.text("Left"))

assert page
|> hover(Query.text("Click"))
|> click(:left)
|> visible?(Query.text("Left"))
end

test "clicks middle button", %{page: page} do
refute page
|> visible?(Query.text("Middle"))

assert page
|> hover(Query.text("Click"))
|> click(:middle)
|> visible?(Query.text("Middle"))
end

test "clicks right button", %{page: page} do
refute page
|> visible?(Query.text("Right"))

assert page
|> hover(Query.text("Click"))
|> click(:right)
|> visible?(Query.text("Right"))
end
end
end
22 changes: 11 additions & 11 deletions integration_test/cases/browser/click_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ defmodule Wallaby.Integration.Browser.ClickTest do
describe "click/2" do
test "accepts queries", %{page: page} do
assert page
|> click(Query.button("Submit button"))
|> click(Query.button("Submit button"))
end

test "can click invisible elements", %{page: page} do
assert page
|> click(Query.button("Invisible Button", visible: false))
|> click(Query.button("Invisible Button", visible: false))
end

test "can be chained/returns parent", %{page: page} do
Expand Down Expand Up @@ -78,16 +78,16 @@ defmodule Wallaby.Integration.Browser.ClickTest do
describe "click/2 with checkboxes" do
test "checking a checkbox", %{page: page} do
assert page
|> click( Query.checkbox("Checkbox 1") )
|> click( Query.checkbox("Checkbox 1") )
|> click(Query.checkbox("Checkbox 1"))
|> click(Query.checkbox("Checkbox 1"))

refute page
|> find(Query.checkbox("Checkbox 1"))
|> Element.selected?
|> find(Query.checkbox("Checkbox 1"))
|> Element.selected?()
end

test "escapes quotes", %{page: page} do
assert click(page, Query.checkbox("I'm a checkbox") )
assert click(page, Query.checkbox("I'm a checkbox"))
end

test "throw an error if a label exists but does not have a for attribute", %{page: page} do
Expand All @@ -104,16 +104,16 @@ defmodule Wallaby.Integration.Browser.ClickTest do
describe "click/2 with links" do
test "works with queries", %{page: page} do
assert page
|> visit("")
|> click(Query.link("Page 1"))
|> assert_has(Query.css(".blue"))
|> visit("")
|> click(Query.link("Page 1"))
|> assert_has(Query.css(".blue"))
end
end

describe "click/2 with buttons" do
test "works with queries", %{page: page} do
assert page
|> click(Query.button("Reset input"))
|> click(Query.button("Reset input"))
end
end
end
21 changes: 21 additions & 0 deletions integration_test/cases/browser/double_click_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
defmodule Wallaby.Integration.Browser.DoubleClickTest do
use Wallaby.Integration.SessionCase, async: true

setup %{session: session} do
page = visit(session, "click.html")

{:ok, %{page: page}}
end

describe "double_click/1" do
test "double-clicks left mouse button at the current cursor position", %{page: page} do
refute page
|> visible?(Query.text("Double"))

assert page
|> hover(Query.text("Click"))
|> double_click()
|> visible?(Query.text("Double"))
end
end
end
6 changes: 3 additions & 3 deletions integration_test/cases/browser/hover_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ defmodule Wallaby.Integration.Browser.HoverTest do
use Wallaby.Integration.SessionCase, async: true

setup %{session: session} do
{:ok, page: visit(session, "hover.html")}
{:ok, page: visit(session, "move_mouse.html")}
end

describe "hover/2" do
test "hovers over the specified element", %{page: page} do
refute page
|> visible?(Query.text("HI"))
|> visible?(Query.text("B"))

assert page
|> hover(Query.css(".group"))
|> visible?(Query.text("HI"))
|> visible?(Query.text("B"))
end
end
end
20 changes: 20 additions & 0 deletions integration_test/cases/browser/move_mouse_by_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
defmodule Wallaby.Integration.Browser.MoveMouseByTest do
use Wallaby.Integration.SessionCase, async: true
import Wallaby.Browser

setup %{session: session} do
{:ok, page: visit(session, "move_mouse.html")}
end

describe "move_mouse_by/3" do
test "moves mouse cursor by the given offset from the current position", %{page: page} do
refute page
|> visible?(Query.text("B"))

assert page
|> hover(Query.text("A"))
|> move_mouse_by(40, 68)
|> visible?(Query.text("B"))
end
end
end
6 changes: 3 additions & 3 deletions integration_test/cases/element/hover_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ defmodule Wallaby.Integration.Element.HoverTest do
use Wallaby.Integration.SessionCase, async: true

setup %{session: session} do
{:ok, page: visit(session, "hover.html")}
{:ok, page: visit(session, "move_mouse.html")}
end

describe "hover/2" do
test "hovers over the specified element", %{page: page} do
page
|> find(Query.text("HI", visible: false), fn el ->
|> find(Query.text("B", visible: false), fn el ->
refute Element.visible?(el)
end)
|> find(Query.css(".group"), fn el ->
Element.hover(el)
end)
|> find(Query.text("HI"), fn el ->
|> find(Query.text("B"), fn el ->
assert Element.visible?(el)
end)
end
Expand Down
5 changes: 5 additions & 0 deletions integration_test/chrome/all_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ Code.require_file "../tests.exs", __DIR__
# Additional test cases supported by chromedriver
Code.require_file "../cases/browser/file_test.exs", __DIR__
Code.require_file "../cases/browser/js_errors_test.exs", __DIR__
Code.require_file "../cases/browser/click_mouse_button_test.exs", __DIR__
Code.require_file "../cases/browser/double_click_test.exs", __DIR__
Code.require_file "../cases/browser/button_down_test.exs", __DIR__
Code.require_file "../cases/browser/button_up_test.exs", __DIR__
Code.require_file "../cases/browser/hover_test.exs", __DIR__
Code.require_file "../cases/element/hover_test.exs", __DIR__
Code.require_file "../cases/browser/move_mouse_by_test.exs", __DIR__
Code.require_file "../cases/browser/window_handles_test.exs", __DIR__
Code.require_file "../cases/browser/window_position_test.exs", __DIR__
2 changes: 2 additions & 0 deletions integration_test/selenium/all_test.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
Code.require_file "../tests.exs", __DIR__

# Additional test cases supported by selenium
Code.require_file "../cases/browser/double_click_test.exs", __DIR__
Code.require_file "../cases/browser/hover_test.exs", __DIR__
Code.require_file "../cases/element/hover_test.exs", __DIR__
Code.require_file "../cases/browser/move_mouse_by_test.exs", __DIR__
Code.require_file "../cases/browser/window_handles_test.exs", __DIR__
Code.require_file "../cases/browser/window_position_test.exs", __DIR__
39 changes: 39 additions & 0 deletions integration_test/support/pages/click.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!DOCTYPE HTML>
<html>

<body>

<button id="button" ondblclick="doubleClick()" oncontextmenu="event.preventDefault();">Click</button>
<p id="log"></p>

<script>
function doubleClick() {
document.querySelector('#log').textContent = "Double";
}

let button = document.querySelector('#button');
let log = document.querySelector('#log');
button.addEventListener('mouseup', logMouseButton);

function logMouseButton(e) {
if (typeof e === 'object') {
switch (e.button) {
case 0:
log.textContent = 'Left';
break;
case 1:
log.textContent = 'Middle';
break;
case 2:
log.textContent = 'Right';
break;
default:
log.textContent = `Unknown`;
}
}
}
</script>

</body>

</html>
25 changes: 0 additions & 25 deletions integration_test/support/pages/hover.html

This file was deleted.

0 comments on commit 2678b5d

Please sign in to comment.