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

 

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