pythonselenium文件上传窗口处理

前言:

近期很多小伙伴在使用 selenium 做 Web 自动化的过程中,遇到了文件上传的功能,发现通过 selenium 无从下手。那么小编在这里给大家整理了一篇文章,只需要几行简单的代码,就可以帮大家解决文件上传这个问题。

文件上传窗口分析

大家在面对文件上传这个问题的时候,无从下手的原因,主要是 selenium 无法对文件上传弹出窗口中的相关元素进行定位。以 Chrome 浏览器为例,在网页上点击上传文件,会弹出如下窗口,很显然这个弹出窗口并不是浏览器中的窗口,而是 windows 系统中的弹窗,但 selenium 只能操作浏览器,无法来操作这种系统弹窗。那么这个时候我们就需要借助于可以操作系统窗口的工具来实现。

image.png

pywinauto 的使用介绍

关于文件上传的弹窗,在 python 中可以通过 pywinauto 模块来进行操作,pywinauto 是 python 中用来做的 PC 端自动化的一个库。PC 端的所有窗口都可以使用它来进行操作。关于 pywinauto 这边不做过多介绍。之前我写过相关的文章,也录制过相关的使用视频。这里主要来讲一下如何通过它来实现文件上传。在进行文件上传的时候,我们需要这个窗口进行操作的一共是三个步骤:

操作步骤:
1、文件路径填写
2、文件名填写
3、点击打开

在进行操作之前,我们就需要定位到这几个控件,1、路径输入框,2、文件输入框、3、打开按钮
关于控件定位操作的具体细节,大家可以去自行学习 pywinauto 的使用
具体定位代码如下:

import pywinauto 
# 使用pywinautoc创建一个操作桌面窗口的对象 
app = pywinauto.Desktop() 
# 选中文件上传的窗口 
dlg = app["打开"] 
# 选中文件地址输入框 
dlg["Toolbar3"] 
# 选中文件名输入框 
dlg["文件名(&N):Edit"] 
# 选择打开按钮
dlg["打开(&O)"]
复制代码

文件上传(图片上传OCR识别)小案例

12143242213.gif

代码中待提高的点:将所有的sleep的部分换成is_displayed或者selenium的wait的方式,减少时间等待。

from selenium import webdriver
import time
import os
import pywinauto
from pywinauto.keyboard import send_keys

driver = webdriver.Chrome(r"chromedriver.exe")

driver.get("https://pearocr.com/#/")
time.sleep(10)
elems = driver.find_elements_by_xpath("//div[contains(@class,'ImageListToolbar')]//div[@class='BtnBound']")
elems[0].click()

# 使用pywinauto来选择文件
app = pywinauto.Desktop()
# 选择文件上传的窗口
dlg = app["打开"]
# 选择文件地址输入框,点击激活
dlg["Toolbar3"].click()
# 键盘输入上传文件的路径
send_keys(r"C:\Users\xxx\Desktop\常用图片整理")
# 键盘输入回车,打开该路径
send_keys("{VK_RETURN}")
# 选中文件名输入框,输入文件名
dlg["文件名(&N):Edit"].type_keys("12312.png")
# 点击打开
dlg["打开(&O)"].click()

time.sleep(3)

elems[-1].click()

els = driver.find_elements_by_xpath("//div[contains(@class,'q-list--dense')]")
els[1].click()

time.sleep(3)

el2 = driver.find_element_by_xpath("//div[contains(@class,'q-layout--containerized')]")
spans = el2.find_elements_by_xpath("//button[contains(@class,'q-btn--dense')]")
p = spans[2]
p.click()
time.sleep(2)
driver.close()

with open(r"C:\Users\a21036\Downloads\PearOCR.txt","r",encoding="utf8") as f:
    datas = f.readlines()[1:-2]
    print([data.strip("\n") for data in datas])

os.remove(r"C:\Users\xxxx\Downloads\PearOCR.txt")
复制代码