Python + Selenium + AutoIt 模擬鍵盤實現另存爲、上傳、下載操做詳解

前言

在web頁面中,可使用selenium的定位方式來識別元素,從而來實現頁面中的自動化,但對於頁面中彈出的文件選擇框,selenium就實現不了了,因此就需引用AutoIt工具來實現。css

AutoIt介紹

AutoIt簡單介紹下,AutoIt 目前最新是v3版本,這是一個使用相似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操做。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。而這是其它語言不可能作到或無可靠方法實現的(例如VBScript和SendKeys)。python

實現原理:

使用AutoIt下的工具去定位頁面外的元素屬性值,其次再利用AutoIt下的工具編寫合適的腳本,而後將腳本編譯成可執行文件,最後在自動化實現時,直接調用此腳本實現文件的上傳、下載等操做。web

備註:定位元素、編寫腳本和編譯,須要藉助AutoIt提供的工具,可是腳本編譯成可執行文件後,能夠直接使用。api

AutoIt的下載與安裝就再也不贅述,下載地址以下:https://www.autoitscript.com/site/autoit/downloads/瀏覽器

安裝成功後會出現以下菜單:工具

AutoIt工具使用

1.AutoIt Window Info用來識別Windows控件,根據識別的控件信息編寫腳本;x86爲32位ui

2.SciTE Script Editor用來寫腳本,並保存爲au3格式,按F5能夠調試代碼,但須要是操做彈框(上傳/下載/另存爲彈框)開啓的狀況下spa

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()會很快關閉瀏覽器。

好了,說了這麼多,本身須要努力的還有不少,明天中秋,祝你們中秋節快樂啦!

 

本文僅表明做者觀點,系做者@溫一壺清酒發表。轉載請註明出處:http://www.cnblogs.com/hong-fithing/
相關文章
相關標籤/搜索