1. 上傳按鈕是input類型,直接定位到按鈕元素,sendkeys輸入要上傳文件的本地路徑
例如百度首頁的按圖片搜索,先點擊照相機按鈕,在出現的input上傳按鈕處輸入本地圖片路徑,即可搜索到相似圖片
from selenium import webdriver
from time import sleep
class TestUpload:
def setup(self):
self.driver = webdriver.Chrome(r"D:\Program Files\chromedriver.exe")
self.driver.get(r"https://www.baidu.com")
self.driver.maximize_window()
def test_upload1(self):
driver = self.driver
driver.implicitly_wait(10)
# 點擊照相機圖標
driver.find_element_by_xpath('//input[@id="kw"]/../span[1]').click()
# input標籤的文件上傳,直接找到input,sendkeys即可
ele = driver.find_element_by_xpath('//form[@id="form"]//input[@class="upload-pic"]')
ele.send_keys(r"C:\Users\Lulu\Pictures\8751422442a7d93353cdbea4a64bd11371f001e6.jpg")
sleep(10)
def teardown(self):
self.driver.quit()
2. 非input標籤上傳,參考selenium之 文件上傳所有方法整理總結
- autoIT,藉助外力,我們去調用其生成的au3或exe文件。
- Python pywin32庫,識別對話框句柄,進而操作
- SendKeys庫
- keybd_event,跟3類似,不過是模擬按鍵,ctrl+a,ctrl+c, ctrl+v…
剪貼板法
上述文章裏,使用pywin32主要是從操作瀏覽器改爲操作win系統,其中涉及到窗口識別和切換等操作,稍顯複雜,其實在上傳文件的應用中,一般彈出“上傳文件”對話框後,輸入光標自動聚焦在輸入框內,利用這一點可以直接執行以下操作:
1. 點擊“上傳”按鈕,彈出上傳對話框
2. 不能直接send_keys(url),可以通過剪貼板複製:複製url到系統剪貼板
3. 操作鍵盤執行crtl+v,將剪貼板的url粘貼到輸入框內
4. 操作鍵盤執行回車,相當於點擊確定,開始上傳文件
5. 上傳成功
注意:這裏使用到pywin32模塊,要先pip一下,該模塊可以進行win系統的操作,用到的兩個基本接口:
1. 剪貼板操作:打開——清空——添加內容——關閉
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
# 內容爲unicode格式
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, url)
win32clipboard.CloseClipboard()
2. 鍵盤操作:win32api.keyba_event()方法可以執行一些鍵盤按鍵操作,一般只用到第一個和第三個參數,分別爲按鍵代碼和按鍵方式,另兩個使用0即可。按鍵代碼是數字,每個字符都有自己的代碼,可以查詢表格,嫌麻煩就通過字典在class的靜態變量裏保存一下,直接調用即可。
win32api.keybd_event(TestUpload.VK_CODE["V"], 0, 0, 0)
win32api.keybd_event(TestUpload.VK_CODE["V"], 0, win32con.KEYEVENTF_KEYUP, 0)
完整代碼:
from selenium import webdriver
from time import sleep
import pytest
import win32api
import win32con
import win32clipboard
class TestUpload:
VK_CODE = {
"CTRL": 17,
"V": 86,
"ENTER": 13
}
def setup(self):
self.driver = webdriver.Chrome(r"D:\Program Files\chromedriver.exe")
@pytest.mark.skip(reason="先不用")
def test_upload1(self):
driver = self.driver
driver.get(r"https://www.baidu.com")
driver.maximize_window()
driver.implicitly_wait(10)
# 點擊照相機圖標
driver.find_element_by_xpath('//input[@id="kw"]/../span[1]').click()
# input標籤的文件上傳,直接找到input,sendkeys即可
ele = driver.find_element_by_xpath('//form[@id="form"]//input[@class="upload-pic"]')
ele.send_keys(r"C:\Users\Lulu\Pictures\8751422442a7d93353cdbea4a64bd11371f001e6.jpg")
sleep(10)
def test_upload2(self):
# sys32
driver = self.driver
driver.get(r"http://www.sahitest.com/demo/php/fileUpload.htm")
driver.maximize_window()
driver.implicitly_wait(5)
url = r"C:\Users\Lulu\Pictures\8751422442a7d93353cdbea4a64bd11371f001e6.jpg"
driver.find_element_by_id("files").click()
sleep(3)
# 剪切板操作:打開——清空——添加內容——關閉
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
# 內容爲unicode格式
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, url)
win32clipboard.CloseClipboard()
# 將剪貼板中的url複製到當前彈框中
win32api.keybd_event(TestUpload.VK_CODE["CTRL"], 0, 0, 0)
win32api.keybd_event(TestUpload.VK_CODE["V"], 0, 0, 0)
win32api.keybd_event(TestUpload.VK_CODE["V"], 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(TestUpload.VK_CODE["CTRL"], 0, win32con.KEYEVENTF_KEYUP, 0)
# 回車
win32api.keybd_event(TestUpload.VK_CODE["ENTER"], 0, 0, 0)
win32api.keybd_event(TestUpload.VK_CODE["ENTER"], 0, win32con.KEYEVENTF_KEYUP, 0)
sleep(3)
def teardown(self):
self.driver.quit()