方式1:php
若是是input類型的標籤則可直接賦值python
部分代碼:web
driver.find_element_by_name("file").send_keys("E:\\test.jpg")windows
*************api
多種圖片上傳時路徑與路徑之間用「,」分開,只限於統一路徑下編輯器
*************ide
方式2:工具
利用AutoIT實現學習
一、AutoIT介紹ui
AutoIT是一個相似腳本語言的軟件,利用此軟件咱們能夠方便的實現模擬鍵盤、鼠標、窗口等操做,實現自動化。
二、實現原理
利用AutoIT編寫合適的腳本,而後將腳本編譯成可執行文件,在自動化實現時,直接調用此腳本實現文件上傳。
備註:編寫腳本和編譯,須要藉助AutoIT提供的工具,可是腳本編譯成可執行文件後,能夠直接使用,再也不須要安裝AutoIT。
三、自動化調用
AutoIT腳本編譯成可執行文件後,放到本地的某一個目錄下
自動化實現過程當中,須要上傳圖片時,首先定位到【上傳】字樣文本,點擊此按鈕
執行編輯後的可執行文件,實現文件上傳
4.安裝後的工具介紹
AutoIT Window Info用來識別Windows控件,根據識別的控件信息編寫腳本;
Complie Script to .exe,用來將利用AutoIt編寫的腳本,編譯成可執行文件;
Run Script 用來執行AutoIT的腳本信息;
SciTE Script Editor用來編寫AutoIt腳本。
接下來就是利用以上四種工具,來編寫AutoIT腳本,而後編譯成可執行文件
5.操做
1) AutoIt Window Info
打開此工具,利用此工具來識別Windows控件信息,如輸入框、按鈕等。
用鼠標拖住工具上的Finder Tool的圖標(即圖中藍色圈圈部分)到要識別的控件上,控件的惟一標識信息會顯示在工具的左側部分(圖中紅框標出的部分)。
從顯示的結果得知,此控件的Title=「打開」,Class爲Button,Instance=1。咱們就是利用控件的這些信息,定位控件,編寫腳本。
2) SciTE Script Editor
根據以上所識別的空間信息,利用此編輯器,利用此軟件根據AutoIT的語法編寫腳本。
附實現文件上傳須要的幾個方法:
ControlFocus ( "窗口標題", "窗口文本", 控件ID) 設置輸入焦點到指定窗口的某個控件上
WinWait ( "窗口標題" [, "窗口文本" [, 超時時間]] ) 暫停腳本的執行直至指定窗口存在(出現)爲止
ControlSetText ( "窗口標題", "窗口文本", 控件ID, "新文本" ) 修改指定控件的文本
Sleep ( 延遲 ) 使腳本暫停指定時間段
ControlClick ( "窗口標題", "窗口文本", 控件ID [, 按鈕] [, 點擊次數]] ) 向指定控件發送鼠標點擊命令
其中,title即AutoIt Window Info識別出的Title字段,controlID即AutoIt Window Info識別出的Class和Instance的拼接,如上圖拼接後的結果應爲:Button1
AutoIT腳本編寫完成後,能夠經過菜單欄「Tools」-->「Go」 運行一下腳本。注意,運行的時候,上傳窗口需處於打開狀態。
3)AutoIT腳本編譯成可執行文件
腳本編輯運行無誤後,將其保存。而後打開Complie Script to .exe工具,將保存的腳本編譯成exe可執行文件。
點擊「Browse」選擇保存的腳本文件,點擊「Convert」將其生成exe文件。
至此,利用AutoIT實現圖片上傳的流程結束。
4)代碼引用
需先導入os
import os
如下方法爲網上搜索的,未實踐
1.
win32gui
代碼:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # win32gui dialog = win32gui.FindWindow('#32770', u'文件上傳') # 對話框 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次尋找對象,直到找到輸入框Edit對象的句柄 button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 肯定按鈕Button win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'd:\\baidu.py') # 往輸入框輸入絕對地址 win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 按button print upload.get_attribute('value') dr.quit()
結果:
baidu.py
在這裏你須要一個很是重要的小工具:Spy++,百度一下有不少,固然你也能夠用autoIT自帶的工具,不過沒有這個好用,建議去下一個吧。
並且,你得安裝pywin32的庫,你能夠到這裏找到對應你python版本的庫,注意32位仍是64位必定要和你安裝的Python版本對應。
安裝完成以後在【開始菜單Python的文件夾】裏看到PyWin32的文檔【Python for Windows Documentation】,你能從中找到對應的方法API。
簡單介紹幾個用到的:
win32gui.FindWindow(lpClassName=None, lpWindowName=None):
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
至於win32api模塊以及其餘的方法,這裏不進行更多描述,想要了解的自行百度或看pywin32文檔。
2.
SendKeys
首先要安裝SendKeys庫,能夠用pip安裝
pip install SendKeys
代碼示例:
代碼:
# -*- coding: utf-8 -*- from selenium import webdriver import win32gui import win32con import time dr = webdriver.Firefox() dr.get('http://sahitest.com/demo/php/fileUpload.htm') upload = dr.find_element_by_id('file') upload.click() time.sleep(1) # SendKeys SendKeys.SendKeys('D:\\baidu.py') # 發送文件地址 SendKeys.SendKeys("{ENTER}") # 發送回車鍵 print upload.get_attribute('value') dr.quit()
結果:
baidu.py
經過SendKeys庫能夠直接向焦點裏輸入信息,不過要注意在打開窗口是略微加一點等待時間,不然容易第一個字母send不進去(或者你能夠在地址以前加一個無用字符),不過我以爲這種方法很不穩定,不推薦。
3.
keybd_event
win32api提供了一個keybd_event()方法模擬按鍵,不過此方法比較麻煩,也不穩定,因此很不推薦,下面給出部分代碼示例,若是想要研究,本身百度去學習吧。
# 先找一個input框,輸入想要上傳的文件的地址,剪切到剪貼板 video.send_keys('C:\\Users\\Administrator\\Pictures\\04b20919fc78baf41fc993fd8ee2c5c9.jpg') video.send_keys(Keys.CONTROL, 'a') # selenium的send_keys(ctrl+a) video.send_keys(Keys.CONTROL, 'x') # (ctrl+x) driver.find_element_by_id('uploadImage').click() # 點擊上傳按鈕,打開上傳框 # 粘貼(ctrl + v) win32api.keybd_event(17, 0, 0, 0) # 按下按鍵 ctrl win32api.keybd_event(86, 0, 0, 0) # 按下按鍵 v win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按鍵 v win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按鍵 ctrl time.sleep(1) # 回車(enter) win32api.keybd_event(13, 0, 0, 0) # 按下按鍵 enter win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 升起按鍵 enter
是否是很麻煩,固然,你甚至能夠用按鍵把整個路徑輸入進去,不過,我想沒人願意這麼作的。並且在此過程當中你不能隨意移動鼠標,不能使用剪貼板,太不穩定了,因此很是不建議你用這種辦法。