之前用Airtest_Selenium做Web自動化測試,一直很順利。直到遇到一個導出數據的功能:這個功能會將數據導出生成一個excel文件,顯示在窗口的下部,然后繼續執行腳本的時候會出現一個奇怪的現象,從日志截圖看識別到的元素位置是沒問題的,但是實際點擊的位置卻向下偏移了一些,幾次嘗試發現原來是這個下載框搞的鬼。


我首先嘗試了使用Airtest自帶的圖像識別功能嘗試對這個下載對話框進行操作,結果運行時報錯:找不到該元素。
和群里的朋友討論,原來Airtest在做PC端的web測試時使用的也是selenium的框架,而這個下載框不屬於瀏覽器的組件,所以Airtest也沒法對它進行操作。於是我Google了一番,發現Selenium其實是有對鍵盤的操作的,比如from selenium.webdriver.common.keys import Keys
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
但是實際嘗試時發現這個操作需要基於一個element來進行,而我當前的頁面又沒有一個合適的element滿足條件,導致實際運行要么提示該element沒有指定的attribute,或者干脆沒有任何效果,這條路也走不通。
后來我繼續Google以及和群里的同學討論研究,終於發現了一個庫來解決這個問題:就是pynput。
安裝非常簡單,pip install pynput直接搞定,可能還需要額外安裝一個pywin32,畢竟是要操作windows鍵盤鼠標來的。
這個場景下我只需要做兩個鍵盤操作:首先按組合鍵Ctrl+J打開下載列表,然后再按Ctrl+W關閉打開的下載列表tab頁,這樣就自動回到了之前的主頁,下面也不會有這個下載框了。需要注意的一點是,pynput對鍵盤的操作分為press和release兩步,千萬不要忘了release操作,否則忙乎半天出了錯還是一頭霧水。代碼實例如下:
from pynput.keyboard import Controller as Keyboard
def export_handler():
with keyboard.pressed(Key.ctrl):
#通過快捷鍵Ctrl+J打開下載詳清tab,再按Ctrl+W關閉該tab
keyboard.press('j')
keyboard.release('j')
sleep(3.0)
keyboard.press('w')
keyboard.release(Key.ctrl)
keyboard.release('w')
深夜發稿,拖了兩天的鍋。代碼寫的很low,見笑。以上就是我處理web自動化遇到的一個小坑的過程,也希望Airtest的同學能夠把這塊的支持加進去,讓產品越做越好。https://github.com/AirtestProject/Airtest/issues/406