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之 文件上传所有方法整理总结
剪贴板法
上述文章里,使用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()