1. 概述

本文将深入探讨如何使用 Selenium 和 WebDriver 实现拖拽操作。拖拽功能在 Web 应用中非常常见,无论是页面元素重排还是文件上传场景都离不开它。通过 Selenium 自动化拖拽操作,能有效覆盖用户交互测试。

我们将重点介绍 Selenium 提供的三种核心方法:dragAndDrop()clickAndHold() 和 *dragAndDropBy()*。这些方法提供了不同精度的拖拽控制,从基础的元素间拖动到复杂的像素级精确移动。全文将通过实际测试页面演示各种用法。

2. 环境配置

开始拖拽操作前,需要先搭建测试环境。我们将使用 Selenium Java 库和 WebDriverManager 管理浏览器驱动。示例以 Chrome 为例,但其他主流浏览器配置方式类似。

首先在 pom.xml 中添加必要依赖:

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.27.0</version>
</dependency>
<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.9.2</version>
</dependency>

接着初始化 WebDriver:

private WebDriver driver;

@BeforeEach
public void setup() {
    driver = new ChromeDriver();
    driver.manage().window().maximize();
}

@AfterEach
public void tearDown() {
    driver.quit();
}

后续示例将使用 这个演示页面 进行测试。

3. 使用 dragAndDrop() 方法

在 Web 开发中,元素通常分为可拖拽(draggable)和可放置(droppable)两类:

  • 可拖拽元素:可被点击并在屏幕上移动
  • 可放置元素:作为拖拽目标区域

Selenium 的 dragAndDrop() 方法提供了最简单的拖拽实现,只需指定源元素和目标元素。下面看具体实现:

@Test
public void givenTwoElements_whenDragAndDropPerformed_thenElementsSwitched() {
    String url = "http://the-internet.herokuapp.com/drag_and_drop";
    driver.get(url);

    WebElement sourceElement = driver.findElement(By.id("column-a"));
    WebElement targetElement = driver.findElement(By.id("column-b"));

    Actions actions = new Actions(driver);
    actions.dragAndDrop(sourceElement, targetElement)
      .build()
      .perform();
}

这段代码先定位源元素(column-a)和目标元素(column-b),然后通过 dragAndDrop() 完成拖拽。该方法自动处理移动过程,适合基础拖拽场景,比如任务管理应用中调整任务位置。

4. 使用 clickAndHold() 方法

当需要更精细控制拖拽过程时(比如模拟悬停或慢速拖动),*clickAndHold()* 方法提供了更细粒度的控制能力。它将拖拽操作拆解为多个步骤:

@Test
public void givenTwoElements_whenClickAndHoldUsed_thenElementsSwitchedWithControl() {
    String url = "http://the-internet.herokuapp.com/drag_and_drop";
    driver.get(url);

    WebElement sourceElement = driver.findElement(By.id("column-a"));
    WebElement targetElement = driver.findElement(By.id("column-b"));

    Actions actions = new Actions(driver);
    actions.clickAndHold(sourceElement)
      .moveToElement(targetElement)
      .release()
      .build()
      .perform();
}

执行步骤分解:

  1. *clickAndHold()*:点击并按住源元素
  2. *moveToElement()*:移动到目标元素
  3. *release()*:释放鼠标完成放置

这种方法特别适合测试复杂交互场景,比如:

  • 拖拽过程中需要触发中间元素事件
  • 需要模拟慢速拖动效果
  • 多步骤拖拽操作(如调整滑块位置)

5. 使用 dragAndDropBy() 实现像素级拖拽

某些场景需要将元素拖动到精确坐标位置,而非特定目标元素。*dragAndDropBy()* 方法允许通过 X/Y 轴偏移量精确控制拖拽距离,特别适合测试滑块、可调整大小的面板等组件。

jQuery UI 拖拽演示页 为例:

@Test
public void givenDraggableElement_whenDragAndDropByUsed_thenElementMovedByOffset() {
    String url = "https://jqueryui.com/draggable/";
    driver.get(url);
    driver.switchTo().frame(0);

    WebElement draggable = driver.findElement(By.id("draggable"));

    Actions actions = new Actions(driver);
    actions.dragAndDropBy(draggable, 100, 100)
      .build()
      .perform();
}

关键点说明:

  • ⚠️ 需要先切换到 iframe(*driver.switchTo().frame(0)*)
  • dragAndDropBy(draggable, 100, 100) 表示将元素向右移动 100 像素,向下移动 100 像素
  • 无需指定目标元素,直接通过偏移量定位

这种方法的优势在于:

  • ✅ 精确控制移动距离
  • ✅ 适用于无明确放置目标的场景
  • ✅ 方便测试需要精确位置的 UI 组件

6. 总结

本文系统介绍了 Selenium 中三种拖拽实现方案:

方法 适用场景 控制精度 典型用例
dragAndDrop() 元素间拖拽 基础 任务看板、文件上传
clickAndHold() 复杂拖拽流程 高级 滑块调整、多步骤交互
dragAndDropBy() 像素级定位 精确 画布拖动、面板调整

选择建议:

  • ✅ 简单拖拽优先用 dragAndDrop()
  • ✅ 需要中间交互时用 clickAndHold()
  • ✅ 精确定位用 dragAndDropBy()

掌握这些方法后,基本能覆盖 Web 应用中 90% 的拖拽测试需求。实际项目中建议根据具体场景灵活组合使用,避免踩坑。


原始标题:How to Drag and Drop in Selenium | Baeldung