首页 / DrissionPage 入门教程 / 动作链

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)