[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传

[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传

    • 前言
    • 前期准备
      • selenium模块
        • 模块安装
        • 驱动安装配置
      • pywinauto
        • 模块安装
    • 实战用例
      • 打开弹窗
      • 定位弹窗并上传
      • 结果展示
    • 完整示例代码
    • 总结

前言

在我们使用selenium模块操作浏览器完成一些任务时经常会遇到一些需要上传文件/图片的弹窗。例如,我们在编辑发送邮件时需要上传文件:

[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第1张图片

这些弹窗属于系统页面而非浏览器页面,所以只使用selenium模块是定位不到弹窗页面中的元素的,从而也就无法对元素进行操作完成上传。

前期准备

selenium模块

selenium是一个在自动化测试中广泛应用的模块,其在爬虫领域也有着很广泛的使用

模块安装

打开终端输入:

pip install selenium

这里有可能会遇到下载到一半挂掉的情况,这里给大家准备了一个selenium的清华镜像源

pip install --index https://mirrors.ustc.edu.cn/pypi/web/simple/ selenium

驱动安装配置

本篇文章使用Edge浏览器做示范,所以这里安装并配置Edge驱动

需要下载和配置其他浏览器的可以参考一下这位大佬的文章

selenium用法详解【从入门到实战】【Python爬虫】【4万字】

首先打开Edge浏览器中的设置


点击关于Microsoft Edge,获取Edge浏览器的版本

[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第2张图片
打开Edge浏览器驱动的官网进行下载,我这里是118.0.2088.61的64位版本,大家可以按照自己的版本下载,如果没有自己的版本安装最新版本的即可!

[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第3张图片
安装完成后,压缩包中就只有一个名为msedgedriver.exe的文件
[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第4张图片

将这个文件移动到你在编译器中使用的本地python环境中,和python.exe处于同级目录中即可!

[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第5张图片
在编译器中运行下列代码能够成功打开网站就代表成功配置了驱动

from selenium import webdriver
driver_edge=webdriver.Edge()
driver_edge.get("https://www.baidu.com/")

pywinauto

pywinauto是一个能够自动化 Windows 上的 GUI 应用程序的模块,它支持鼠标、键盘操作,在元素控件树较复杂的界面,可以辅助我们完成自动化操作

模块安装

方法同上,但是这里我没有找到镜像源,可能需要多尝试几次才能下载成功

pip install pywinauto

查看是否安装完成

pip list
`[python] 使用selenium+pywinauto模块处理弹窗中的图片/文件上传_第6张图片

实战用例

这里我们使用百度的在线图片识别网站做弹窗上传test,该网站也可以通过对input对象使用send_keys来进行图片上传,各位也可以根据自己的任务举一反三,完整程序我会放在末尾,有需要的朋友可以自取。

打开弹窗

首先使用selenium模块打开网页

driver=webdriver.Edge()
driver.get("https://graph.baidu.com/pcpage/index?tpl_from=pc")
time.sleep(2)

定位到“本地上传”对象并点击

click_label=driver.find_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[7]/div/span[1]/span[1]').click()
time.sleep(2)

定位到”选择文件“对象并点击,打开弹窗

upload_label=driver.find_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[7]/div/div/div[2]/div[2]/div').click()

定位弹窗并上传

这里要注意不同的浏览器打开的弹窗标题是不同的,我是用Edge浏览器打开的弹窗标题是”打开

# 创建当前页面列表
app = pywinauto.Desktop()
# 选择文件上传的窗口
dlg = app["打开"]
dlg.print_control_identifiers()
# 选择文件地址输入框,点击激活
dlg["Toolbar3"].click()

这里的print_control_indentifiers()方法是用来定位窗口元素的,相当于是定位到标题为”打开“的窗口。dlg["Toolbar3"].click()代表激活窗口,相当于打开窗口后点击窗口中的文件名输入框的操作。

# 键盘输入上传文件的路径
send_keys("D:\grasshopper_pre")
# 键盘输入回车,打开该路径
send_keys("{VK_RETURN}")
# 选中文件名输入框,输入文件名
dlg["文件名(&N):Edit"].type_keys('1.jpg')
# 点击打开
dlg["打开(&O)"].click()

接上述操作,接下来找到要上传的文件,先在输入框中使用send_keys()函数输入图片的路径并使用send_keys("{VK_RETURN}")进行回车操作,即可以找到图片。随后输入图片名称并点击“打开”按键即可。

结果展示

这里附上我自己的测试用例图片链接,大家可以下载后尝试一下!

蝗虫图片

上传效果如下gif所示,我这里为了展示效果设置了强制等待,实际输入上传的时间要短的多。

完整示例代码

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
import warnings
warnings.filterwarnings("ignore")
import pywinauto
from pywinauto.keyboard import send_keys

driver=webdriver.Edge()
driver.get("https://graph.baidu.com/pcpage/index?tpl_from=pc")
time.sleep(2)
click_label=driver.find_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[7]/div/span[1]/span[1]').click()
time.sleep(2)
upload_label=driver.find_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[7]/div/div/div[2]/div[2]/div').click()
# 创建当前页面列表
app = pywinauto.Desktop()
# 选择文件上传的窗口
dlg = app["打开"]
dlg.print_control_identifiers()
# 选择文件地址输入框,点击激活
dlg["Toolbar3"].click()
# 键盘输入上传文件的路径
send_keys("D:\grasshopper_pre")
# 键盘输入回车,打开该路径
send_keys("{VK_RETURN}")
# 选中文件名输入框,输入文件名
dlg["文件名(&N):Edit"].type_keys('1.jpg')
# 点击打开
dlg["打开(&O)"].click()

总结

以上就是使用python中的selenium和pywinauto模块进行弹窗文件/图片上传的所有过程啦,第一次写blog,有什么问题还请大家海涵!有问题欢迎在评论区留言,希望大家能够多多点赞收藏,你们的点赞收藏就是我创作的动力喔!

你可能感兴趣的:(selenium,python,selenium,开发语言,web,爬虫,自动化,edge)