最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python selenium文件上傳方法匯總

 更新時間:2020年11月19日 15:09:49   作者:huilan_same  
這篇文章主要為大家詳細介紹了Python selenium文件上傳方法,selenium文件上傳的所有方法進行整理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

文件上傳是所有UI自動化測試都要面對的一個頭疼問題,今天博主在這里給大家分享下自己處理文件上傳的經(jīng)驗,希望能夠幫助到廣大被文件上傳坑住的seleniumer。

首先,我們要區(qū)分出上傳按鈕的種類,大體上可以分為兩種,一種是input框,另外一種就比較復雜,通過js、flash等實現(xiàn),標簽非input

我們分別對這兩種進行分析:

1.input標簽

眾所周知,input標簽是可以直接send_keys的,這里也不例外,來看代碼示例:

示例網(wǎng)址:http://www.sahitest.com/demo/php/fileUpload.htm

代碼:

# -*- coding: utf-8 -*-
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://sahitest.com/demo/php/fileUpload.htm')
upload = driver.find_element_by_id('file')
upload.send_keys('d:\\baidu.py') # send_keys
print upload.get_attribute('value') # check value

driver.quit()

結(jié)果:

baidu.py

很明顯,對于input上傳,直接send_keys是最簡單的解決方案。

2.非input型上傳

接下來難度要升級了,對于那些不是input框?qū)崿F(xiàn)的上傳怎么辦,這種上傳千奇百怪,有用a標簽的,有用div的,有用button的,有用object的,我們沒有辦法通過直接在網(wǎng)頁上處理掉這些上傳,唯一的辦法就是打開OS彈框,去處理彈框。

問題又來了,OS彈框涉及的層面已經(jīng)不是selenium能解決的了,怎么辦?很簡單,用OS層面的操作去處理唄,到這里我們基本找到了問題的處理方法。

大體上有以下幾種解決方案:
 1.autoIT,借助外力,我們?nèi)フ{(diào)用其生成的au3或exe文件。
 2.Python pywin32庫,識別對話框句柄,進而操作
 3.SendKeys庫
 4.keybd_event,跟3類似,不過是模擬按鍵,ctrl+a,ctrl+c, ctrl+v… 

目前我只知道以上四種辦法,有其他方法的請留言告訴我,讓我學習一下。

我們依次看一下:

1. autoIT

關(guān)于autoIT上傳以及參數(shù)化的方法我已經(jīng)在另一篇博文中講過了,請參見selenium之 autoit命令行參數(shù) 。這里不再贅述。

2.win32gui

廢話不多說,上代碼先:

示例網(wǎng)址:http://www.sahitest.com/demo/php/fileUpload.htm

代碼:

# -*- 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()

結(jié)果:

baidu.py

在這里你需要一個非常重要的小工具:Spy++,百度一下有很多,當然你也可以用autoIT自帶的工具,不過沒有這個好用,建議去下一個吧。

而且,你得安裝pywin32的庫,你可以到這里找到對應你Python版本的庫,注意32位還是64位一定要和你安裝的Python版本對應。

安裝完成之后在【開始菜單Python的文件夾】里看到PyWin32的文檔【Python for Windows Documentation】,你能從中找到對應的方法API。

簡單介紹幾個用到的:

win32gui.FindWindow(lpClassName=None, lpWindowName=None):
 •自頂層窗口開始尋找匹配條件的窗口,并返回這個窗口的句柄。
 •lpClassName:類名,在Spy++里能夠看到
 •lpWindowName:窗口名,標題欄上能看到的名字
 •代碼示例里我們用來尋找上傳窗口,你可以只用其中的一個,用classname定位容易被其他東西干擾,用windowname定位不穩(wěn)定,不同的上傳對話框可能window_name不同,怎么定位取決于你的情況。 

win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
 •搜索類名和窗體名匹配的窗體,并返回這個窗體的句柄。找不到就返回0。
 •hwndParent:若不為0,則搜索句柄為hwndParent窗體的子窗體。
 •hwndChildAfter:若不為0,則按照z-index的順序從hwndChildAfter向后開始搜索子窗體,否則從第一個子窗體開始搜索。
 •lpClassName:字符型,是窗體的類名,這個可以在Spy++里找到。
 •lpWindowName:字符型,是窗口名,也就是標題欄上你能看見的那個標題。
 •代碼示例里我們用來層層尋找輸入框和尋找確定按鈕 

win32gui.SendMessage(hWnd, Msg, wParam, lParam)
 •hWnd:整型,接收消息的窗體句柄
 •Msg:整型,要發(fā)送的消息,這些消息都是windows預先定義好的,可以參見系統(tǒng)定義消息(System-Defined Messages)
 •wParam:整型,消息的wParam參數(shù)
 •lParam:整型,消息的lParam參數(shù)
 •代碼示例里我們用來向輸入框輸入文件地址以及點擊確定按鈕 

至于win32api模塊以及其他的方法,這里不進行更多描述,想要了解的自行百度或看pywin32文檔。

3.SendKeys

首先要安裝SendKeys庫,可以用pip安裝

pip install SendKeys 

代碼示例:

示例網(wǎng)址:http://www.sahitest.com/demo/php/fileUpload.htm

代碼:

# -*- 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') # 發(fā)送文件地址
SendKeys.SendKeys("{ENTER}") # 發(fā)送回車鍵

print upload.get_attribute('value')
dr.quit()

結(jié)果:

baidu.py

通過SendKeys庫可以直接向焦點里輸入信息,不過要注意在打開窗口是略微加一點等待時間,否則容易第一個字母send不進去(或者你可以在地址之前加一個無用字符),不過我覺得這種方法很不穩(wěn)定,不推薦。

4.keybd_event

win32api提供了一個keybd_event()方法模擬按鍵,不過此方法比較麻煩,也不穩(wěn)定,所以很不推薦,下面給出部分代碼示例,如果想要研究,自己百度去學習吧。

# 先找一個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

...

是不是很麻煩,當然,你甚至可以用按鍵把整個路徑輸入進去,不過,我想沒人愿意這么做的。而且在此過程中你不能隨意移動鼠標,不能使用剪貼板,太不穩(wěn)定了,所以非常不建議你用這種辦法。。

3.多文件上傳

接下來還有一種情況值得我們考慮,那就是多文件上傳。如何上傳多個文件,當然我們還是往輸入框里輸入文件路徑,所以唯一要搞清楚的就是多文件上傳時,文件路徑是怎么寫的。

我來告訴你吧,多文件上傳就是在文件路徑框里用引號括起單個路徑,然后用逗號隔開多個路徑,就是這么簡單,例如:
“D:\a.txt” “D:\b.txt”
但需要注意的是:只有多個文件在同一路徑下,才能這樣用,否則是會失敗的(下面的寫法是不可以的):
“C:\a.txt” “D:\b.txt” 

接下里找一個例子試試:

示例網(wǎng)址:http://www.sucaijiayuan.com/api/demo.php?url=/demo/20150128-1

代碼:

# -*- coding: utf-8 -*-

from selenium import webdriver
import win32gui
import win32con
import time

dr = webdriver.Firefox()
dr.get('http://www.sucaijiayuan.com/api/demo.php?url=/demo/20150128-1')

dr.switch_to.frame('iframe') # 一定要注意frame
dr.find_element_by_class_name('filePicker').click()
time.sleep(1)

dialog = win32gui.FindWindow('#32770', None)
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
button = win32gui.FindWindowEx(dialog, 0, 'Button', None)

# 跟上面示例的代碼是一樣的,只是這里傳入的參數(shù)不同,如果愿意可以寫一個上傳函數(shù)把上傳功能封裝起來
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, '"d:\\baidu.py" "d:\\upload.py" "d:\\1.html"')
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)


print dr.find_element_by_id('status_info').text
dr.quit()

結(jié)果:

選中3張文件,共1.17KB。

可見,多文件上傳并沒有那么復雜,也很簡單,唯一的區(qū)別就是輸入的參數(shù)不同而已。autoIT也可以實現(xiàn),有興趣可以自己試試。

而且我們可以發(fā)現(xiàn)一點,就是上面的這個窗口的代碼跟之前示例中的基本是一樣,說明我們可以把上傳的部分抽出來,寫一個函數(shù),這樣每次要上傳,直接去調(diào)用函數(shù),傳入?yún)?shù)即可。

看,上傳其實很好處理。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • CentOS7安裝Python3的教程詳解

    CentOS7安裝Python3的教程詳解

    這篇文章主要介紹了CentOS7安裝Python3的教程,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • Pandas時間數(shù)據(jù)處理詳細教程

    Pandas時間數(shù)據(jù)處理詳細教程

    日常工作中日期格式有多種表達形式,比如年份開頭或是月份開頭2022/6/4、6/4/2022等,通過pandas的日期數(shù)據(jù)處理,這篇文章主要給大家介紹了關(guān)于Pandas時間數(shù)據(jù)處理的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python調(diào)用攝像頭的示例代碼

    python調(diào)用攝像頭的示例代碼

    這篇文章主要介紹了python調(diào)用攝像頭的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python讀寫unicode文件的方法

    Python讀寫unicode文件的方法

    這篇文章主要介紹了Python讀寫unicode文件的方法,涉及Python針對文件的讀取及編碼操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Python3.4編程實現(xiàn)簡單抓取爬蟲功能示例

    Python3.4編程實現(xiàn)簡單抓取爬蟲功能示例

    這篇文章主要介紹了Python3.4編程實現(xiàn)簡單抓取爬蟲功能,涉及Python3.4網(wǎng)頁抓取及正則解析相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • python圖像處理入門(一)

    python圖像處理入門(一)

    這篇文章主要介紹了python圖像處理入門,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • python基礎之單分派泛函數(shù)singledispatch

    python基礎之單分派泛函數(shù)singledispatch

    這篇文章主要介紹了python基礎之單分派泛函數(shù)singledispatch問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python實現(xiàn)人像動漫化的示例代碼

    python實現(xiàn)人像動漫化的示例代碼

    這篇文章主要介紹了python實現(xiàn)人像動漫化的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • python制作抖音代碼舞

    python制作抖音代碼舞

    這篇文章主要為大家詳細介紹了python制作抖音代碼舞的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python中使用正則表達式的方法詳解

    python中使用正則表達式的方法詳解

    這篇文章主要為大家詳細介紹了python中使用正則表達式的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

安福县| 阳谷县| 冕宁县| 泰州市| 仙桃市| 玛多县| 乐平市| 古浪县| 珲春市| 贞丰县| 天门市| 庆元县| 石首市| 乐至县| 中牟县| 万宁市| 文山县| 荔浦县| 博乐市| 伊通| 文水县| 中西区| 崇信县| 西林县| 来安县| 奉化市| 奇台县| 屯昌县| 庆安县| 布拖县| 鄂托克前旗| 肇庆市| 濮阳市| 七台河市| 米泉市| 邵东县| 长岭县| 平罗县| 巴马| 清流县| 达州市|