介绍
本文主要对action_chains.py模块的源码进行分析说明,其代码位置如图:
在action_chains.py模块中定义和实现了类:ActionChains,主要实现鼠标移动,鼠标按键动作,按键和上下文菜单交互。 这对于执行更复杂的操作(如鼠标悬停、拖放)非常有用。
该模块源码是掌握selenium必须阅读和掌握的!!!
下面我们通过该源码模块的结构大致了解下ActionChains类的成员:
下面我们通过一张表对上图中对外使用的成员进行分类(即带下划线的成员不放入下表):
分类 | 函数名 | 描述 |
---|---|---|
鼠标操作 | def click(self, on_element=None) | 鼠标左键单击 |
鼠标操作 | def click_and_hold(self, on_element=None) | 鼠标左键按键,不释放 |
鼠标操作 | def context_click(self, on_element=None) | 鼠标右击 |
鼠标操作 | def double_click(self, on_element=None) | 鼠标左键双击 |
鼠标操作 | def drag_and_drop(self, source, target) | 鼠标拖曳动作,将指定元素位置拖曳到目标元素位置,来移动元素 |
鼠标操作 | def drag_and_drop_by_offset(self, source, xoffset, yoffset) | 鼠标拖曳动作,将指定元素按沿x、y方向拖曳指定距离来移动元素 |
鼠标操作 | def move_by_offset(self, xoffset, yoffset) | 将鼠标光标沿x、y方向移动指定距离,来实现鼠标的移动 |
鼠标操作 | def move_to_element(self, to_element) | 将鼠标光标移动到指定的元素上 |
鼠标操作 | def move_to_element_with_offset(self, to_element, xoffset, yoffset) | 将鼠标光标移动到指定的元素相对元素左上角位置偏移(xoffset、yoffset)的位置 |
鼠标操作 | def release(self, on_element=None) | 释放鼠标,与click_and_hold函数配对使用 |
键盘操作 | def key_down(self, value, element=None) | 按下指定的键盘按键 |
键盘操作 | def key_up(self, value, element=None) | 释放已按下的键盘按键(与key_down配套使用) |
键盘操作 | def send_keys(self, *keys_to_send) | 键盘输入 |
键盘操作 | def send_keys_to_element(self, element, *keys_to_send) | 给指定元素(可输入元素)进行键盘输入 |
其他 | def perform(self) | 执行所有存储的动作 |
其他 | def reset_actions(self) | 清空所有存储的动作 |
其他 | def pause(self, seconds) | 在指定的时间内暂定所有的输入 |
下面从上节分类中各抽取一个函数进行分析说明,其他的请自行阅读源码学习:
__init__函数说明
用于初始化创建ActionChains实例
def __init__(self, driver):
"""
初始化一个ActionChains实例
:参数说明:
- driver: webdriver实例对象
"""
self._driver = driver
# 动作存储列表
self._actions = []
# 判断是否为w3c兼容的浏览器
if self._driver.w3c:
self.w3c_actions = ActionBuilder(driver)
perform函数说明 用于执行所有存储的动作
def perform(self):
"""
执行所有存储的动作
"""
# 如果是w3c兼容的浏览器
if self._driver.w3c:
self.w3c_actions.perform()
else:
# 遍历动作列表,按序执行动作
for action in self._actions:
action()
click函数 用于实现模拟鼠标左键单击动作
def click(self, on_element=None):
"""
模拟鼠标左键单击
:参数说明:
- on_element: 鼠标要单击的目标元素.
如果为 None, 则在鼠标光标当前位置单击.
"""
# 如果是w3c兼容性浏览器则执行该片段代码
if self._driver.w3c:
# 单击动作
self.w3c_actions.pointer_action.click(on_element)
# 单击完后,暂停下
self.w3c_actions.key_action.pause()
self.w3c_actions.key_action.pause()
else:
# 先判断元素是否存在
if on_element:
# 存在则,先移动到目标元素上
self.move_to_element(on_element)
# 发送单击指令
self._actions.append(lambda: self._driver.execute(
Command.CLICK, {'button': 0}))
return self
总体而言action_chains.py实现了模拟鼠标和键盘的动作,并提供了可以批量执行动作的方法。
总体的代码实现这里未深入解析其上下和相互的调用逻辑,但本文所演示的基本分析足够一个软件测试人员来进一步了解和学习,关键还是在于自身去熟悉和阅读源码,克服代码阅读的陌生感,为后续深入实战打下基础。