Selenium3源码之common下action_chains.py模块分析
介绍
本文主要对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实现了模拟鼠标和键盘的动作,并提供了可以批量执行动作的方法。
总体的代码实现这里未深入解析其上下和相互的调用逻辑,但本文所演示的基本分析足够一个软件测试人员来进一步了解和学习,关键还是在于自身去熟悉和阅读源码,克服代码阅读的陌生感,为后续深入实战打下基础。
- Swift 面向对象解析(二)
- 谈谈基于OAuth 2.0的第三方认证 [中篇]
- [ASP.NET Web API]如何Host定义在独立程序集中的Controller
- ASP.NET Web API自身对CORS的支持: EnableCorsAttribute特性背后的故事
- 【黑客解析】黑客是如何实现数据库勒索的 ?
- 直播回看:高可用架构入门 —— 腾讯云架构演变及经验
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之一 :从上云开始
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之二:更好的网络
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构之三:更大的存储
- Socket学习总结系列(一) -- IM & Socket
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构 之四:替你分心的负载均衡
- 【腾讯云的1001种玩法】十分钟搞定云架构 · 什么是Bucket、什么是Object
- 【腾讯云的1001种玩法】十分钟轻松搞定云架构 · 负载均衡的最佳实践
- 【黑客浅析】像黑客一样思考
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序flex布局
- 细数 TS 中那些奇怪的符号
- 安装RabbitMQ无法访问localhost:15672的管理界面解决
- koa中http服务与websocket服务共享端口
- 第23天:NLP实战(七)——中文新闻主题分类
- Swoole v4.5.3 版本发布
- .NET5.0 单文件发布打包操作深度剖析
- 使用ng-container标签在SAP Spartacus里插入UI
- 自定义SAP Spartacus Cart界面
- 还是只使用console.log()进行调试?好吧,其实还有更多。
- SNMP++: Transport is not supported
- Codeforces Round #666 (Div. 2) A-D
- 深度剖析前端JavaScript中的原型(JS的对象原型)
- dotnet OpenXML 颜色变换
- n维空间的多面体的有向测度和重心