前言
在web頁面中,可以使用selenium的定位方式來識別元素,從而來實現頁面中的自動化,但對於頁面中彈出的文件選擇框,selenium就實現不了了,所以就需引用AutoIt工具來實現。
AutoIt介紹
AutoIt簡單介紹下,AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。而這是其它語言不可能做到或無可靠方法實現的(例如VBScript和SendKeys)。
實現原理:
使用AutoIt下的工具去定位頁面外的元素屬性值,其次再利用AutoIt下的工具編寫合適的腳本,然后將腳本編譯成可執行文件,最后在自動化實現時,直接調用此腳本實現文件的上傳、下載等操作。
備注:定位元素、編寫腳本和編譯,需要借助AutoIt提供的工具,但是腳本編譯成可執行文件后,可以直接使用。
AutoIt的下載與安裝就不再贅述,下載地址如下:https://www.autoitscript.com/site/autoit/downloads/
安裝成功后會出現如下菜單:
AutoIt工具使用
1.AutoIt Window Info用來識別Windows控件,根據識別的控件信息編寫腳本;x86為32位
2.SciTE Script Editor用來寫腳本,並保存為au3格式,按F5可以調試代碼,但需要是操作彈框(上傳/下載/另存為彈框)開啟的情況下
3.Complie Script to .exe, 將剛編寫的腳本,編譯成可執行文件;
4.編譯后在Python代碼中調用
想必介紹到這,或多或少有所了解了,對AutoIt工具下的功能點也清楚了,Run Script是運行腳本的,我們是要到Python代碼中調用,所以此處就略過了。
實例講解
接下來就用一個實例來講解下AutoIt工具的具體使用,實例功能是:把百度首頁中的百度圖片另存為到本地或任意磁盤
在做這個事情的時候,我們要知道,步驟是先要選中圖片,並右擊,選擇另存為,然后輸入文件名以及保存的位置,最后點擊保存。人工操作鼠標很簡單,但現在是要使用代碼來實現該功能,可細化分為四步,如下:
1.使用Selenium功能彈出右鍵菜單
2.利用win32api選擇相關菜單
3.調用AutoIt實現另存為操作
4.到Python代碼中調用
實現第一步,在瀏覽器中定位到圖片元素,代碼如下:
context = driver.find_element_by_css_selector(".index-logo-src") ActionChains(driver).context_click(context).perform()
實現第二步,模擬鍵盤操作,鼠標移到另存為處,使用win32api操作,代碼如下:
win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(13, 0, 0, 0) time.sleep(1) win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(1) win32api.keybd_event(40, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(1)
win32api的鍵盤碼如下:
上面代碼的13與40按鍵對應的是回車與下鍵,在鍵盤碼的圖片中很詳細
實現上述兩步代碼后,會彈出如下所示框,讓輸入文件名以及保存路徑,該對話框已經是頁面外的元素了,使用普通的定位時定不到了,所以就需要使用AutoIt工具來實現。
實現第三步,操作如下:
①打開autoit工具包下的AutoIt Window Info(x64)工具,版本按自己電腦系統來,界面如下所示:
1.1鼠標點中Finder Tool並拖動到輸入文件名處,操作如下所示,得到下圖結果
1.2重復上述定位步驟,定位保存按鈕,結果如下圖所示
②元素定位到了,接下來就是使用AutoIt工具包下的SciTE Script Editor寫腳本,並保存為au3格式,注意:此工具中;表注釋
根據定位到的參數值,寫如下腳本:
ControlFocus("另存為","","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("另存為","", "Edit1", "G:\201801-\python_code\Demo\autoit\baidu.png") Sleep(2000) ControlClick("另存為","","Button2")
代碼解釋:
第一行:ControlFocus ( "title", "窗口文本", controlID) 設置輸入焦點到指定窗口的某個控件上;
第二行:WinWait ( "title" , "窗口文本" , 超時時間 ) 暫停腳本的執行直至指定窗口存在(出現) 為止;
第三行:ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本;
第四行:Sleep ( 延遲 ) 使腳本暫停指定時間段;
第五行:ControlClick ( "title", "窗口文本", 控件ID , 按鈕 , 點擊次數 ) 向指定控件發送鼠標點擊命令;
其中, title即AutoIt Window Info識別出的Title字段, controlID即AutoItWindow Info識別出的Class和Instance的拼接, 如上圖拼接后的結果應為:Button2,也就是ClassnameNN的值。
③使用AutoIT工具包下的Complie Script to .exe工具把剛編寫的腳本編譯成可執行文件,操作如下:
執行上步驟后,會出現test.exe可執行文件,如下:
第四步,到Python代碼中調用該可執行文件,操作代碼如下:
import os os.system(os.getcwd() + "\\autoit\\test.exe")
運行Python代碼,在定義的路徑下會看到已保存的百度圖片,如下所示:
整體代碼實現如下,僅供參考:
# coding=utf-8 from selenium import webdriver # 鼠標操作需要導入ActionChains類,因為鼠標操作的方法封裝在該類中 from selenium.webdriver.common.action_chains import ActionChains import time import os import win32con import win32api driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.maximize_window() time.sleep(2) # 鼠標右擊操作,context_click() context = driver.find_element_by_css_selector(".index-logo-src") ActionChains(driver).context_click(context).perform() time.sleep(3) # 按下下鍵 win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) win32api.keybd_event(40, 0, 0, 0) time.sleep(1) # 按下回車 win32api.keybd_event(13, 0, 0, 0) time.sleep(1) # 釋放回車鍵 win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(1) # 釋放下鍵 win32api.keybd_event(40, 0, win32con.KEYEVENTF_KEYUP, 0) time.sleep(1) os.system(os.getcwd() + "\\autoit\\test.exe") # 調用exe文件后,延時3秒 time.sleep(3) driver.quit()
將百度首頁中的圖片另存為還有一個實現方法,不用win32api操作,直接在AutoIt編寫腳本中發送個V,因為選擇另存為和按V是一樣的作用,AutoIt編寫腳本代碼如下:
send("v") Sleep(1000) ControlFocus("另存為","","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("另存為","", "Edit1", "G:\201801-\python_code\Demo\autoit\baidu1.png") Sleep(2000) ControlClick("另存為","","Button2")
重復編譯操作,然后在Pyhton代碼中實現如下,僅供參考:
# coding=utf-8 from selenium import webdriver # 鼠標操作需要導入ActionChains類,因為鼠標操作的方法封裝在該類中 from selenium.webdriver.common.action_chains import ActionChains import time import os import win32con import win32api driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.maximize_window() time.sleep(2) # 鼠標右擊操作,context_click() context = driver.find_element_by_css_selector(".index-logo-src") ActionChains(driver).context_click(context).perform() time.sleep(3) os.system(os.getcwd() + "\\autoit\\test1.exe") time.sleep(3) driver.quit()
運行代碼后,圖片保存成功,如下:
如上就是完整的將網頁圖片另存為的操作,上傳/下載的操作一樣,把另存為學會,其他兩類也就迎刃而解了。
總結
在琢磨模擬鍵盤操作時,有兩個錯誤點,而導致編寫的代碼與腳本總是運行不成功,后面自己仔細查找原因,以及百度,終於是給解決了,所以故記錄下,也好看看自己的進步過程。
問題一
模擬按鍵操作,之前沒選對操作方式,這是自己的Python基礎薄弱,需要補充,后面找到win32api的方式,並找到鍵盤圖,按鍵操作就完美解決。
問題二
編寫autoit的腳本,定位后,controlID沒有拼接,而是直接寫的Edit,Button,而導致代碼調用腳本,但沒執行操作,controlID即AutoItWindow Info識別出的Class和Instance的拼接, 如上圖拼接后的結果應為:Button2,也就是ClassnameNN的值。
問題三
在調用exe文件成功並執行操作后,還沒點擊保存按鈕,瀏覽器就立馬關閉了,后面一想,在調用exe文件后,加個延時就解決了,如果exe文件執行的內容多,延時需要長些,不然driver.quit()會很快關閉瀏覽器。
好了,說了這么多,自己需要努力的還有很多,明天中秋,祝大家中秋節快樂啦!