python+selenium的web自动化之针对上传操作的实现方案

news2025/1/15 12:50:02

一、关于上传操作

​ 上传有两种情况:

如果是input可以直接输入路径的,那么直接使用send_keys(文件路径)输入路径即可;
非input标签的上传,则需要借助第三方工具:第三方库 pywin32、第三方工具pyautogui等等。
​ 那这里针对以上两种情况分别介绍一下具体的解决方法。

二、input标签

​ 定位到元素,然后直接使用send_keys(文件路径)输入路径,比较简单。

from selenium import webdriver
 
driver = webdriver.Chrome()
 
driver.get("http://xxxx")
driver.maximize_window()
 
# 定位上传文件元素
input_file = driver.find_element_by_id("xxx")
 
# 上传文件
input_file.send_keys(r"D:\learn\xx.txt")

三、第三方库pywin32

​ 非input标签的上传,则需要借助第三方工具。pywin32就是这样的一个第三方库,主要是方便python开发者快速调用windows API的一个模块库,可以识别上传对话框句柄进而操作。安装命令:pip install pywin32。

​ 从上面的上传窗口,及WinSpy工具窗口,可以得出控制关系图如下:

​ 从上图可以看出:

文件名输入框的路径为:上传窗口 - > comboBoxEx32 - >comboBox - > Edit,在第四级edit;
按钮的路径为:上传窗口 - > button(打开按钮),在第二级。
​ 我们需要一步一步定位,从第一层开始往下去找,找到对应的窗口然后进行操作,步骤说明如下:

​ 第一步:先定位到第一层大窗口(即整个上传窗口),使用win32gui模块下的FindWindow(),它是专门用于查找大窗口的;

​ 第二步:在大窗口下查找子窗口,使用win32gui模块下的FindWindowEx(),查找大窗口以下的子窗口都是用这个方法;

​ 第三步:定位到最后要操作的窗口后,就开始要执行编辑、点击这个操作了,不管是编辑还是点击都是使用win32gui模块下的SendMessage()。

​ 以上三步的相关函数说明如下:

win32gui.FindWindow(IpClassName,IpWindowName):自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄IpClassName:类名,在Spy++里能够看到IpWindowName:窗口名,标题栏上能看到的名字
win32gui.FindWindowEx(hwndParent=0,hwndChildAfter=O,IpClassName=None,IpWindowName=None):搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄,找不到就返回0hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索IpClassName:字符型,是窗体的类名,这个可以在Spy++里能够看到IpWindowName:字符型,是窗口名,就是标题栏上能看到的名字
win32gui.SendMessage(hWnd, Msg, wParam, IParam):hWnd:整型,接收消息的窗体句柄Msg:整型,要发送的消息,这些消息都是windows预先定义好的wParam:整型,消息的wParam参数IParam:整型,消息的IParam参数
​ 以下是封装好的上传函数,因为window的上传窗口是固定不变的,我们只需要封装好一个类知道如何去调用即可,不需要理解它的处理细节,但如果你有兴趣可以深入了解一下。

import win32gui
import win32con
 
# edit - combobox - comboBoxEx32 - #32770  编辑框在第四级
# button - #32770  打开按钮在第二级
 
# 前提:window上传窗口已经出现,最好sleep 1-2秒等待窗口出现
 
def upload(filepath, browser_type="chrome"):
    if browser_type == "chrome":
        title = "打开"
    else:
        title = ""
 
    # 找元素
    # 从一级开始找,一级窗口“#32770”,“打开”
    dialog = win32gui.FindWindow("#32770", title)  # FindWindow用于找大窗口
 
    # 二级之后都用FindWindowEx,需要四个参数,
    # 1、元素的父亲,2、从第一个子代开始找元素,3、元素的类型名(class),4、元素的文本值
    comboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)  # 二级
    comBox = win32gui.FindWindowEx(comboBoxEx32, 0, "ComboBox", None)  # 三级
    # 编辑框
    edit = win32gui.FindWindowEx(comBox, 0, 'Edit', None)  # 四级
    # 打开按钮
    button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&0)')  # 二级
 
    # 往编辑框输入文件路径
    win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath)  # 发送文件路径
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)  # 点击打开按钮
 
 
if __name__ == '__main__':
    upload('D:\\test.txt')

 四、第三方工具pyautogui

还有一种更方便的方法,就是借助第三方工具pyautogui,pyautogui是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,并且支持多平台(Windows,OS X,Linux)。强烈推荐!

​ 下面以举例的html为例,需要先把该代码保存成html文件,后续直接访问这个本地html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1> hello world </h1>
<input type="file" name="mfile">
</body>
</html>

 ​ 安装模块: pip install pyautogui,操作只需要两步:

  • 第一步:将要上传的文件路径写入到文件名的输入框内;
  • 第二步:敲回车,相当于点击【打开】按钮,注意回车presses要2次才能生效。
import os
import time
import pyautogui as ui
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.implicitly_wait(20)      # 隐式等待
dir = os.getcwd()
html_dir = os.path.join(dir, 'demo.html')
driver.get(html_dir)
 
file_elem = driver.find_element_by_name('mfile')
file_elem.click()
 
# 系统之间要等待
time.sleep(1)
 
file_dir = os.path.join(dir, 'test.txt')	# 要上传的文件路径
# 写入文件
ui.write(file_dir)	# 直接调用写入
time.sleep(0.5)
# 输入回车键, presses表示按的次数,按一次不会生效,有可能是执行太快,建议presses=2
ui.press('enter', presses=2)
time.sleep(2)
 
driver.quit()

​ 不管是使用哪种上传方式,只要是操作系统的上传窗口,操作之前记得先等待一下。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭开路由协议隐藏的风险

路由协议在互联网和基于其的服务的运行中发挥着至关重要的作用。然而&#xff0c;许多这些协议的开发都没有考虑到安全问题。 例如&#xff0c;边界网关协议 (BGP) 最初并未考虑对等点之间发生攻击的可能性。过去几十年来&#xff0c;BGP 中的起源和路径验证已投入了大量工作。…

JUC--阻塞队列

目录 问题引出 一.单端阻塞队列&#xff08;BlockingQueue&#xff09; 二.双端阻塞队列&#xff08;BlockingDeque&#xff09; 三.延迟队列&#xff08;DelayQueue&#xff09; 问题引出 由于实现消费者-生产者模型&#xff0c;每一次实现都比较麻烦&#xff0c;比如sych…

2023河南萌新联赛第(六)场:河南理工大学 B - 这是dp题吗

2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学 B - 这是dp题吗 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小l同学非常喜欢三角形&#x…

淘宝商品优惠券详情item_get_app-获得淘宝app商品详情原数据

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;调用API接口入口secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09…

等级发布/查询平台

在传统的教学模式下&#xff0c;老师们需要手动把成绩挨个私发给学生家长&#xff0c;这不仅费时费力&#xff0c;还容易出现错误。然而&#xff0c;随着科技的不断发展&#xff0c;易查分系统的出现为教师提供了一个高效准确的成绩发布工具。 系统优势 1. 高效便捷&#xff1a…

【数据结构与算法】弗洛伊德算法

弗洛伊德算法 介绍 和 Dijkstra 算法一样&#xff0c;弗洛伊德&#xff08;Floyd&#xff09;算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。弗洛伊德算法计算图中各个顶点之间的最短路径。迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算…

贪吃蛇大作战技术报告(JAVA)

完整作品见链接&#xff1a;JAVA贪吃蛇大作战大作业_Java贪吃蛇如何实现向左不能向右资源-CSDN文库 猫猫大作战技术报告 1、项目概述 本项目的编译环境为jdk-19&#xff0c;用到的编译器为Eclipse&#xff0c;采用图形化编程&#xff0c;基于JAVA的Swing库进行界面的绘制&…

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

使用ctcloss训练矩阵生成目标字符串

首先我们需要明确 c t c l o s s ctcloss ctcloss是用来做什么的。比如说我们要生成的目标字符串长度为 l l l&#xff0c;而这个字符串包含 k k k个字符&#xff0c;字符串允许的最大长度为 L L L&#xff0c;这里我们认为一个位置是一个时间步&#xff0c;就是一拍&#xff0…

PyTorch三种主流模型构建方式:nn.Sequential、nn.Module子类、nn.Module容器开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xff…

解决git上传远程仓库时的最大文件大小限制

git默认限制最大的单文件100M&#xff0c;当某个文件到达50M时会给你提示。解决办法如下 首先&#xff0c;打开终端&#xff0c;进入项目所在的文件夹&#xff1b; 输入命令&#xff1a;git config http.postBuffer 524288000 执行完上面的语句后输入&#xff1a;git config…

Stable Diffusion 系列教程 | 图生图基础

前段时间有一个风靡全网的真人转漫画风格&#xff0c;受到了大家的喜欢 而在SD里&#xff0c;就可以通过图生图来实现类似的效果 当然图生图还有更好玩的应用&#xff0c;我们一点一点来探索 首先我们来简单进行一下图生图的这一个实践---真人转动漫 1. 图生图基本界面 和…

代码之美:探索可维护性的核心与实践

为什么可维护性如此重要 项目的长期健康 在软件开发的早期阶段&#xff0c;团队可能会对代码的可维护性不太重视&#xff0c;因为他们更关心的是功能的快速交付。但随着时间的推移&#xff0c;随着代码库的增长和复杂性的增加&#xff0c;不重视代码的可维护性可能会导致严重的…

docker使用安装教程

docker使用安装教程 一、docker安装及下载二、使用教程2.1 镜像2.2 容器2.3 docker安装Redis 一、docker安装及下载 一、安装 安装执行命令&#xff1a;curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 二、启停常用命令 启动docker,执行命令&#xf…

分支和循环语句-C语言(初阶)

目录 一、什么是语句 二、分支语句 2.1 if语句 2.2 switch语句 三、循环语句 3.1 while循环 3.2 for循环 3.3 do...while循环 一、什么是语句 C语言语句有五类&#xff1a;表达式语句、函数调用语句、控制语句、复合语句、空语句。 控制语句用于控制程序的执行流程&#xff0…

在vue3+ts+vite中使用svg图片

目录 前言 步骤 1.安装svg-sprite-loader,这里使用的是6.0.11版本 2.项目的svg图片存放在src/icons下&#xff0c;我们在这里创建两个文件index.ts和index.vue&#xff08;在哪创建和文件名字并没有任何要求&#xff09; 3.在index.ts中加入下列代码(如果报错找不到fs模块请…

Redis的基本操作

文章目录 1.Redis简介2.Redis的常用数据类型3.Redis的常用命令1.字符串操作命令2.哈希操作命令3.列表操作命令4.集合操作命令5.有序集合操作命令6.通用操作命令 4.Springboot配置Redis1.导入SpringDataRedis的Maven坐标2.配置Redis的数据源3.编写配置类&#xff0c;创还能Redis…

ubuntu修改默认文件权限umask

最近在使用ubuntu的过程中发现一个问题&#xff1a; 环境是AWS EC2&#xff0c;登录用户ubuntu&#xff0c;系统默认的umask是027&#xff0c;修改/etc/profile文件中umask 027为022后&#xff0c;发现从ubuntu用户sudo su过去root用户登录查询到的umask还是027&#xff0c;而…

2023-8-22 单调栈

题目链接&#xff1a;单调栈 #include <iostream>using namespace std;const int N 100010;int n; int stk[N], tt;int main() {cin >> n;for(int i 0; i < n; i ){int x;cin >> x;while(tt && stk[tt] > x) tt--;if(tt) cout << st…

第十章,搜索模块

10.1添加搜索框 <template><div class="navbar-form navbar-left hidden-sm"><div class="form-group"><inputv-model.trim="value"type="text"class="form-control search-input mac-style"placeho…