selenium處理頁面常見問題(五):文件上傳

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之 文件上傳所有方法整理總結

  1. autoIT,藉助外力,我們去調用其生成的au3或exe文件。
  2. Python pywin32庫,識別對話框句柄,進而操作
  3. SendKeys庫
  4. 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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章