今天補充一種文件上傳的方法
主要是因為工作中使用SendKeys方法不穩定,具體方法見:
Python Selenium 文件上傳之SendKeys
這種方法直接通過命令行執行腳本時沒有問題,可以成功上傳,但是如果通過saltstack 遠程控制執行時,SendKeys就定位不到窗口了。
所以采用這種新的方式來實現文件上傳功能,並完美的解決了這個問題。
具體操作步驟如下:
1、下載工具 AutoIt及使用
AutoIt目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。
官方網站:https://www.autoitscript.com/site/
選擇下載文件
選擇安裝路徑即可,其他默認安裝。安裝后在程序中可以找到這些應用。
AutoIt Windows Info 用於幫助我們識Windows控件信息。
Compile Script to.exe 用於將AutoIt生成 exe 執行文件。
Run Script 用於執行AutoIt腳本。
SciTE Script Editor 用於編寫AutoIt腳本。
文件上傳實例
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>upload_file</title> <link href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" /> </head> <body> <div class="row-fluid"> <div class="span6 well"> <h3>upload_file</h3> <input type="file" name="file" /> </div> </div> </body> <script src="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.js"></script> </html>
將上面的html代碼保存為uplad.html文件,通過瀏覽器打開,效果如下:
以操作upload.html上傳彈出的窗口為例講解AutoIt實現上傳過程。
1.1、首先打開AutoIt Windows Info 工具,鼠標點擊Finder Tool,鼠標將變成一個小風扇形狀的圖標,按住鼠標左鍵拖動到需要識別的控件上。
通過AutoIt Windows Info 獲得以下信息。
窗口的title為“打開”,標題的Class為“#32770”。
文件名輸入框的class 為“Edit”,Instance為“1” ,所以ClassnameNN為“Edit1”。
打開按鈕的class 為“Button”,Instance為“1” ,所以ClassnameNN為“Button1”。
1.2、根據AutoIt Windows Info 所識別到的控件信息打開SciTE Script Editor編輯器,編寫腳本。
;該腳本的寫法是 ';'是注釋會注釋后面的內容,所以單行結尾加不加';'都可以 ;ControlFocus ( "title", "窗口文本", controlID) 設置輸入焦點到指定窗口的某個控件上; ;WinWait ( "title題" , "窗口文本" , 超時時間 ) 暫停腳本的執行直至指定窗口存在(出現)為止; ;ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本; ;Sleep ( 延遲 ) 使腳本暫停指定時間段; ;ControlClick ( "title", "窗口文本", 控件ID , 按鈕 , 點擊次數 ) 向指定控件發送鼠標點擊命令; ;其中,title即AutoIt Window Info識別出的Title字段,controlID即AutoIt Window Info識別出的Class和Instance的拼接,如上圖拼接后的結果應為:Button1; ;title必須對應正確即窗口的title,"text"可寫可不寫, ControlFocus("打開","text","Edit1") WinWait("[CLASS:#32770]","",10) ;ControlSetText("打開","","Edit1","D:\upload_file.txt") 這里的“text” 不必寫,寫就不能正確執行了 ControlSetText("打開","","Edit1","D:\upload_file.txt") Sleep(2000) ControlClick("打開","","Button1")
ControlFocus()方法用於識別Window窗口。WinWait()設置10秒鍾用於等待窗口的顯示,其用法與WebDriver 所提供的implicitly_wait()類似。ControlSetText()用於向“文件名”輸入框內輸入本地文件的路徑。這里的Sleep()方法與Python中time模塊提供的Sleep()方法用法一樣,不過它是以毫秒為單位,Sleep(2000)表示固定休眠2000毫秒。ControlClick()用於點擊上傳窗口中的“打開”按鈕。
保存后會生成au3后綴的文件
AutoIt的腳本已經寫好了,可以通過菜單欄“Tools”-->“Go” (或按鍵盤F5)來運行一個腳本吧!注意在運行時上傳窗口當前處於打開狀態。運行后即可看到會自動輸入文件路徑並自動點擊“打開”完成文件上傳。
1.3、保存的腳本可以通過Run Script 工具將其打開運行,但我們的目的是希望這個腳本被Python程序調用,那么就需要將其生成exe程序。打開Compile Script to.exe工具,將其生成為exe可執行文件。
2、python 實現文件上傳
通過Python 的os模塊的system()方法可以調用exe程序並執行。
代碼如下:
import os releaseFile = r"D:\Automationtest\caseData\itemRelease.exe" os.system(releaseFile)
其中itemRelease.exe中的代碼如下
ControlFocus("文件上傳","text","Edit1");
WinWait("[CLASS:#32770]","",10); ControlSetText("文件上傳","","Edit1","D:\Automationtest\caseData\itemRelease.xlsx"); Sleep(2000); ControlClick("文件上傳","","Button1");
項目中應用的代碼