【学习笔记】ActionChains 动作链

学习说明:

本帖的学习目为是详细了解ActionChains的特性和用法,并知道应该何时使用ActionChains

第一部分:基础介绍

ActionsChains是Selenium中的一个功能模块,它提供了模拟用户输入和复杂交互的能力,包括鼠标移动、点击、拖放、键盘输入等。它的主要功能分为两部分,分别是动作链和输入器控制。

在使用前我们要导入webdriver和ActionChains包,然后我们需要一个WebDriver对象,并用它来创建一个ActionsChains对象:

# 导入webdrive
from selenium import webdriver
# 导入ActionChains
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Edge()
driver.get('https://example.com')  # 打开一个网页

# 创建一个ActionsChains对象
actions = ActionChains(driver)

第二部分:动作链

说明:当我们调用ActionChains的方法时,操作不会立即执行,而是会将所有的操作按顺序存放在一个队列里,只有当调用perform()方法时,队列中的操作才会依次执行,所以被称为动作链

ActionsChains有两种调用方法:

链式调用:

ActionChains(driver).Controls1(value).Controls2(value).perform()

分布式调用:

actions=ActionChains(driver) 
actions.Controls1(value)
actionsControls2(value)
actions.perform()

动作链中的结点命令

perform() # 提交队列中的所有操作

所有操作都需要通过 perform() 才会实际提交到浏览器。

rest_actions() # 清空队列中的操作

将队列中已存储的操作清空。

pause(seconds) # 暂停所有动作

相当于等待,用于链式操作过程中的等待。

第三部分:输入器控制

鼠标部分

单击操作

说明:

click(on_element=None)单击鼠标左键;

on_element指被点击的元素,如果该参数为None,将左键单击当前鼠标所在位置。

# 找到要单击的元素
element = driver.find_element(By.ID,'click-id')
# 单击元素
actions.click(element).perform()

双击操作

说明:

double_click(on_element=None)双击鼠标左键;

on_element指被点击的元素,如果该参数为None,将双击击当前鼠标所在位置。

element = driver.find_element (By.ID,'double-click-id')
# 双击元素
actions.double_click(element).perform()  

长按操作

说明:

click_and_hold(on_element=None)长按鼠标左键;

on_element指被点击的元素,如果该参数为None,将长按当前鼠标所在位置。

element = driver.find_element (By.ID,' click-and-hold-id')
# 长按元素
actions.click_and_hold (element).perform()

右击操作

说明:

context_click(on_element=None)单击鼠标右键;

on_element指被点击的元素,如果该参数为None,将右键单击当前鼠标所在位置。

element = driver.find_element (By.ID,'right-click-id')
# 右击元素
actions.context_click(element).perform()

鼠标悬停

说明:

move_to_element(to_element)鼠标悬停到某个元素;

to_element鼠标悬停到该元素上。

element = driver.find_element (By.ID, 'hover-id')
# 鼠标悬停
actions.move_to_element(element).perform()  

拖放操作

说明:

drag_and_drop(source, target)把元素拖动到另一个元素后松开;

Source鼠标拖动的元素(元素定位),

Target鼠标释放的目标元素(元素定位)。

drag_and_drop_by_offset(source, xoffset, yoffset)把元素拖到某个坐标然后松开;

Source鼠标拖动的元素(元素定位),

xoffsetx轴坐标,

yoffsety轴坐标。

move_by_offset(xoffset, yoffset)鼠标从当前位置移动到某个坐标;

xoffsetx轴坐标,

yoffsety轴坐标。

# 拖放源元素id
source = driver.find_element (By.ID, 'drag-source-id')
# 拖放目的地元素id
target = driver.find_element (By.ID, 'drag-target-id')
# 拖放操作
actions.drag_and_drop(source,
target).perform()  

鼠标移动

说明:

move_to_element_with_offset(to_element, xoffset, yoffset)鼠标移动到距某个元素(左上角坐标)多少距离的位置;

to_element指鼠标移动后停止到该元素上,

xoffsetx轴坐标,

yoffsety轴坐标。

鼠标释放

说明:

release(on_element=None)在某个元素位置松开鼠标左键;

on_element被鼠标释放的元素,如果该参数为None,将立即释放。

键盘部分

按键

说明:

actions.key_down(Keys.value)按下指定按键;

value按键名,可同时按下多个按键。

actions.key_up(Keys.value)`释放指定按键;

value按键名,可同时传入多个。

from selenium.webdriver.common.keys
import Keys
element = driver.find_element(By.ID,'input-id')
# 选择所有文本
actions.click(element). key_down(Keys.CONTROL,'a'). key_up(Keys.CONTROL, 'a').perform() 

键入

说明:

send_keys(*keys_to_send)发送单个或多个参数到当前焦点的元素;

*keys_to_send可变参数,可同时传入多个参数,如send_keys("a", "b")。

send_keys_to_element(element, *keys_to_send)发送单个或多个参数到指定元素;

element定位的元素,

*keys_to_send可变参数,可同时传入多个参数。

element =driver.find_element_by_id('input-id')
actions.click(element).send_keys('helloworld').perform()  # 输入文本

滚动部分

注意:此部分目前只有Chromium生效。

滚动到指定元素

actions.scroll_to_element(iframe) 窗口会滚动,使指定元素的底部位于屏幕底部;

iframe元素路径。

直接滚动指定数值

actions.scroll_by_amount(delta_x, delta_y) 从当前焦点直接滚动;

delta_xx轴滚动量,正数为向右侧滚动,负数为向左侧滚动;

delta_yy轴滚动量,正数为向下方滚动,负数为向上方滚动。