selenium+python自动化94-行为事件(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”类。

举个案例

1.实现Ctrl +F5 的组合键功能

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
time.sleep(3)
# 实现Ctrl+F5刷新
ActionChains(driver).key_down(Keys.CONTROL).send_keys(Keys.F5).key_up(Keys.CONTROL).perform()

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

原文地址:https://www.cnblogs.com/jason89/p/8998220.html

时间: 2024-08-29 21:37:06

selenium+python自动化94-行为事件(ActionChains)源码详解的相关文章

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe

butterknife源码详解

butterknife源码详解 作为Android开发者,大家肯定都知道大名鼎鼎的butterknife.它大大的提高了开发效率,虽然在很早之前就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码.最近在学习运行时注解,决定今天来系统的分析下butterknife的实现原理. 如果你之前不了解Annotation,那强烈建议你先看注解使用. 废多看图: 从图中可以很直观的看出它的module结构,以及使用示例代码. 它的目录和我们在注解使用这篇文章中介绍的一样,大体

Guava Cache源码详解

目录 一.引子 二.使用方法 2.1 CacheBuilder有3种失效重载模式 2.2 测试验证 三.源码剖析 3.1 简介 3.2 源码剖析 四.总结 优点: 缺点: 正文 回到顶部 一.引子 缓存有很多种解决方案,常见的是: 1.存储在内存中 : 内存缓存顾名思义直接存储在JVM内存中,JVM宕机那么内存丢失,读写速度快,但受内存大小的限制,且有丢失数据风险. 2.存储在磁盘中: 即从内存落地并序列化写入磁盘的缓存,持久化在磁盘,读写需要IO效率低,但是安全. 3.内存+磁盘组合方式:这种

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Java concurrent AQS 源码详解

一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

IntentService源码详解

IntentService可以做什么: 如果你有一个任务,分成n个子任务,需要它们按照顺序完成.如果需要放到一个服务中完成,那么IntentService就会使最好的选择. IntentService是什么: IntentService是一个Service(看起来像废话,但是我第一眼看到这个名字,首先注意的是Intent啊.),所以如果自定义一个IntentService的话,一定要在AndroidManifest.xml里面声明. 从上面的"可以做什么"我们大概可以猜测一下Inten