行為事件(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM