python+selenium的web自动化上传操作的实现

news2024/11/9 6:07:34

一、关于上传操作

上传有两种情况:

如果是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()

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

今天的文章就到这里了哟,到此这篇关于python+selenium的web自动化上传操作的实现的文章就介绍到这了。


最后

如果你想学习自动化测试,那么下面这套视频应该会帮到你很多

如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....

最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了!


以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

​​

​​​​

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

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

相关文章

Android问题笔记 - ViewPager嵌套RecyclerView,降低ViewPager灵敏度

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

第二证券:建仓的几种方式?

建仓是出资者在证券商场中最根本的出资行为之一。简单来说&#xff0c;就是买入股票或基金&#xff0c;以期取得股价上涨所带来的收益。建仓是证券出资的第一步&#xff0c;也是最重要的一步。在选择建仓方法之前&#xff0c;了解常见的几种方法是很有必要的。 一、现金买入 现…

“技术”已成为京东持续“低价”的底气和重要动能

监制 | 何玺 排版 | 叶媛 10月19日&#xff0c;京东宣布今年的双十一将在10月23日晚8点正式开启。 今年双十一&#xff0c;京东向全体消费者做出了两项承诺&#xff1a;一是所有商品均“现货开卖”&#xff0c;无需等待。二是“全程价保”覆盖8亿商品&#xff0c;让消费者真正…

【学习草稿】bert文本分类

https://github.com/google-research/bert https://github.com/CyberZHG/keras-bert 在 BERT 中&#xff0c;每个单词的嵌入向量由三部分组成&#xff1a; Token 嵌入向量&#xff1a;该向量是 WordPiece 分词算法得到的子单词 ID 对应的嵌入向量。 Segment 嵌入向量&#x…

SequenceFile、元数据操作与MapReduce单词计数

文章目录 SequenceFile、元数据操作与MapReduce单词计数一、实验目标二、实验要求三、实验内容四、实验步骤附&#xff1a;系列文章 SequenceFile、元数据操作与MapReduce单词计数 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS SequenceFile读写操作掌握Map…

生鲜蔬果社区团购小程序商城的作用是什么

摆在生鲜蔬果商家面前的难题也非常明显&#xff0c;商家缺少营销方式&#xff0c;难以满足基本营销需求&#xff0c;经营没有方向&#xff0c;订单难以管理&#xff0c;商品也难以管理&#xff0c;难以打通引流-转化-留存-复购-裂变-分享路径&#xff0c;线下门店整体而言经营压…

【Ubuntu】Ubuntu20.04安装EasyConnect后打不开的问题。

1 安装过程 (1) 软件下载 EasyConnect下载地址 (2) 安装 dpkg -i EasyConnect_x64_7_6_7_3.deb 如果需要卸载的话,可使用如下命令: dpkg -r EasyConnect 双击EasyConnect图标,发现出现打不开的问题。 2 解决方法 首先,先看看是什么原因打不开呢? gedit /usr/share…

基于轻量级yolov5n+CBAM开发构建全球小麦麦穗智能检测计数系统

本文是前文的延伸内容&#xff0c;前文主要是对单个麦穗上麦穗颗粒的检测计数&#xff0c;这里本文的主要目的是要对麦穗进行智能化自动化的检测计数&#xff0c;话不多说&#xff0c;简单先看下效果&#xff1a; 接下来看下数据集&#xff1a; YOLO格式标注文件如下所示&…

社区版Visual Studio通过安装开源插件Fine Code Coverage实现单元测试代码覆盖率统计

1、在Visual Studio上安装Fine Code Coverage插件 扩展->管理扩展->联机 搜索到Fine Code Coverage插件&#xff0c;选中进行下载安装 2、修改Fine Code Coverage配置 如果单元测试框架用的是MSTest&#xff0c;一般需要修改插件配置&#xff0c;否则测试结果不正确 …

【深度学习】数据集最常见的问题及其解决方案

简介 如果您还没有听过&#xff0c;请告诉您一个事实&#xff0c;作为一名数据科学家&#xff0c;您应该始终站在一个角落跟你说&#xff1a;“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…

【Maven教程】(八):使用 Nexus 创建私服 ~

Maven 使用 Nexus 创建私服 1️⃣ Nexus简介2️⃣ 安装 Nexus2.1 下载 Nexus2.2 Bundle 方式安装 Nexus2.3 WAR 方式安装 Nexus2.4 登录 Nexus 3️⃣ Nexus 的仓库与仓库组3.1 Nexus 内置的仓库3.2 Nexus 仓库分类的概念3.3 创建 Nexus 宿主仓库3.4 创建 Nexus 代理仓库3.5 创…

跳动的文化:TikTok如何塑造多元社交内容?

在数字时代&#xff0c;社交媒体已成为塑造大众文化和社会趋势的强大工具。其中&#xff0c;TikTok崭露头角&#xff0c;以其独特的短视频平台在全球范围内赢得了数以亿计的用户。 TikTok不仅仅是一个娱乐应用&#xff0c;它还是一个文化引擎&#xff0c;重新定义着社交内容和…

一百九十二、Flume——Flume数据流监控工具Ganglia单机版安装

一、目的 在安装好Flume之后&#xff0c;需要用一个工具可以对Flume数据传输进行实时监控&#xff0c;这就是Ganglia 二、Ganglia介绍 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 &#xff08;一&#xff09;第一部分——gmond gmond&#xff08;Ganglia Monitoring Da…

vue3中去除eslint严格模式

vue3中去除eslint严格模式 1、全局搜索&#xff1a;extends 2、一般在package.json或者vue.config.js中&#xff0c;直接删除掉vue/standard&#xff0c;重启项目。(在package.json文件中&#xff0c;编译不允许有注释&#xff0c;所以直接删掉)

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接&#xff1a; https://arxiv.org/abs/2008.08370 目录 摘要&#xff1a; Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要&#xff1a; 协调的在线行为是信息…

配置 Pod 以使用 PersistentVolume 作为存储

配置 Pod 以使用 PersistentVolume 作为存储 本文将向你介绍如何配置 Pod 使用 PersistentVolumeClaim 作为存储。 以下是该过程的总结&#xff1a; 你作为集群管理员创建由物理存储支持的 PersistentVolume。你不会将该卷与任何 Pod 关联。你现在以开发人员或者集群用户的角色…

PAM从入门到精通(十六)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十五&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 2.…

RK3568笔记三:基于ResNet18的Cifar-10分类识别训练部署

若该文为原创文章&#xff0c;转载请注明原文出处。 本篇文章参考的是野火-lubancat的rk3568教程&#xff0c;本篇记录了在正点原子的ATK-DLK3568部署。 一、介绍 ResNet18 是一种卷积神经网络&#xff0c;它有 18 层深度&#xff0c;其中包括带有权重的卷积层和全连接层。它…

Mysql架构解析,InnoDB架构概述。

MySQL架构解析 Mysql整体架构 MySQL整体架构如下图所示&#xff1a; MySQL逻辑系统架构分为4层: 应用层MySQL服务层存储引擎层系统文件层 下面将对各层的功能和组件进行介绍&#xff0c;并探讨一条语句的执行过程。 应用层 应用层是MySQL体系架构的最上层&#xff0c;它…

Docker——【部署项目的最优解】使用DockerCompose部署项目

目录 前言 1、安装docker-compose 2、为什么使用docker-compose&#xff1f; 3、如何使用DockerCompose 3.1、创建docker-compose文件 3.2、docker-compose相关命令&#xff1a; 前言 对Docker常规操作部署项目不了解的伙伴&#xff0c;可以先看看这篇文章&#xff1a;h…