专栏首页从零开始学自动化测试selenium+python自动化93-鼠标事件(ActionChains)源码详解

selenium+python自动化93-鼠标事件(ActionChains)源码详解

ActionChains简介

actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。 这对于做更复杂的动作非常有用,比如悬停和拖放。

actionchains也可以和快捷键结合起来使用,如ctrl,shif,alt结合鼠标一起使用

当你使用actionchains对象方法,行为事件是存储在actionchains对象队列。当你使用perform(),事件按顺序执行。

  • 方法一:可以写一长串
menu = driver.find_element_by_css_selector(".nav")

hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()
  • 方法二:可以分几步写
menu = driver.find_element_by_css_selector(".nav")

hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

无论哪种方式,操作都是按照调用的顺序执行挨个执行!

方法介绍

1.以下提到的Keys类,是selenium里面的键盘事件类,导入方法:

from selenium.webdriver.common.keys import Keys

2.鼠标事件使用导入方法:

from selenium.webdriver.common.action_chains import ActionChains

class ActionChains(object):
    def __init__(self, driver):
        self._driver = driver
        self._actions = []

    def perform(self):
        # 执行行为事件

    def click(self, on_element=None):
        点击:
        - 如果参数不写,那么点击的是当前鼠标位置
        - 如果参数写定位到的元素对象element,那就是点这个元素

    def click_and_hold(self, on_element=None):
        鼠标左键按住某个元素
        - 如果参数不写,那么点的是当前鼠标位置
        - 如果参数写定位到的元素对象element,那就是点这个元素

    def context_click(self, on_element=None):
        鼠标右键点击
        - 如果参数不写,那么点的是当前鼠标位置
        - 如果参数写定位到的元素对象element,那就是点这个元素

    def double_click(self, on_element=None):
        双击鼠标
        - 如果参数不写,那么点的是当前鼠标位置
        - 如果参数写定位到的元素对象element,那就是点这个元素

    def drag_and_drop(self, source, target):
        按住源元素上的鼠标左键,然后移动到目标元素并释放鼠标按钮
        - source: 按住鼠标的元素位置
        - target: 松开鼠标的元素位置

    def drag_and_drop_by_offset(self, source, xoffset, yoffset):
        按住源元素上的鼠标左键,然后移动到目标偏移量并释放鼠标按钮。
        - source: 按住鼠标的元素位置
        - xoffset: X 轴的偏移量
        - yoffset: Y 轴的偏移量

    def key_down(self, value, element=None):
        只发送一个按键,而不释放它。只应用于修饰键(控制、alt和shift)。

        - value: 要发送的修饰符键。值在“Keys”类中定义。
        - element: 定位的元素
        如果element参数不写就是当前鼠标的位置

        举个例子,按住 ctrl+c::

        ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

    def key_up(self, value, element=None):
        # 释放按键,配合上面的一起使用

    def move_by_offset(self, xoffset, yoffset):
        将鼠标移动到当前鼠标位置的偏移量

         - xoffset: X轴 作为一个正整数或负整数移动到x偏移量
         - yoffset: Y轴 偏移,作为正整数或负整数。

    def move_to_element(self, to_element):
        鼠标悬停
        - to_element: 定位需要悬停的元素

    def move_to_element_with_offset(self, to_element, xoffset, yoffset):
        通过指定元素的偏移量移动鼠标。偏移量与元素的左上角相对
        - to_element: 定位需要悬停的元素
        - xoffset: X 轴偏移量
        - yoffset: Y 轴偏移量

    def release(self, on_element=None):
        释放一个元素上的鼠标按钮。

        - 如果参数不写,那么是当前鼠标位置
        - 如果参数写定位到的元素对象element,那就是这个元素.

    def send_keys(self, *keys_to_send):
        发送到当前焦点元素
        要发送的按键。修饰符键常数可以在“Keys”类。


    def send_keys_to_element(self, element, *keys_to_send):
        发送到定位到的元素上
        - element: 定位的元素
        - keys_to_send: 要发送的按键。修饰符键常数可以在“Keys”类。

源码可以在以下目录查看:Lib\site-packages\selenium\webdriver\common\action_chains.py

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:YOYO

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python+requests接口自动化项目完整框架设计

    前言 有很多小伙伴吵着要完整的项目源码,完整的项目属于公司内部的代码,这个是没法分享的,违法职业道德了,就算别人分享了,也只适用于本公司内部的业务。 所以用例的...

    上海-悠悠
  • selenium+python自动化90-多线程生成报告(BeautifulReport)

    前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生产一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完...

    上海-悠悠
  • Selenium+python自动化82-只截某个元素的图

    前言 selenium截取全图小伙伴们都知道,曾经去面试的时候,面试官问:如何截图某个元素的图?不要全部的,只要某个元素。。。小编一下子傻眼了, 苦心人,天不负...

    上海-悠悠
  • Selenium Webdriver 3.X源码分析之ActionChains

    > Selenium Webdriver 3.X源码分析系列第5篇,该系列原则上会将整个源码分享一遍

    苦叶子
  • GDAL的java环境配置以及将shp转换为json

    前两天,有位同仁再问我一个问题,问题大概是介个样子的:打包shp数据位zip格式并上传,上传完成后再在web上展示出来。这个需求,以前在Arcgis Onlin...

    lzugis
  • 子元素margin-top转移到父元素

    如果子元素设置了margin-top/bottom,且父元素没有触发hasLayout,那么子元素的margin就可能转移到父元素。具体表现如下图(父元素虽然设...

    gojam
  • unity中自定义鼠标样式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • 首个Linux勒索软件马失前蹄:加密存在漏洞可被人攻破

    在Windows里很早就有了ransomware(赎金勒索软件),直到Linux中的Linux.Encoder.1,也就是第一个linux勒索软件的出现。这款软...

    FB客服
  • Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation

        fs2是scalaz-stream的最新版本,沿用了scalaz-stream被动式(pull model)数据流原理但采用了全新的实现方法。fs2比较...

    用户1150956
  • 谷歌、DeepMind和OpenAI都在用的Transformer是如何工作的?| 干货

    不论是各处霸榜的谷歌BERT、OpenAI最近的强大NLP模型GPT-2,还是DeepMind击败星际2顶尖职业玩家的AlphaStar,背后都有 Transf...

    量子位

扫码关注云+社区

领取腾讯云代金券