1. 程式人生 > >做UI最全的滑鼠鍵盤事件!

做UI最全的滑鼠鍵盤事件!

在使用 Selenium WebDriver 做自動化測試的時候,會經常模擬滑鼠和鍵盤的一些行為。比如使用滑鼠單擊、雙擊、右擊、拖拽等動作;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中,有一個專門的類來負責實現這些測試場景,那就是ActionChains類,在使用該類做鍵盤操作的過程中會配合使用到 Keys 資料儲存類,Keys包含鍵盤上所有特殊按鍵。

一、滑鼠點選操作

click(element=None)左擊context_click(element=None)右擊
double_click(element=None)雙擊
move_to_element(element)移動滑鼠到元素中間(懸停)
drag_and_drop(source,target)source上按下左鍵拖動到target元素上
click_and_hold(element=None)在元素上按下滑鼠左鍵
release()釋放滑鼠
perform()執行ActionChains中儲存的動作

element有None預設值的表示不傳入引數該動作在原地執行。

滑鼠事件具體使用示例如下:
示例1:滑鼠左鍵點選

action=ActionChains(driver)action.click() # 在滑鼠當前位置單擊
action.perform() # 執行action儲存的動作
action.click(driver.find_element_by_link_text('新聞')).perform()#滑鼠在 '新聞' 元素位置單擊
#注意:action.click() 動作並未執行,它只是儲存在action例項中,需要通過action.perform()方法執行存
#儲動作;滑鼠鍵盤事件動作動作可以儲存多個,然後一次性執行。如下執行Cytl+C:
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

示例2:滑鼠右擊

action=ActionChains(driver)action.context_click().perform()
 # 在滑鼠當前位置右擊
action.context_click(driver.find_element_by_link_text('新聞')).perform()
# 滑鼠在 '新聞' 元素位置右擊

示例3:滑鼠雙擊操作

action=ActionChains(driver)action.double_click().perform()
 # 在滑鼠當前位置雙擊
action.double_click(driver.find_element_by_link_text('新聞')).perform()
# 滑鼠在 '新聞' 元素位置雙擊擊

示例4:滑鼠移動

# 滑鼠移動到 '新聞' 元素上的中心點
action.move_to_element(element).perform()
# 滑鼠在原位置向x軸移動xoffset、y軸移動yoffset;xoffset、yoffset可為正負數
action.move_by_offset(-200,100).perform()
# 滑鼠移動到element元素中心點偏移xoffset、yoffset
action.move_to_element_with_offset(element,-500,600).perform()
action.move_by_offset(xoffset,yoffset) 
#這裡需要注意,如果 xoffset 為負數,表示橫座標向左移動,yoffset 為負數表示縱座標向上移動。而且如果#這兩個值大於當前螢幕的大小,滑鼠只能移到螢幕最邊界的位置。

滑鼠移動操作在測試環境中比較常用到的場景是需要獲取某元素的 flyover/tips,實際應用中很多 flyover 只有當滑鼠移動到這個元素之後才出現,所以這個時候通過執行 move_to_element(to_element) 操作,就能達到預期的效果。根據我個人的經驗,這個方法對於某些特定產品的圖示的 flyover/tips 也不起作用,雖然在手動操作的時移動滑鼠到這些圖示上面可出現 flyover,但當使用 WebDriver 來模擬這一操作時,雖然方法成功執行,但 flyover 卻不出來。所以在實際應用中,還需要對具體的產品頁面做相應的處理。

######示例5:滑鼠懸停
```action.click_and_hold().perform()
 # 滑鼠在當前位置按下並不釋放
action.click_and_hold(driver.find_element_by_link_text('設定')).perform()
# 滑鼠 在'設定' 上懸停
action.click_and_hold(element) 這個方法實際上是執行了兩個動作,首先是滑鼠移動到元素 
element,然後再 click_and_hold, 所以這個方法也可以寫成 :
action.move_to_element(element).click_and_hold()

示例6:滑鼠拖拽

target = driver.find_element_by_id("sk") # 獲取目標元素
# 將元素source拖動到target的位置
ActionChains(driver).drag_and_drop(source, target).perform()
# 滑鼠拖拽動作,將 source 元素向x、y軸方向移動 (xoffset, yoffset) ,其中xoffset 為橫座標,yoffset 為縱座標。
ActionChains(driver).drag_and_drop_by_offset(source, -100,100).perform()

在這個拖拽的過程中,已經使用到了滑鼠的組合動作,首先是滑鼠點選並按住 lick_and_hold( source) 元素,然後執行滑鼠移動動作 (move_to),移動到 target 元素位置或者是 (xoffset, yoffset) 位置,再執行滑鼠的釋放動作 (release)。所以上面的方法也可以拆分成以下的幾個執行動作來完成:

ActionChains(driver).click_and_hold(source).move_to_element(target).release().perform()

示例7:滑鼠釋放操

action = ActionChains(driver)action.release().perform() # 釋放按下的滑鼠

二、鍵盤操作

對於鍵盤的模擬操作,ActionChains類中有提供了按下key_down(keys)、釋放key_up(keys)、按下並釋放send_keys(keys_to_send) 等方法。鍵盤的操作有普通鍵盤和修飾鍵盤兩種 。普通鍵盤為常用字母數字等;修飾鍵盤為Ctrl、Shift、Alt等,修飾鍵盤一般和其他鍵組合使用的鍵。使用鍵盤操作時需要引入from selenium.webdriver.common.keys import Keys包,Keys 包中含所有特殊用鍵。

1、普通鍵盤操作

鍵盤操作使用send_keys(*keys_to_send)方法,該方法支援多個按鍵連續操作,如果需要對某個元素執行按鍵操作使用send_keys_to_element( element, *keys_to_send)方法。具體使用如下示例:

from selenium.webdriver.common.keys import Keys
action = ActionChains(driver)action.send_keys(Keys.SPACE).perform() 
# 按下並釋放空格鍵
action.send_keys(Keys.TAB).perform()
 # 按下並釋放Tab鍵
action.send_keys(Keys.BACKSPACE).perform() 
# 按下並釋放Backspace鍵
action.send_keys(Keys.BACKSPACE,Keys.SPACE).perform() 
# 連續執行按鍵動作action.send_keys(Keys.TAB).send_keys(Keys.TAB).perform() 
# 也可以這樣組合'''針對某個元素髮出某個鍵盤的按鍵操作,或者是輸入操作'''
element = driver.find_element_by_id('query')
# 對一元素使用鍵盤操作
action.send_keys_to_element(element, 'selenium').perform()
# 上面動作拆解為下面動作
action.click(element).send_keys('selenium').perform()

注意:
除了 ActionChains類有 send_keys(keys_to_send)方法外,WebElement 類也有一個 send_keys_to_element(keys_to_send)方法,這兩個方法對於一般的輸入操作基本上相同,不同點在於以下幾點:
第一點:Actions 中的 send_keys(*keys_to_send)對修飾鍵操作後並不會釋放,也就是說當呼叫 actions.send_keys(Keys.ALT)、 actions.send_keys(Keys.CONTROL)、action.send_keys(Keys.SHIFT) 的時候,相當於呼叫 actions.key_down(keys_to_send),而如果在現實的應用中想要模擬按下並且釋放這些修飾鍵,應該先action.reset_actions()重設action,然後再呼叫 action.send_keys(keys.NULL).perform()取消按下的修飾鍵。
第二點,在 WebDriver中,我們可以使用 WebElement 類的 send_keys() 來上傳附件,比如 element.send_keys(“D:\test\uploadfile\test.jpg”)上檔案,但不能使用ActionChains來上傳附件,因為type=’file’的輸入框並不支援鍵盤輸入。

2、修飾鍵的使用

修飾鍵是鍵盤上的一個或者一組特別的鍵,當它與一般按鍵同時使用時,用來臨時改變一般鍵盤的普通行為。

修飾鍵一般跟普通鍵組合使用,比如 Ctrl+A、Alt+F4等。

我們電腦中的修飾鍵一般有以下幾種修:Ctrl、Alt(Option)、Shift、AltGr、Windows logo、Command、FN(Function)。一般使用的都是前三種。

對於修飾鍵的使用在Python selenium中一般使用按下key_down(keys)、釋放key_up(keys)、按下並釋放send_keys(keys_to_send)組合實現。

action = ActionChains(driver)action.key_down(Keys.CONTROL).perform()
 # 按下ctrl鍵
action.key_up(Keys.CONTROL).perform() 
# 釋放ctrl鍵
action.key_down(Keys.SHIFT).perform()
 # 按下shift鍵
action.key_up(Keys.SHIFT).perform()
 # 釋放shift鍵
action.key_down(Keys.ALT).perform()
 # 按下alt鍵
action.key_up(Keys.ALT).perform()
 # 釋放alt鍵

示例:通過ctrl+c 來複制文字

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

三、WebElement.send_keys()鍵盤操作

WebElement元素物件下的send_keys也支援組合鍵盤操作。

程式碼示例如下:

element = 
driver.find_element_by_id('query')element.send_keys('selenium')element.send_keys(Keys.BACK_SPACE)
 # 按BACKSPACE刪除一個字元
element.send_keys(Keys.SPACE) 
# 空格鍵(Space)
element.send_keys(Keys.CONTROL, 'a') 
# 全選(Ctrl+A)
element.send_keys(Keys.CONTROL, 'c') 
# 複製(Ctrl+C)
element.send_keys(Keys.CONTROL, 'v')
 # 貼上(Ctrl+v)
element.send_keys(Keys.TAB)
# 製表鍵(Tab)
element.send_keys(Keys.ESCAPE) 
# 回退鍵(Esc)
element.send_keys(Keys.ENTER) 
# 回車鍵(Enter)

對測試技術感興趣的同學,歡迎加QQ群706315665,一起學習,相互討論。

群內已經有小夥伴將知識體系整理好(原始碼,筆記,PPT,學習視訊),歡迎加群免費領取

加QQ群706315665,免費領取資料