關於非input文件上傳,點上傳按鈕後,這個彈出的windows的控件了,已經跳出三界以外了,不屬於selenium的管轄範圍(selenium不是萬能的,只能操做web上元素)。autoit工具處理windows的控件窗口是專業的,因此這個需藉助AutoIt來解決了。css
1.能夠autoit官網上下載,安裝 http://www.autoitscript.com/site/html
2.下載到本地後傻瓜式安裝,安裝完以後在應用程序找到這個Autoit v3python
3.AutoIt裏面幾個菜單功能介紹:web
4.autoit 在線文檔,是中文版http://www.autoitx.com/Doc/shell
1.先準備好web頁面的環境,以博客園的上傳圖片爲例:新建博客>點圖片上傳>上傳本地圖片>彈出選擇圖片界面,在這裏不要動了windows
2.打開 SciTE Script Editor編輯器,開始寫腳本,代碼很是簡單隻有四行編輯器
WinActivate("文件上傳"); ControlSetText("文件上傳", "", "Edit1", "D:\1.png" ); Sleep(2000); ControlClick("文件上傳", "", "Button1");
3.編輯完成後執行,tools>go ;或者按f5執行,執行完以後就能看到圖片上傳成功了。工具
4.autoit幾個經常使用的語法測試
1.Find Tool 查看元素屬性,用鼠標按住Find Tool下的圖標,而後拖拽到你想定位的元素上spa
2.查看title,title即AutoIt Window Info識別出的Title字段
3.查看controlID,controlID即AutoIt Window Info識別出的Class和Instance的拼接
如這裏的「打開」按鈕的Class屬性是Button,Instance屬性是1,那麼controlID屬性就是Button1
1.第三步執行成功後,先把腳本保存到本地
2.在應用程序裏面找到打開Compile Script to.exe工具,將剛纔導出的.au3文件轉化成.exe文件
3.爲了驗證這個生成的.exe文件是有效的,先在cmd去執行一次
直接把生成的這個.exe文件拽到cmd裏面,回車就能執行了
1.把上傳文件的動做已經弄成了一個.exe的文件了,接下來用python去執行這個.exe文件就能實現文件上傳了
python調用dos,用這個方法os.system("需執行的指令")
# coding:utf-8 from selenium import webdriver import time import os # 加載配置文件實現免登陸 profileDir = r'C:\Users\Gloria\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default' # 你本身電腦的配置文件路徑,不要抄個人 profile = webdriver.FirefoxProfile(profileDir) driver = webdriver.Firefox(profile) driver.implicitly_wait(30) driver.get("http://www.cnblogs.com/yoyoketang/") driver.find_element_by_link_text("新隨筆").click() time.sleep(3) # 點開編輯器圖片 driver.find_element_by_css_selector("img.mceIcon").click() time.sleep(3) # 定位全部iframe,取第二個 iframe = driver.find_elements_by_tag_name('iframe')[1] # 切換到iframe上 driver.switch_to_frame(iframe) # 點開文件上傳按鈕 driver.find_element_by_name('file').click() # 執行autoit上傳文件 os.system("C:\Users\Gloria\Desktop\sendjpg.exe") # 你本身本地的這個.exe文件絕對路徑
1.上面打包的exe文件把上傳文件的路徑給寫死了,每次只能傳固定的那個圖片,咱們實際測試時候但願傳不一樣的圖片,這樣就須要參數化文件路徑了。
想要參數化傳入的參數,能夠經過autoit的命令行參數:
myProg.exe param1 「This is a string parameter」 99
在腳本中,可用如下變量獲取命令行參數:
$CmdLine[0] ; = 3 $CmdLine[1] ; = param1 $CmdLine[2] ; = "This is a string parameter" $CmdLine[3] ; = 99 $CmdLineRaw ; = 'param1 "This is a string parameter" 99'
$CmdLine[0] 獲取的是命令行參數的總數,在上例中$CmdLine[0]=3
$CmdLine[1]~$CmdLine[63] 獲取的是命令行參數第1到第63位,這個方式最多隻能獲取63個參數,不過正常狀況下是足夠用的
$CmdLineRaw 獲取的是未拆分的全部參數,是一個長字符串,這種狀況下不侷限與63個參數
WinActivate("文件上傳"); ControlSetText("文件上傳", "", "Edit1", $CmdLine[1] ); Sleep(2000); ControlClick("文件上傳", "", "Button1");
2.問題來了,若是想批量上傳圖片,又如何實現呢??參數化後是否是so easy了。