专栏首页开源优测Selenium3源码之common下action_chains.py模块分析

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实现了模拟鼠标和键盘的动作,并提供了可以批量执行动作的方法。

总体的代码实现这里未深入解析其上下和相互的调用逻辑,但本文所演示的基本分析足够一个软件测试人员来进一步了解和学习,关键还是在于自身去熟悉和阅读源码,克服代码阅读的陌生感,为后续深入实战打下基础。

本文分享自微信公众号 - 开源优测(DeepTest),作者:苦叶子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接口测试 | 24 requests + unittest集成你的接口测试

    概述 本文就如何结合requests、unittest进行实例演示,如果你还不了解unittest、PO模型,请翻阅公众号前期发布的unittest专题和PO模...

    苦叶子
  • 接口测试 | 24 requests + unittest集成你的接口测试

    概述 本文就如何结合requests、unittest进行实例演示,如果你还不了解unittest、PO模型,请翻阅公众号前期发布的unittest专题和PO模...

    苦叶子
  • [快学Python3]数据结构-队列

    概述 什么是队列,简单而言:先进先出。 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,...

    苦叶子
  • Python学习(七)---- 面向对象学习(类)

    原文地址: https://blog.csdn.net/fgf00/article/details/52449707 编辑:智能算法,欢迎关注!

    智能算法
  • 85-OOP之继承

    如果两个类有很多相同之处,使用继承更为合理。 新品玩具熊增加了一个跑的行为,其他与原来的玩具熊一致。

    凯茜的老爸
  • python多进程打印进度条

    JNingWei
  • 星级设置

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • 第二章、深入类和对象

    zhang_derek
  • python之子类继承父类时进行初始化的一些问题

    __init__相当于是python类的构造方法,在类进行实例化时被调用,当子类和父类中都存在构造方法时,子类中需要显示调用父类的构造方法 。需要注意的是pyt...

    绝命生
  • PyQt 自定义窗口部件(二)

    本篇介绍用如何QPainter()画出一个可以显示分数的滑块控件,并使其能正确地响应鼠标事件,键盘事件以及自动调整尺寸。

    用户6021899

扫码关注云+社区

领取腾讯云代金券