鼠标操作演示 · 拖拽

拖拽 drag_and_drop — 5 种方法全解析:元素到元素 / 偏移 / 目标偏移 / 分步 / 贝塞尔曲线
首页 鼠标操作导航

当前演示 · 鼠标拖拽 drag

演示 Selenium 最经典的 拖拽操作,从 A 元素拖到 B 元素,或从一个位置拖到另一个坐标。拖拽是 ActionChains 中最常见的组合操作。

两种拖拽方式:

⚠️ 兼容性问题:原生 HTML5 拖拽(draggable="true")和 jQuery UI 拖拽的事件模型不同。Selenium 的 drag_and_drop 对 jQuery UI 效果更好,对某些 React 拖拽库可能需要手动组合。

左击 右击 双击 移动 按住 释放 拖拽 滚动
06 · 拖拽(5 种)

鼠标拖拽

drag_and_drop / _by_offset / _with_offset / 分步式 / 贝塞尔曲线
5 种拖拽方法的起点/终点锚点差异:
drag_and_drop(A, B):起点 = 元素 A 中心,终点 = 元素 B 中心(一行式)
drag_and_drop_by_offset(A, dx, dy):起点 = A 中心,终点 = A 中心 + 偏移(滑块验证最爱)
click_and_hold + move_by_offset + release:起点 = A 中心,终点 = 当前鼠标 + 偏移(分步式)
drag_and_drop_with_offset(A, B, dx, dy):起点 = A 中心,终点 = B 中心 + 偏移(Selenium 4.4+)
贝塞尔曲线分步:起点 = A 中心,轨迹 = 多次微偏移 + 抖动(模拟真人行为)
① drag_and_drop 元素 A → 元素 B
一行式演示:把左侧模块拖到右侧目标框
源元素区
用户模块
报表模块
系统设置

Drag
放置目标区
把左侧元素拖到这里
② drag_and_drop_by_offset 元素 → 相对偏移(滑块验证)
滑块演示(拖到最右侧触发"验证通过")
👉 按住滑块向右拖动 →
③ 分步式 click_and_hold + move_by_offset + release 按住 → 偏移 → 释放
自由拖拽演示(把下方拖拽源拖到下方三个分区)
源元素
自由拖拽源
🔴 红色区
🟡 黄色区
🟢 绿色区
④ drag_and_drop_with_offset 元素 → 目标元素内偏移(Selenium 4.4+)
精确落位演示(从左源拖到右侧画布,画布中央蓝色圆 = 目标中心,红点 = 实际落位)
源元素
拖动我

Drag+Off
target 元素内偏移 →
未放置
⑤ 贝塞尔曲线模拟人拖 模拟真实轨迹
滑块演示(手动拖 = 直线轨迹;"模拟人拖" = 带抖动的贝塞尔曲线)
拖动滑块 →
等待拖动...
[状态] 请操作上方 5 种拖拽 demo...
Python Selenium · 5 种拖拽方法
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

# 1. 启动浏览器 + 打开演示页面
driver = webdriver.Chrome()
driver.get("https://autotest-505.pages.dev/mouse_op_tech_sections/mouse_drag_tech.html")

# 2. 定位元素
src  = driver.find_element(By.ID, "drag1")
tgt  = driver.find_element(By.ID, "dropBox")
slider = driver.find_element(By.ID, "slider")

# ── ① drag_and_drop:元素 A → 元素 B(一行式,80% 场景) ──
ActionChains(driver).drag_and_drop(src, tgt).perform()

# ── ② drag_and_drop_by_offset:元素 → 相对偏移(滑块验证最爱) ──
# 把滑块元素从当前位置向右拖 300px、向下 0px
ActionChains(driver).drag_and_drop_by_offset(slider, xoffset=300, yoffset=0).perform()

# ── ③ 分步式:click_and_hold → move_by_offset → release ──
# 更灵活,可中途变速、多次移动、配合键盘
ActionChains(driver) \
   .click_and_hold(src) \
   .move_by_offset(150, 30) \
   .move_by_offset(80, -20) \
   .release() \
   .perform()

# ── ④ drag_and_drop_with_offset:Selenium 4.4+ ──
# 拖到目标元素中心再向右偏移 50px(精确落位)
ActionChains(driver) \
   .drag_and_drop_with_offset(src, tgt, xoffset=50, yoffset=0) \
   .perform()

# ── ⑤ 贝塞尔曲线分步:模拟真人行为 ──
import random, math

def bezier_drag(driver, src, dx, dy, steps=30):
    actions = ActionChains(driver)
    actions.click_and_hold(src)
    for i in range(steps):
        t = i / steps
        # 二次贝塞尔,带随机抖动
        step_dx = dx/steps + random.uniform(-2, 2)
        step_dy = dy/steps + random.uniform(-1, 1)
        actions.move_by_offset(step_dx, step_dy)
    actions.release().perform()

bezier_drag(driver, slider, dx=300, dy=0)

# ── 方法对比速查 ──
# 方法                              起点锚点        终点锚点
# drag_and_drop(A, B)              A 中心          B 中心          ★★★★★
# drag_and_drop_by_offset(A,dx,dy) A 中心          A 中心+偏移     ★★★★☆ 滑块验证
# click_and_hold + move_by_offset  A 中心          当前鼠标+偏移   ★★★★☆ 分步灵活
# drag_and_drop_with_offset        A 中心          B 中心+偏移     ★★☆☆☆ 4.4+
# 贝塞尔曲线分步                   A 中心          多点偏移轨迹     ★★★☆☆ 反爬

# 3. 关闭浏览器
driver.quit()
打开 查看属性 复制
重命名 删除

关于我们

Python 自动化测试学习平台是一个面向软件测试工程师、开发人员及在校学生的交互式在线学习平台,专注于 Selenium WebDriver 与 Python unittest 自动化测试技能的教学与实践。

我们以"理论 + 实战 + 可交互演示"为核心特色,将八种常规元素定位和Javascript定位、元素操作、自动化测试工具、单元测试、测试模型等知识体系拆分为模块化课程,每个模块都配有可点击、可输入、可运行的模拟练习页面。

平台致力于降低自动化测试的入门门槛,让学习者从"看懂代码"到"动手实操",逐步掌握企业级自动化测试框架的设计与落地能力。

联系方式

📧邮箱:lq@selenium-auto-test.com

📞电话:0755-12345678

📍地址:深圳

💬微信公众号:Selenium自动化测试

🐙GitHub:github.com/selenium-auto-test

免责声明

1. 本平台所有示例代码、演示页面及教程内容均仅供学习交流使用,不构成任何商业推广或技术服务承诺。

2. 平台中的 Selenium API 描述、Python 语法说明均以官方文档为准,如有版本差异请以对应官方文档为准。

3. 学习者在实际项目中应用平台所学内容时,应结合自身项目环境进行充分测试,本平台不对因直接使用示例代码而产生的任何直接或间接损失承担责任。

4. 本平台所引用的第三方库(Selenium、ChromeDriver、unittest 等)版权归其各自作者及维护者所有。

5. 如涉及版权问题或内容建议,请及时通过联系方式与我们沟通,我们将第一时间处理。