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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏听雨堂

电子签名实现的思路、困难及解决方案

        在办公自动化的流程中希望实现电子签名。         思路:             1、图片的存放:安全起见存放在库中为宜。最好不能被轻易下...

26650
来自专栏互联网杂技

React数据流和组件间的通信总结

首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则。 先介绍单向数据流吧。 React单向数据流:   React是单向数据流,数据主要...

38870
来自专栏大前端开发

从编程小白到全栈开发:响应用户的操作

咳嗽连续咳了一个多月,蓝瘦,我都快要忘记更新文章了...还好一个读友提醒我怎么好久没更新了,我才提起一口气,嘎吱嘎吱的重新转起我这磨损严重的脑袋来。

9740
来自专栏HTML5学堂

2016.05 第二周 群问题分享

HTML+CSS 如何实现360浏览器默认为极速模式打开网页 2016.05.09~2016.05.13 核心概念 meta参数设置 参考答案 <meta na...

362110
来自专栏前端新视界

Vue.js 系列教程 1:渲染,指令,事件

原文:intro-to-vue-1-rendering-directives-events 译者:nzbin 如果要我用一句话描述使用 Vue 的经历,我可...

24490
来自专栏极客编程

Cheerio,服务端的JQuery。

cheerio 是nodejs特别为服务端定制的,能够快速灵活的对JQuery核心进行实现。它工作于DOM模型上,且解析、操作、呈送都很高效。

11110
来自专栏iKcamp

微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频)+发布流程

第一章:小程序初级入门教程 小试牛刀【含视频】 视频地址:https://v.qq.com/x/page/i0554akzobq.html 这一章节中,我们尝...

29890
来自专栏技术墨客

React——Flow代码静态检查 转

Flow是Facebook开源的静态代码检查工具,他的作用是在运行代码之前对React组件以及Jsx语法进行静态代码的检查以发现一些可能存在的问题。Flow可以...

11810
来自专栏IMWeb前端团队

也谈 setTimeout

也谈 setTimeout setTimeout ,延迟一段事件执行代码,当然这是最基本的用法,这里不说基本用法。 jQuery 中的轮询 轮询,可能是 set...

222100
来自专栏用户2442861的专栏

IDEA Intellij小技巧和插件

使用IDEA Intellij已有两年,在此罗列一下在实践中觉得能有效提升开发效率的一些小技巧和插件。  1. 重设移动键 方向键和Home/End键离...

50110

扫码关注云+社区

领取腾讯云代金券