selenium库的使用(六):ActionChains动作链

ActionChains是一种自动化低级交互的方式,如鼠标移动、鼠标按钮动作、按键和上下文菜单交互,这对于进行更复杂的操作(如悬停和拖放)非常有用

参考资料

执行模式

当调用ActionChains对象上的动作方法时,动作不会立即执行,动作被存储在ActionChains对象的队列中,当调用 perform() 方法时,事件会按照队列中动作被调用的顺序被触发

写法有两种模式:链式模式分步模式,无论哪种方式,都会按照调用的顺序,一个接一个地执行这些动作

链式执行

1
2
3
4
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

分步执行

1
2
3
4
5
6
7
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

鼠标点击

方法

点击鼠标左键

1
ActionChains(driver).click(on_element)

on_element :要点击的元素,为 None 时点击当前鼠标位置

松开元素上的鼠标按钮

1
ActionChains(driver).release(on_element)

on_element :要点击的元素,为 None 时在当前鼠标位置松开

点击鼠标左键不松开

1
ActionChains(driver).click_and_hold(on_element)

on_element :要点击的元素,为 None 时点击当前鼠标位置

双击鼠标左键

1
ActionChains(driver).double_click(on_element)

on_element :要双击的元素,为 None 时双击当前鼠标位置

点击鼠标右键

1
ActionChains(driver).context_click(on_element)

on_element :要点击的元素,为 None 时点击当前鼠标位置

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过id定位元素
单击 = driver.find_element_by_id('d')
双击 = driver.find_element_by_id('s')
右键 = driver.find_element_by_id('y')

# 实例化ActionChains并赋值给 动作
动作 = ActionChains(driver)
# 按调用顺序执行鼠标的 单击 双击 右键
动作.click(单击).double_click(双击).context_click(右键).perform()

time.sleep(5)

# 退出驱动并关闭浏览器
driver.quit()

鼠标拖拽

方法

在源元素上按住鼠标左键,然后移动到目标元素并释放鼠标按钮

1
ActionChains(driver).drag_and_drop(source, target)

source :鼠标点击的元素
target :鼠标指向的元素

在源元素上按住鼠标左键,然后移动到目标坐标处并释放鼠标按钮

1
ActionChains(driver).drag_and_drop_by_offset(source, xoffset, yoffset)

source :鼠标点击的元素
xoffset :要移动到的X偏移量(水平方向)
yoffset :要移动到的Y偏移量(垂直方向)

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过class的属性值定位元素即滑块
滑块 = driver.find_element_by_class_name('slider')

# 实例化ActionChains并赋值给 动作
动作 = ActionChains(driver)
# 按住元素移动到指定坐标处并松开
动作.drag_and_drop_by_offset(滑块, 100, 0).perform()

time.sleep(5)

# 退出驱动并关闭浏览器
driver.quit()

鼠标移动

方法

将鼠标从当前鼠标位置移到偏移处

1
ActionChains(driver).move_by_offset(xoffset, yoffset)

xoffset :要移动到的X偏移量,为正或负
yoffset :要移动到的Y偏移量,为正或负

将鼠标移动到元素的中间

1
ActionChains(driver).move_to_element(to_element)

on_element :要移动到的元素

鼠标移动到距离指定元素的偏移量,偏移量是相对于元素的左上角而言的

1
ActionChains(driver).move_to_element_with_offset(to_element, xoffset, yoffset)

on_element :要移动到的元素
xoffset :要移动到的X偏移量
yoffset :要移动到的Y偏移量

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过id定位元素即滑块
滑块 = driver.find_element_by_class_name('slider')

# 实例化ActionChains并赋值给 动作
动作 = ActionChains(driver)

# 按下鼠标按钮 移动到指定位置 松开鼠标按钮
动作.click_and_hold(滑块).move_by_offset(100, 0).release(滑块).perform()
# 同上,移动距离不同
动作.click_and_hold(滑块).move_to_element_with_offset(滑块, 200, 0).release(滑块).perform()

time.sleep(5)

# 退出驱动并关闭浏览器
driver.quit()

模拟按键

模拟按键可以使用 WebElement 对象的 send_keys() 方法,也可以使用 ActionChains 对象提供的方法

方法

按下某个键盘键,不释放

1
ActionChains(driver).key_down(value, element)

只能与修饰键(Control、Alt和Shift)一起使用
value :修饰键,值在 Keys 类中定义
element :定位的元素(WebElement对象),为 None 时则发送一个键到当前重点元素

释放一个修饰键

1
ActionChains(driver).key_up(value, element)

value :修饰键,值在 Keys 类中定义
element :定位的元素(WebElement对象),为 None 时则发送一个键到当前重点元素

发送某个键盘键到当前的焦点元素

1
ActionChains(driver).send_keys(*keys_to_send)

keys_to_send :某个键比如 'a',修饰键常量可以在 Keys 类中找到

发送某个键盘键到指定元素

1
ActionChains(driver).send_keys_to_element(element, *keys_to_send)

element :定位的元素(WebElement对象)
keys_to_send :某个键比如 'a',修饰键常量可以在 Keys 类中找到

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')

# 等待2s
time.sleep(2)

# 通过name的属性值定位输入框,得到一个WebElement对象
webelement = driver.find_element_by_name('t2')
# 输入文本
webelement.send_keys('雨园博客')

# Ctrl+A 全选
ActionChains(driver).key_down(Keys.CONTROL, webelement).send_keys('a').key_up(Keys.CONTROL, webelement).perform()
# Ctrl+X 剪贴
ActionChains(driver).key_down(Keys.CONTROL, webelement).send_keys('x').key_up(Keys.CONTROL, webelement).perform()

# 使用WebElement对象的send_keys方法
# Ctrl+V 粘贴
webelement.send_keys(Keys.CONTROL, 'v')

time.sleep(5)

# 退出驱动并关闭浏览器
driver.quit()

其它

执行存储的动作

1
ActionChains(driver).perform()

清除已经存储在本地和远程端的操作

1
ActionChains(driver).reset_actions()

暂停指定持续时间的所有输入

1
ActionChains(driver).pause(seconds)

seconds :秒