Answer
Actions Class in Selenium
The Actions class handles complex user interactions beyond simple .click() and .sendKeys().
Setup
Java
import org.openqa.selenium.interactions.Actions;
Actions actions = new Actions(driver);
Hover / Mouse Over
Java
// Reveal hidden dropdown on hover
WebElement menu = driver.findElement(By.id("nav-products"));
actions.moveToElement(menu).perform();
// Now click the revealed submenu item
driver.findElement(By.linkText("Laptops")).click();
Right Click (Context Menu)
Java
WebElement element = driver.findElement(By.id("file-icon"));
actions.contextClick(element).perform();
// Select option from context menu
driver.findElement(By.xpath("//li[text()='Rename']")).click();
Double Click
Java
WebElement editableField = driver.findElement(By.id("inline-name"));
actions.doubleClick(editableField).perform();
// Makes field editable (inline editing pattern)
Drag and Drop
Java
WebElement source = driver.findElement(By.id("draggable-card"));
WebElement target = driver.findElement(By.id("drop-zone"));
// Method 1 — direct
actions.dragAndDrop(source, target).perform();
// Method 2 — by offset (if target not precise)
actions.dragAndDropBy(source, 300, 0).perform(); // move 300px right
// Method 3 — explicit steps (more reliable on some apps)
actions.clickAndHold(source)
.moveToElement(target)
.release(target)
.perform();
Keyboard Combinations
Java
// Ctrl + A (select all)
actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();
// Ctrl + C (copy)
actions.keyDown(Keys.CONTROL).sendKeys("c").keyUp(Keys.CONTROL).perform();
// Ctrl + V (paste)
actions.keyDown(Keys.CONTROL).sendKeys("v").keyUp(Keys.CONTROL).perform();
// Shift + Click (multi-select in lists)
WebElement firstItem = driver.findElement(By.cssSelector(".list-item:first-child"));
WebElement lastItem = driver.findElement(By.cssSelector(".list-item:last-child"));
actions.click(firstItem)
.keyDown(Keys.SHIFT)
.click(lastItem)
.keyUp(Keys.SHIFT)
.perform();
// Tab through form fields
actions.sendKeys(Keys.TAB).sendKeys(Keys.TAB).perform();
// Arrow key navigation
actions.sendKeys(Keys.ARROW_DOWN).perform();
Click at Offset (Relative to Element)
Java
// Click at a specific pixel position within an element
// Useful for canvas elements, sliders, maps
WebElement canvas = driver.findElement(By.id("drawing-canvas"));
actions.moveToElement(canvas, 100, 50).click().perform();
// Clicks at 100px right, 50px down from canvas center
// Slider — move to specific position
WebElement slider = driver.findElement(By.id("price-slider"));
actions.moveToElement(slider)
.clickAndHold()
.moveByOffset(150, 0) // slide 150px right
.release()
.perform();
Build + Perform vs Just Perform
Java
// .perform() — executes immediately
actions.moveToElement(menu).perform();
// .build().perform() — explicitly builds action chain first
Action chain = actions
.moveToElement(source)
.clickAndHold()
.moveToElement(target)
.release()
.build();
chain.perform();
// Same result, but build() is useful if you want to store the action
Common Real-World Scenarios
Java
// 1. Select text in a field and overtype
WebElement field = driver.findElement(By.id("name"));
actions.click(field)
.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL)
.sendKeys("New Name")
.perform();
// 2. Hover over map to get tooltip
actions.moveToElement(mapElement, x, y).perform();
String tooltip = wait.until(ExpectedConditions.visibilityOfElementLocated(
By.cssSelector(".tooltip"))).getText();
// 3. Resize panel by dragging resize handle
WebElement handle = driver.findElement(By.className("resize-handle"));
actions.clickAndHold(handle).moveByOffset(200, 0).release().perform();
