行为事件(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 = []
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">perform</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
    <span class="hljs-comment"># 执行行为事件</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">click</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, on_element=None)</span></span>:
    点击:
    - 如果参数不写,那么点击的是当前鼠标位置
    - 如果参数写定位到的元素对象element,那就是点这个元素

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">click_and_hold</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, on_element=None)</span></span>:
    鼠标左键按住某个元素
    - 如果参数不写,那么点的是当前鼠标位置
    - 如果参数写定位到的元素对象element,那就是点这个元素

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">context_click</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, on_element=None)</span></span>:
    鼠标右键点击
    - 如果参数不写,那么点的是当前鼠标位置
    - 如果参数写定位到的元素对象element,那就是点这个元素

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">double_click</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, on_element=None)</span></span>:
    双击鼠标
    - 如果参数不写,那么点的是当前鼠标位置
    - 如果参数写定位到的元素对象element,那就是点这个元素

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">drag_and_drop</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, source, target)</span></span>:
    按住源元素上的鼠标左键,然后移动到目标元素并释放鼠标按钮
    - <span class="hljs-symbol">source:</span> 按住鼠标的元素位置
    - <span class="hljs-symbol">target:</span> 松开鼠标的元素位置

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">drag_and_drop_by_offset</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, source, xoffset, yoffset)</span></span>:
    按住源元素上的鼠标左键,然后移动到目标偏移量并释放鼠标按钮。
    - <span class="hljs-symbol">source:</span> 按住鼠标的元素位置
    - <span class="hljs-symbol">xoffset:</span> X 轴的偏移量
    - <span class="hljs-symbol">yoffset:</span> Y 轴的偏移量

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">key_down</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, value, element=None)</span></span>:
    只发送一个按键,而不释放它。只应用于修饰键(控制、alt和shift)。

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

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

    ActionChains(driver).key_down(Keys.CONTROL).send_keys(<span class="hljs-string">'c'</span>).key_up(Keys.CONTROL).perform()

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">key_up</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, value, element=None)</span></span>:
    <span class="hljs-comment"># 释放按键,配合上面的一起使用</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">move_by_offset</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, xoffset, yoffset)</span></span>:
    将鼠标移动到当前鼠标位置的偏移量

     - <span class="hljs-symbol">xoffset:</span> X轴 作为一个正整数或负整数移动到x偏移量
     - <span class="hljs-symbol">yoffset:</span> Y轴 偏移,作为正整数或负整数。


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">move_to_element</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, to_element)</span></span>:
    鼠标悬停
    - <span class="hljs-symbol">to_element:</span> 定位需要悬停的元素


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">move_to_element_with_offset</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, to_element, xoffset, yoffset)</span></span>:
    通过指定元素的偏移量移动鼠标。偏移量与元素的左上角相对
    - <span class="hljs-symbol">to_element:</span> 定位需要悬停的元素
    - <span class="hljs-symbol">xoffset:</span> X 轴偏移量
    - <span class="hljs-symbol">yoffset:</span> Y 轴偏移量


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">release</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, on_element=None)</span></span>:
    释放一个元素上的鼠标按钮。

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

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">send_keys</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, *keys_to_send)</span></span>:
    发送到当前焦点元素
    要发送的按键。修饰符键常数可以在“Keys”类。


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">send_keys_to_element</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, element, *keys_to_send)</span></span>:
    发送到定位到的元素上
    - <span class="hljs-symbol">element:</span> 定位的元素
    - <span class="hljs-symbol">keys_to_send:</span> 要发送的按键。修饰符键常数可以在“Keys”类。</code></pre>

举个案例

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

# coding:utf-8
posted @ 2019-02-15 13:58  韦大仙  阅读(5277)  评论(0编辑  收藏  举报