Mouse actions
一个鼠标仅可以完成3个操作: 按住按钮,松开按钮,还有移动光标。 Selenium组合了常见的操作并提供了方便的方法。
按住鼠标左键
这个方法包含2个操作,首先将光标移动到被操作元素的正中心,然后按下鼠标左键不松开。 这对于聚焦一个特殊元素很有用:
WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
let clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.move({origin: clickable}).press().perform();
/examples/javascript/test/actionsApi/mouse/clickAndHold.spec.js
const {By, Builder} = require('selenium-webdriver'); describe('Click and hold', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Mouse move and mouseDown on an element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); let clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.move({origin: clickable}).press().perform(); }); });
.clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
点击鼠标左键
这个方法包含2个操作,首先将光标移动到被操作元素的正中心,然后按下鼠标左键后再松开。 另一种叫法“点击”:
WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
let click = driver.findElement(By.id("click")); const actions = driver.actions({async: true}); await actions.move({origin: click}).click().perform();
/examples/javascript/test/actionsApi/mouse/clickAndRelease.spec.js
const {By,Builder} = require('selenium-webdriver'); describe('Click and release', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Mouse move and click on an element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); let click = driver.findElement(By.id("click")); const actions = driver.actions({async: true}); await actions.move({origin: click}).click().perform(); }); });
.click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html"))
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
点击鼠标备用按钮
鼠标一共有5个定义好的按钮:
- 0 — 左键 (默认值)
- 1 — 中间键 (当前不支持)
- 2 — 右键
- 3 — X1 (返回) 按钮
- 4 — X2 (前进) 按钮
点击鼠标右键
这个方法包含2个操作,首先将光标移动到被操作元素的正中心,然后点击鼠标右键。 另一种叫法“点击右键”:
WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.contextClick(clickable).perform();
/examples/javascript/test/actionsApi/mouse/rightClick.spec.js
const {By, Builder} = require('selenium-webdriver'); const assert = require('assert'); describe('Right click', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Mouse move and right click on an element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.contextClick(clickable).perform(); await driver.sleep(500); const clicked = await driver.findElement(By.id('click-status')).getText(); assert.deepStrictEqual(clicked, `context-clicked`) }); });
.contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
点击鼠标回退键
除了这个没有更方便的方法,只是点击鼠标回退按钮
PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions));
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList());
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
driver.action .pointer_down(:back) .pointer_up(:back) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const actions = driver.actions({async: true}); await actions.press(Button.BACK).release(Button.BACK).perform()
/examples/javascript/test/actionsApi/mouse/backAndForwardClick.spec.js
const {By, Button, Browser, Builder} = require('selenium-webdriver'); const assert = require('assert'); describe('Should be able to perform BACK click and FORWARD click', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Back click', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); await driver.findElement(By.id("click")).click(); assert.deepStrictEqual(await driver.getTitle(), `We Arrive Here`) const actions = driver.actions({async: true}); await actions.press(Button.BACK).release(Button.BACK).perform() assert.deepStrictEqual(await driver.getTitle(), `BasicMouseInterfaceTest`) }); it('Forward click', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); await driver.findElement(By.id("click")).click(); await driver.navigate().back(); assert.deepStrictEqual(await driver.getTitle(), `BasicMouseInterfaceTest`) const actions = driver.actions({async: true}); await actions.press(Button.FORWARD).release(Button.FORWARD).perform() assert.deepStrictEqual(await driver.getTitle(), `We Arrive Here`) }); });
val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
点击鼠标前进键
除了这个没有更方便的方法,只是点击鼠标前进按钮
PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions));
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList());
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
driver.action .pointer_down(:forward) .pointer_up(:forward) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const actions = driver.actions({async: true}); await actions.press(Button.FORWARD).release(Button.FORWARD).perform()
/examples/javascript/test/actionsApi/mouse/backAndForwardClick.spec.js
const {By, Button, Browser, Builder} = require('selenium-webdriver'); const assert = require('assert'); describe('Should be able to perform BACK click and FORWARD click', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Back click', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); await driver.findElement(By.id("click")).click(); assert.deepStrictEqual(await driver.getTitle(), `We Arrive Here`) const actions = driver.actions({async: true}); await actions.press(Button.BACK).release(Button.BACK).perform() assert.deepStrictEqual(await driver.getTitle(), `BasicMouseInterfaceTest`) }); it('Forward click', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); await driver.findElement(By.id("click")).click(); await driver.navigate().back(); assert.deepStrictEqual(await driver.getTitle(), `BasicMouseInterfaceTest`) const actions = driver.actions({async: true}); await actions.press(Button.FORWARD).release(Button.FORWARD).perform() assert.deepStrictEqual(await driver.getTitle(), `We Arrive Here`) }); });
val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
双击鼠标左键
这个方法包含2个操作,首先将光标移动到被操作元素的正中心,然后双击鼠标左键。
WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.doubleClick(clickable).perform();
/examples/javascript/test/actionsApi/mouse/doubleClick.spec.js
const {By, Builder} = require('selenium-webdriver'); const assert = require("assert"); describe('Double click', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Double-click on an element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const clickable = driver.findElement(By.id("clickable")); const actions = driver.actions({async: true}); await actions.doubleClick(clickable).perform(); await driver.sleep(500); const status = await driver.findElement(By.id('click-status')).getText(); assert.deepStrictEqual(status, `double-clicked`) }); });
.doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
移动光标到元素上
这个方法是将光标移动到元素的中心点。 另一种叫法“悬停”。 元素必须在可视窗口范围内否则这条命令将会报错。
WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const hoverable = driver.findElement(By.id("hover")); const actions = driver.actions({async: true}); await actions.move({origin: hoverable}).perform();
/examples/javascript/test/actionsApi/mouse/moveToElement.spec.js
const {By, Builder} = require('selenium-webdriver'); const assert = require("assert"); describe('Move to element', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('Mouse move into an element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const hoverable = driver.findElement(By.id("hover")); const actions = driver.actions({async: true}); await actions.move({origin: hoverable}).perform(); const status = await driver.findElement(By.id('move-status')).getText(); assert.deepStrictEqual(status, `hovered`) }); });
.moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
通过偏移量移动动光标
这些方法让光标先移动到指定的坐标原点,然后通过单位为px的偏移量进行光标相对原点的偏移移动。 注意光标位置必须在可视窗口区域否则会报错。
从元素中心点(原点)偏移
这个方法是指先将光标移动到元素中心点(原点),然后通过偏移量进行光标相对原点的偏移。
WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const mouseTracker = driver.findElement(By.id("mouse-tracker")); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0, origin: mouseTracker}).perform();
/examples/javascript/test/actionsApi/mouse/moveByOffset.spec.js
const {By, Origin, Builder, until } = require('selenium-webdriver'); const assert = require('assert'); describe('Mouse move by offset', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('From element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const mouseTracker = driver.findElement(By.id("mouse-tracker")); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0, origin: mouseTracker}).perform(); await driver.wait(until.elementTextContains(await driver.findElement(By.id('relative-location')), ","), 2000); let result = await driver.findElement(By.id('relative-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 100 - 8) < 2), true) }); it('From viewport origin', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0}).perform(); let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 8) < 2), true) }); it('From current pointer location', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 6, y: 3}).perform() await actions.move({x: 13, y: 15, origin: Origin.POINTER}).perform() let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual(Math.abs(parseInt(result[0]) - 6 - 13) < 2, true) assert.deepStrictEqual(Math.abs(parseInt(result[1]) - 3 - 15) < 2, true) }); });
.moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ")
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
从视窗左上角(原点)偏移
这个方法是指先将光标移动到视窗左上角(原点),然后通过偏移量进行光标相对原点的偏移。
PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions));
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList());
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
driver.action .move_to_location(8, 12) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0}).perform();
/examples/javascript/test/actionsApi/mouse/moveByOffset.spec.js
const {By, Origin, Builder, until } = require('selenium-webdriver'); const assert = require('assert'); describe('Mouse move by offset', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('From element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const mouseTracker = driver.findElement(By.id("mouse-tracker")); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0, origin: mouseTracker}).perform(); await driver.wait(until.elementTextContains(await driver.findElement(By.id('relative-location')), ","), 2000); let result = await driver.findElement(By.id('relative-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 100 - 8) < 2), true) }); it('From viewport origin', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0}).perform(); let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 8) < 2), true) }); it('From current pointer location', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 6, y: 3}).perform() await actions.move({x: 13, y: 15, origin: Origin.POINTER}).perform() let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual(Math.abs(parseInt(result[0]) - 6 - 13) < 2, true) assert.deepStrictEqual(Math.abs(parseInt(result[1]) - 3 - 15) < 2, true) }); });
val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ")
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
从当前光标位置(原点)偏移
这个方法是指光标位于当前位置(原点),然后通过偏移量进行光标相对原点的偏移。 如果之前没有移动过光标位置,则这个位置是视窗左上角(原点)。 注意当页面发生滚动后光标位置不会发生变化。
注意第一个参数指定为正数时向右移动,第二个参数指定为正数时向下移动。所以 moveByOffset(30, -10)
是指从当前光标位置向右移动30个像素位置和向上移动10个像素位置。
new Actions(driver) .moveByOffset(13, 15) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
ActionChains(driver) \ .move_by_offset(13, 15) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
new Actions(driver) .MoveByOffset(13, 15) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
driver.action .move_by(13, 15) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
await actions.move({x: 13, y: 15, origin: Origin.POINTER}).perform()
/examples/javascript/test/actionsApi/mouse/moveByOffset.spec.js
const {By, Origin, Builder, until } = require('selenium-webdriver'); const assert = require('assert'); describe('Mouse move by offset', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('From element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const mouseTracker = driver.findElement(By.id("mouse-tracker")); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0, origin: mouseTracker}).perform(); await driver.wait(until.elementTextContains(await driver.findElement(By.id('relative-location')), ","), 2000); let result = await driver.findElement(By.id('relative-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 100 - 8) < 2), true) }); it('From viewport origin', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 8, y: 0}).perform(); let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual((Math.abs(parseInt(result[0]) - 8) < 2), true) }); it('From current pointer location', async function () { await driver.get('https://selenium.dev/selenium/web/mouse_interaction.html'); const actions = driver.actions({async: true}); await actions.move({x: 6, y: 3}).perform() await actions.move({x: 13, y: 15, origin: Origin.POINTER}).perform() let result = await driver.findElement(By.id('absolute-location')).getText(); result = result.split(', '); assert.deepStrictEqual(Math.abs(parseInt(result[0]) - 6 - 13) < 2, true) assert.deepStrictEqual(Math.abs(parseInt(result[1]) - 3 - 15) < 2, true) }); });
.perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ")
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
拖放元素
这个方法首先在原元素上提交执行按下鼠标左键,移动到目标元素位置后是释放鼠标左键。
WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const draggable = driver.findElement(By.id("draggable")); const droppable = await driver.findElement(By.id("droppable")); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, droppable).perform();
/examples/javascript/test/actionsApi/mouse/dragAndDrop.spec.js
const {By, Builder} = require('selenium-webdriver'); const assert = require('assert'); describe('Drag and Drop', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('By Offset', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const draggable = driver.findElement(By.id("draggable")); let start = await draggable.getRect(); let finish = await driver.findElement(By.id("droppable")).getRect(); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, {x: finish.x - start.x, y: finish.y - start.y}).perform(); let result = await driver.findElement(By.id("drop-status")).getText(); assert.deepStrictEqual('dropped', result) }); it('Onto Element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const draggable = driver.findElement(By.id("draggable")); const droppable = await driver.findElement(By.id("droppable")); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, droppable).perform(); let result = await driver.findElement(By.id("drop-status")).getText(); assert.deepStrictEqual('dropped', result) }); });
Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }
通过偏移量拖放元素
这个方法首先在原元素上提交执行按下鼠标左键,通过给出的偏移量移动元素后释放鼠标左键。
WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform();
/examples/java/src/test/java/dev/selenium/actions_api/MouseTest.java
package dev.selenium.actions_api; import dev.selenium.BaseChromeTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.interactions.PointerInput; import org.openqa.selenium.interactions.Sequence; import org.openqa.selenium.remote.RemoteWebDriver; import java.time.Duration; import java.util.Collections; public class MouseTest extends BaseChromeTest { @Test public void clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .clickAndHold(clickable) .perform(); Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()); } @Test public void clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("click")); new Actions(driver) .click(clickable) .perform(); Assertions.assertTrue(driver.getCurrentUrl().contains("resultPage.html")); } @Test public void rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .contextClick(clickable) .perform(); Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); Assertions.assertEquals(driver.getTitle(), "We Arrive Here"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()); } @Test public void forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.findElement(By.id("click")).click(); driver.navigate().back(); Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); Assertions.assertEquals("We Arrive Here", driver.getTitle()); } @Test public void doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement clickable = driver.findElement(By.id("clickable")); new Actions(driver) .doubleClick(clickable) .perform(); Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()); } @Test public void hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement hoverable = driver.findElement(By.id("hover")); new Actions(driver) .moveToElement(hoverable) .perform(); Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()); } @Test public void moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); driver.manage().window().fullscreen(); WebElement tracker = driver.findElement(By.id("mouse-tracker")); new Actions(driver) .moveToElement(tracker, 8, 0) .perform(); String[] result = driver.findElement(By.id("relative-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2); } @Test public void moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2); } @Test public void moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); PointerInput mouse = new PointerInput(PointerInput.Kind.MOUSE, "default mouse"); Sequence actions = new Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)); ((RemoteWebDriver) driver).perform(Collections.singletonList(actions)); new Actions(driver) .moveByOffset(13, 15) .perform(); String[] result = driver.findElement(By.id("absolute-location")).getText().split(", "); Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2); Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2); } @Test public void dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); WebElement droppable = driver.findElement(By.id("droppable")); new Actions(driver) .dragAndDrop(draggable, droppable) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } @Test public void dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html"); WebElement draggable = driver.findElement(By.id("draggable")); Rectangle start = draggable.getRect(); Rectangle finish = driver.findElement(By.id("droppable")).getRect(); new Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform(); Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()); } }
draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform()
/examples/python/tests/actions_api/test_mouse.py
import pytest from time import sleep from selenium.webdriver import ActionChains from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.mouse_button import MouseButton from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_click_and_hold(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .click_and_hold(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "focused" def test_click_and_release(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "click") ActionChains(driver) \ .click(clickable) \ .perform() assert "resultPage.html" in driver.current_url def test_right_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .context_click(clickable) \ .perform() sleep(0.5) assert driver.find_element(By.ID, "click-status").text == "context-clicked" def test_back_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() assert driver.title == "We Arrive Here" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.BACK) action.pointer_action.pointer_up(MouseButton.BACK) action.perform() assert driver.title == "BasicMouseInterfaceTest" def test_forward_click_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') driver.find_element(By.ID, "click").click() driver.back() assert driver.title == "BasicMouseInterfaceTest" action = ActionBuilder(driver) action.pointer_action.pointer_down(MouseButton.FORWARD) action.pointer_action.pointer_up(MouseButton.FORWARD) action.perform() assert driver.title == "We Arrive Here" def test_double_click(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') clickable = driver.find_element(By.ID, "clickable") ActionChains(driver) \ .double_click(clickable) \ .perform() assert driver.find_element(By.ID, "click-status").text == "double-clicked" def test_hover(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') hoverable = driver.find_element(By.ID, "hover") ActionChains(driver) \ .move_to_element(hoverable) \ .perform() assert driver.find_element(By.ID, "move-status").text == "hovered" def test_move_by_offset_from_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') mouse_tracker = driver.find_element(By.ID, "mouse-tracker") ActionChains(driver) \ .move_to_element_with_offset(mouse_tracker, 8, 0) \ .perform() coordinates = driver.find_element(By.ID, "relative-location").text.split(", ") assert abs(int(coordinates[0]) - 100 - 8) < 2 def test_move_by_offset_from_viewport_origin_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "absolute-location"))) action = ActionBuilder(driver) action.pointer_action.move_to_location(8, 0) action.perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 8) < 2 def test_move_by_offset_from_current_pointer_ab(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') action = ActionBuilder(driver) action.pointer_action.move_to_location(6, 3) action.perform() ActionChains(driver) \ .move_by_offset(13, 15) \ .perform() coordinates = driver.find_element(By.ID, "absolute-location").text.split(", ") assert abs(int(coordinates[0]) - 6 - 13) < 2 assert abs(int(coordinates[1]) - 3 - 15) < 2 def test_drag_and_drop_onto_element(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") droppable = driver.find_element(By.ID, "droppable") ActionChains(driver) \ .drag_and_drop(draggable, droppable) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped" def test_drag_and_drop_by_offset(driver): driver.get('https://selenium.dev/selenium/web/mouse_interaction.html') draggable = driver.find_element(By.ID, "draggable") start = draggable.location finish = driver.find_element(By.ID, "droppable").location ActionChains(driver) \ .drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']) \ .perform() assert driver.find_element(By.ID, "drop-status").text == "dropped"
IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform();
/examples/dotnet/SeleniumDocs/ActionsAPI/MouseTest.cs
using System; using System.Drawing; using Microsoft.VisualStudio.TestTools.UnitTesting; using OpenQA.Selenium; using OpenQA.Selenium.Interactions; namespace SeleniumDocs.ActionsAPI { [TestClass] public class MouseTest : BaseChromeTest { [TestMethod] public void ClickAndHold() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ClickAndHold(clickable) .Perform(); Assert.AreEqual("focused", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void ClickAndRelease() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("click")); new Actions(driver) .Click(clickable) .Perform(); Assert.IsTrue(driver.Url.Contains("resultPage.html")); } [TestMethod] public void RightClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .ContextClick(clickable) .Perform(); Assert.AreEqual("context-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void BackClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); Assert.AreEqual("We Arrive Here", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Back)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Back)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); } [TestMethod] public void ForwardClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; driver.FindElement(By.Id("click")).Click(); driver.Navigate().Back(); Assert.AreEqual("BasicMouseInterfaceTest", driver.Title); ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerDown(MouseButton.Forward)); actionBuilder.AddAction(mouse.CreatePointerUp(MouseButton.Forward)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); Assert.AreEqual("We Arrive Here", driver.Title); } [TestMethod] public void DoubleClick() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement clickable = driver.FindElement(By.Id("clickable")); new Actions(driver) .DoubleClick(clickable) .Perform(); Assert.AreEqual("double-clicked", driver.FindElement(By.Id("click-status")).Text); } [TestMethod] public void Hovers() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement hoverable = driver.FindElement(By.Id("hover")); new Actions(driver) .MoveToElement(hoverable) .Perform(); Assert.AreEqual("hovered", driver.FindElement(By.Id("move-status")).Text); } [TestMethod] [Obsolete("Obsolete")] public void MoveByOffsetFromTopLeftOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromCenterOfElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement tracker = driver.FindElement(By.Id("mouse-tracker")); new Actions(driver) .MoveToElement(tracker, 8, 0) .Perform(); string[] result = driver.FindElement(By.Id("relative-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 100 - 8) < 2); } [TestMethod] public void MoveByOffsetFromViewport() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 0, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8) < 2); } [TestMethod] public void MoveByOffsetFromCurrentPointerLocation() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; ActionBuilder actionBuilder = new ActionBuilder(); PointerInputDevice mouse = new PointerInputDevice(PointerKind.Mouse, "default mouse"); actionBuilder.AddAction(mouse.CreatePointerMove(CoordinateOrigin.Viewport, 8, 12, TimeSpan.Zero)); ((IActionExecutor)driver).PerformActions(actionBuilder.ToActionSequenceList()); new Actions(driver) .MoveByOffset(13, 15) .Perform(); string[] result = driver.FindElement(By.Id("absolute-location")).Text.Split(", "); Assert.IsTrue(Math.Abs(int.Parse(result[0]) - 8 - 13) < 2); Assert.IsTrue(Math.Abs(int.Parse(result[1]) - 12 - 15) < 2); } [TestMethod] public void DragToElement() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); IWebElement droppable = driver.FindElement(By.Id("droppable")); new Actions(driver) .DragAndDrop(draggable, droppable) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } [TestMethod] public void DragByOffset() { driver.Url = "https://selenium.dev/selenium/web/mouse_interaction.html"; IWebElement draggable = driver.FindElement(By.Id("draggable")); Point start = draggable.Location; Point finish = driver.FindElement(By.Id("droppable")).Location; new Actions(driver) .DragAndDropToOffset(draggable, finish.X - start.X, finish.Y - start.Y) .Perform(); Assert.AreEqual("dropped", driver.FindElement(By.Id("drop-status")).Text); } } }
draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform
/examples/ruby/spec/actions_api/mouse_spec.rb
# frozen_string_literal: true require 'spec_helper' RSpec.describe 'Mouse' do let(:driver) { start_session } it 'click and hold' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .click_and_hold(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'focused' end it 'click and release' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'click') driver.action .click(clickable) .perform expect(driver.current_url).to include 'resultPage.html' end describe 'alternate button clicks' do it 'right click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .context_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'context-clicked' end it 'back click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click expect(driver.title).to eq('We Arrive Here') driver.action .pointer_down(:back) .pointer_up(:back) .perform expect(driver.title).to eq('BasicMouseInterfaceTest') end it 'forward click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.find_element(id: 'click').click driver.navigate.back expect(driver.title).to eq('BasicMouseInterfaceTest') driver.action .pointer_down(:forward) .pointer_up(:forward) .perform expect(driver.title).to eq('We Arrive Here') end end it 'double click' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' clickable = driver.find_element(id: 'clickable') driver.action .double_click(clickable) .perform expect(driver.find_element(id: 'click-status').text).to eq 'double-clicked' end it 'hovers' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' hoverable = driver.find_element(id: 'hover') driver.action .move_to(hoverable) .perform expect(driver.find_element(id: 'move-status').text).to eq 'hovered' end describe 'move by offset' do it 'offset from element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.scroll_to(driver.find_element(id: 'bottom')).perform mouse_tracker = driver.find_element(id: 'mouse-tracker') driver.action .move_to(mouse_tracker, 8, 11) .perform rect = mouse_tracker.rect center_x = rect.width / 2 center_y = rect.height / 2 x_coord, y_coord = driver.find_element(id: 'relative-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(center_x + 8) expect(y_coord).to be_within(1).of(center_y + 11) end it 'offset from viewport' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action .move_to_location(8, 12) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8) expect(y_coord).to be_within(1).of(12) end it 'offset from current pointer location' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' driver.action.move_to_location(8, 11).perform driver.action .move_by(13, 15) .perform x_coord, y_coord = driver.find_element(id: 'absolute-location').text.split(',').map(&:to_i) expect(x_coord).to be_within(1).of(8 + 13) expect(y_coord).to be_within(1).of(11 + 15) end end it 'drags to another element' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') droppable = driver.find_element(id: 'droppable') driver.action .drag_and_drop(draggable, droppable) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end it 'drags by an offset' do driver.get 'https://www.selenium.dev/selenium/web/mouse_interaction.html' draggable = driver.find_element(id: 'draggable') start = draggable.rect finish = driver.find_element(id: 'droppable').rect driver.action .drag_and_drop_by(draggable, finish.x - start.x, finish.y - start.y) .perform expect(driver.find_element(id: 'drop-status').text).to include('dropped') end end
const draggable = driver.findElement(By.id("draggable")); let start = await draggable.getRect(); let finish = await driver.findElement(By.id("droppable")).getRect(); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, {x: finish.x - start.x, y: finish.y - start.y}).perform();
/examples/javascript/test/actionsApi/mouse/dragAndDrop.spec.js
const {By, Builder} = require('selenium-webdriver'); const assert = require('assert'); describe('Drag and Drop', function () { let driver; before(async function () { driver = new Builder().forBrowser('chrome').build(); }); after(async () => await driver.quit()); it('By Offset', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const draggable = driver.findElement(By.id("draggable")); let start = await draggable.getRect(); let finish = await driver.findElement(By.id("droppable")).getRect(); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, {x: finish.x - start.x, y: finish.y - start.y}).perform(); let result = await driver.findElement(By.id("drop-status")).getText(); assert.deepStrictEqual('dropped', result) }); it('Onto Element', async function () { await driver.get('https://www.selenium.dev/selenium/web/mouse_interaction.html'); const draggable = driver.findElement(By.id("draggable")); const droppable = await driver.findElement(By.id("droppable")); const actions = driver.actions({async: true}); await actions.dragAndDrop(draggable, droppable).perform(); let result = await driver.findElement(By.id("drop-status")).getText(); assert.deepStrictEqual('dropped', result) }); });
val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText())
examples/kotlin/src/test/kotlin/dev/selenium/actions_api/MouseTest.kt
package dev.selenium.actions_api import dev.selenium.BaseTest import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import org.openqa.selenium.By import org.openqa.selenium.interactions.Actions import org.openqa.selenium.interactions.PointerInput import org.openqa.selenium.interactions.Sequence import org.openqa.selenium.remote.RemoteWebDriver import java.time.Duration import java.util.Collections class MouseTest : BaseTest() { @Test fun clickAndHold() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .clickAndHold(clickable) .perform() Assertions.assertEquals("focused", driver.findElement(By.id("click-status")).getText()) } @Test fun clickAndRelease() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("click")) Actions(driver) .click(clickable) .perform() Assertions.assertTrue(driver.getCurrentUrl()!!.contains("resultPage.html")) } @Test fun rightClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .contextClick(clickable) .perform() Assertions.assertEquals("context-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun backClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() Assertions.assertEquals(driver.getTitle(), "We Arrive Here") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.BACK.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.BACK.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("BasicMouseInterfaceTest", driver.getTitle()) } @Test fun forwardClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.findElement(By.id("click")).click() driver.navigate().back() Assertions.assertEquals(driver.getTitle(), "BasicMouseInterfaceTest") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerDown(PointerInput.MouseButton.FORWARD.asArg())) .addAction(mouse.createPointerUp(PointerInput.MouseButton.FORWARD.asArg())) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Assertions.assertEquals("We Arrive Here", driver.getTitle()) } @Test fun doubleClick() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val clickable = driver.findElement(By.id("clickable")) Actions(driver) .doubleClick(clickable) .perform() Assertions.assertEquals("double-clicked", driver.findElement(By.id("click-status")).getText()) } @Test fun hovers() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val hoverable = driver.findElement(By.id("hover")) Actions(driver) .moveToElement(hoverable) .perform() Assertions.assertEquals("hovered", driver.findElement(By.id("move-status")).getText()) } @Test fun moveByOffsetFromElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") driver.manage().window().fullscreen() val tracker = driver.findElement(By.id("mouse-tracker")) Actions(driver) .moveToElement(tracker, 8, 0) .perform() val result = driver.findElement(By.id("relative-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 100 - 8) < 2) } @Test fun moveByOffsetFromViewport() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 12)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 12) < 2) } @Test fun moveByOffsetFromCurrentPointer() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val mouse = PointerInput(PointerInput.Kind.MOUSE, "default mouse") val actions = Sequence(mouse, 0) .addAction(mouse.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), 8, 11)) (driver as RemoteWebDriver).perform(Collections.singletonList(actions)) Actions(driver) .moveByOffset(13, 15) .perform() val result = driver.findElement(By.id("absolute-location")).getText().split(", ") Assertions.assertTrue(Math.abs(Integer.parseInt(result[0]) - 8 - 13) < 2) Assertions.assertTrue(Math.abs(Integer.parseInt(result[1]) - 11 - 15) < 2) } @Test fun dragsToElement() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val droppable = driver.findElement(By.id("droppable")) Actions(driver) .dragAndDrop(draggable, droppable) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } @Test fun dragsByOffset() { driver.get("https://www.selenium.dev/selenium/web/mouse_interaction.html") val draggable = driver.findElement(By.id("draggable")) val start = draggable.getRect() val finish = driver.findElement(By.id("droppable")).getRect() Actions(driver) .dragAndDropBy(draggable, finish.getX() - start.getX(), finish.getY() - start.getY()) .perform() Assertions.assertEquals("dropped", driver.findElement(By.id("drop-status")).getText()) } }