DrissionPage 入门教程
动作链
本教程共 42 篇 · 第 26 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
DrissionPageDrissionPage 入门教程动作链Actions拖拽链式调用鼠标操作
26. 动作链
本节目标:理解动作链的工作原理,学会用 Actions 类组合多个操作,实现拖拽、组合按键等复杂交互。
什么是动作链
动作链可以在浏览器上完成一系列交互行为。鼠标移动、点击、键盘输入,都可以串起来执行。
这些操作都是模拟的,真正的鼠标不会移动。所以多个标签页可以同时操作,互不干扰。
两种使用方式
方式一:内置 actions 属性
页面对象自带 actions属性,直接调用即可。这种方式会等页面加载完毕再执行。
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('https://www.baidu.com')
# 链式操作:移动到输入框 -> 点击 -> 输入
tab.actions.move_to('#kw').click().type('DrissionPage')
# 继续操作:移动到按钮 -> 点击
tab.actions.move_to('#su').click()
方式二:创建 Actions 对象
主动创建动作链对象,传入页面对象。这种方式不会等页面加载完毕。
from DrissionPage import Chromium
from DrissionPage.common import Actions
tab = Chromium().latest_tab
ac = Actions(tab)
tab.get('https://www.baidu.com')
ac.move_to('#kw').click().type('DrissionPage')
ac.move_to('#su').click()
两种方式效果一样。区别在于:内置
会等页面框架加载完再执行,创建新对象则不会。大多数情况用内置的就行。
操作方式
链式调用
多个动作可以串成一行,依次执行。
tab.actions.move_to(ele).click().type('some text')
分开执行
也可以每个动作单独一行,效果相同。
tab.actions.move_to(ele)
tab.actions.click()
tab.actions.type('some text')
鼠标移动
move_to() — 移动到元素或坐标
移动到元素中点,或页面上的绝对坐标。
# 移动到元素中点
tab.actions.move_to('#kw')
# 移动到元素内指定偏移位置(相对左上角)
tab.actions.move_to('#kw', offset_x=50, offset_y=-20)
# 移动到绝对坐标
tab.actions.move_to((300, 500))
# 设置移动用时(秒),0 表示瞬间到达
tab.actions.move_to('#kw', duration=1.0)
move() — 相对当前位置移动
# 向右移动 300 像素
tab.actions.move(300, 0)
# 向下移动 100 像素
tab.actions.move(0, 100)
up() / down() / left() / right() — 方向移动
# 向上移动 50 像素
tab.actions.up(50)
# 向下移动 50 像素
tab.actions.down(50)
# 向左移动 50 像素
tab.actions.left(50)
# 向右移动 50 像素
tab.actions.right(50)
鼠标按键
click() — 左键单击
# 单击当前元素
tab.actions.click()
# 移动到元素上再单击
tab.actions.click('#div1')
# 双击(times=2)
tab.actions.click('#div1', times=2)
r_click() — 右键单击
tab.actions.r_click('#div1')
m_click() — 中键单击
tab.actions.m_click('#div1')
hold() / release() — 按住和释放
# 按住鼠标左键
tab.actions.hold('#div1')
# 释放鼠标左键
tab.actions.release()
# 组合:拖拽操作
tab.actions.hold('#draggable').move(200, 0).release()
r_hold() / r_release() — 右键按住释放
tab.actions.r_hold('#div1')
tab.actions.r_release()
m_hold() / m_release() — 中键按住释放
tab.actions.m_hold('#div1')
tab.actions.m_release()
滚动滚轮
scroll() — 滚动页面
# 向下滚动(delta_y 为正)
tab.actions.scroll(delta_y=300)
# 向上滚动
tab.actions.scroll(delta_y=-300)
# 在指定元素上滚动
tab.actions.scroll(delta_y=200, on_ele='#scrollable-div')
键盘操作
key_down() / key_up() — 按下和提起按键
from DrissionPage.common import Keys
# 按下 ENTER
tab.actions.key_down('ENTER')
# 或者用 Keys 类
tab.actions.key_down(Keys.ENTER)
# 提起 ENTER
tab.actions.key_up(Keys.ENTER)
type() — 模拟按键输入
逐个字符按下和提起,模拟真实打字。
# 输入一段文本
tab.actions.type('DrissionPage')
# 输入多段文本
tab.actions.type(('ab', 'cd'))
# 组合键:光标左移再输入
tab.actions.type((Keys.LEFT, 'abc'))
# 快捷键
tab.actions.type(Keys.CTRL_A)
input() — 直接输入
直接输入一整段文本,比 type() 更快。
tab.actions.input('DrissionPage')
# 输入多段
tab.actions.input(('text1', 'text2'))
Tip模拟按键逐个输入,能触发每个字符的事件。
input()直接填入,速度更快但可能漏掉按键事件。按需选择。
拖入文件和文本
drag_in() — 从外部拖入
# 拖入文件
tab.actions.drag_in('#dropzone', files=r'C:\test.txt')
# 拖入多个文件
tab.actions.drag_in('#dropzone', files=[r'C:\file1.txt', r'C:\file2.txt'])
# 拖入文本
tab.actions.drag_in('#dropzone', text='Hello World')
等待
wait() — 动作间等待
# 等待 1 秒
tab.actions.wait(1)
# 等待 0.5 ~ 1.5 秒之间的随机时间
tab.actions.wait(0.5, scope=1.5)
属性
owner — 获取页面对象
page = tab.actions.owner # 返回当前页面对象
curr_x / curr_y — 当前光标位置
x = tab.actions.curr_x
y = tab.actions.curr_y
完整示例:模拟 ctrl+a 全选
from DrissionPage import Chromium
from DrissionPage.common import Keys
tab = Chromium().latest_tab
# 鼠标移动到输入框
tab.actions.move_to('tag:input')
# 点击使光标落入
tab.actions.click()
# 按住 ctrl
tab.actions.key_down(Keys.CTRL)
# 按 a
tab.actions.type('a')
# 释放 ctrl
tab.actions.key_up(Keys.CTRL)
完整示例:拖拽元素
# 方式一:用 hold + move + release
tab.actions.hold('#draggable').move(200, 100).release()
# 方式二:用 ele.drag_to()(如 §22 所述)
ele1 = tab.ele('#draggable')
ele2 = tab.ele('#target')
ele1.drag_to(ele2)