web自动化上传文件

news2024/11/25 14:57:27

1,web 自动化文件上传不要太简单

熟悉 web 自动化测试的大佬应该都懂,当采用 js 调用原生控件进行文件上传的时候,最常用的是使用 pywin32 等系统交互库。

image.png

当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址,需要整这么多莫名其妙的代码(看不懂没关系,只需要看代码行数就够了):

image.png

我们来看看使用 pyautogui 多么简单:

#输入文件名 
pyautogui.write(r'd:\demo.txt')
 # 回车 
pyautogui.press('enter', presses=2) 

2, 跨平台的使用和安装

上面的代码在 mac ,linux 和 windows 上是通用的,只是在 mac 和 linux 下需要安装额外的依赖。

windows 安装不需要其他依赖,直接使用了 python 自带的 ctypes 模块:

pip install pyautogui 

mac 安装需要 PyObjC 模块:

pip3 install pyobjc-core 
pip3 install pyobjc 
pip3 install pyautogui 

linux 需要依赖 python3-Xlib 或者 python-xlib(python2):

pip3 install python3-xlib 
pip3 install pyautogui 

linux 如果没有安装相关 python 库可能会报错。 Debian 系发行版(其他发行版自行了解)你可能需要输入:

sudo apt-get install scrot 
sudo apt-get install python3-tk 
sudo apt-get install python3-dev 

3,基于坐标和图像的设计哲学

pyautogui 并不需要去解析各平台的控件结构,他的元素定位都是基于坐标的。所以不论你是通过手工截图测量,还是通过自动化工具获取,只要你能拿到坐标,你就能进行元素操作。

一,鼠标操作

1,获取坐标

import pyautogui as ui 
# 获取屏幕大小 
size = ui.size() 
# 获取现在鼠标位置 
p = ui.position() 
# 坐标是否超出屏幕范围 
if_on = ui.onScreen(*p) 

2, 鼠标移动

ui.moveTo(x/2, y/2, duration=2, tween=easeInCirc) 

参数说明:

  • x, y 坐标
  • duration 持续秒数,默认是瞬间完成
  • tween 特效,一般没什么用。

3, 鼠标拖拽, 移动到指定的坐标

ui.dragTo(500, 500) 

4, 百发百中的射箭游戏

import random
import time 
import pyautogui as ui 
x, y = ui.position() 
target = (800, 800) 
for i in range(10):
    rand_x = random.randint(0, x) 
    rand_y = random.randint(0, y) 
    # 随机生成位置 
    print(rand_x, rand_y) 
    ui.moveTo(rand_x, rand_y) 
    # 移动到目标位置 
    ui.dragTo(target, duration=0.2) 
    time.sleep(1) 

效果:

image.png

5, 相对移动

ui.move(-500, duration=1) 
ui.move(yOffset=-400, duration=1) 
ui.move(500, duration=1) 
ui.move(yOffset=400, duration=1) 

相对移动的小游戏:

start = 20 
add_point = 10 
duration = 0.5 
for i in range(10): 
    if i % 2 == 0: 
        ui.drag(start, duration=duration) 
        ui.drag(yOffset=start, duration=duration) 
    else: 
        ui.drag(-start, duration=duration) 
        ui.drag(yOffset=-start, duration=duration) 
    start += add_point

效果:

image.png

6,点击

ui.click(x=None,
        y=None,
        clicks=1, # 点击次数 
        interval=0.0, # 间隔时间 
        button='right', # 右键 
        duration=0.0) # 持续时间

通过 click 进一步封装了 leftClick, rightClick, middleClick, doubleClick, tripleClick

7, scroll

窗口滚动,但是封装的滚动感觉比较鸡肋,他是以鼠标点击次数为单位的,所以不知道会滚动到什么位置。

pyautogui.scroll(10) # 向上滚动 10 个 clicks 
>>> pyautogui.scroll(-10) # # 向下滚动 10 个 clicks
 >>> pyautogui.scroll(10, x=100, y=100) # 移动到位置再滚动

使用 drag 和 dragTo 会更加方便一点,还是以坐标为依据,通过操作鼠标中键来实现窗口滚动,比如这个例子是 scroll 和 drag 的对比:

x, y = ui.size() 
ui.scroll(-100) 
time.sleep(1)
 ui.scroll(100)
 time.sleep(1) 
ui.dragTo(y=y, button='middle') # 滚动到窗口底部

效果:

image.png

二,键盘操作

1, 输入框输入

# 输入yuz, 每个字母时间间隔 0.2 s
​​​​​​​pyautogui.write("yuz",interval=0.2)

注意:pyautogui 并不支持输入框自动聚焦,所有输入之前先要点击输入框位置。

2,按下键盘 press

press('enter', presses=1, interval=0.0) 

相当于鼠标操作的 click, 可以输入键盘上的按键, 比如 shift 键,enter 键。所有的按键可以查看源码当中的 KEYBOARD_KEYS 或者 KEY_NAMES。

参数:

  • presses, 操作按键次数
  • interval, 每次按键的间隔时间

所有按键列表:

image.png

3, 热键 hotkey

ui.hotkey('ctrl', 'shift', 'esc') 

4, keyUp, keyDown

这是 press 的分解动作,相当于鼠标的 mouseUp 和 mouseDown。上面热键的操作方式可以分解成:

ui.keyDown('ctrl') # 按下 ctrl 
ui.keyDown('shift') # 按下 shift 
ui.keyDown('esc') # 按下 esc 
ui.keyUp('esc') # 释放 ctrl 
ui.keyUp('shift') # 释放 shift 
ui.keyUp('ctrl') # 释放 esc 
三,图像识别

坐标定位这种方式为通用性打下了基础,让 pyautogui 可以轻松做到跨平台。但是实际操作过程中很难清除的知道某个要操作的控件的确切位置,因为每次打开相同的页面都有可能是变动的。pyautogui 给出的解决方案非常简单粗暴,使用图像识别,返回在屏幕中的坐标位置,在通过坐标进行处理。

1,locateCenterOnScreen

返回被识别图像的中心坐标。参数说明:

  • 必传参数,图片路径;
  • confidence, 识别精度,需要安装 opencv 才能使用;
  • grayscale, 灰度级别,能够提升识别速度。
locateCenterOnScreen('img/seven.png', confidence=0.7, grayscale=True) 

现阶段图像识别的结果并不理想,基于图像识别的使用还存在以下问题:

  • 识别不到指定元素;

  • 识别精度不够;

  • 查找速度比较慢

  • 需要用到重型的 opencv 库, 或许可以尝试换用其他库。

  • 需要提前准备被识别的图片,如果操作元素多,手动处理素材会怀疑人生。

    所以 uiautogui 适合的场景是跨平台的少量原生控件交互,如果要对原生应用控件大量操作,还是换用其他工具比较合适。

    基于图像识别的具体例子:

import time 

import pyautogui as ui 
time.sleep(3) 
seven = ui.locateCenterOnScreen('img/seven.png', confidence=0.7, grayscale=True) 
mult = ui.locateCenterOnScreen('img/multipy.png', confidence=0.7, grayscale=True) 
two = ui.locateCenterOnScreen('img/two.png', confidence=0.7, grayscale=True) 
equal = ui.locateCenterOnScreen('img/equal.png', confidence=0.7, grayscale=True) 
ui.click(*seven) 
ui.click(*mult)
 ui.click(*two) 
​​​​​​​ui.click(*equal) 

效果:

image.png

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

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

相关文章

微生信 -- 0代码科研绘图,助力发高分文章

1,粘贴数据,一键出图 www.bioinformatics.com.cn微生信云平台以220多款在线绘图、分析模块为基础,致力于0代码在线分析数据,0代码在线绘制科研图片。让不会编写代码的科研工作者,贴贴数据,点点鼠标就能够进…

大模型中的LM-BFF

LM-BFF paper: 2020.12 Making Pre-trained Language Models Better Few-shot Learners Prompt: 完形填空自动搜索prompt Task: Text Classification Model: Bert or Roberta Take Away: 把人工构建prompt模板和标签词优化为自动搜索 LM-BFF是陈丹琦团队在20年底提出的针对…

基于yolov2深度学习网络的血细胞检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1YOLOv2算法原理 4.2 YOLOv2网络结构 4.3 血细胞检测算法实现 数据集准备 数据预处理 网络训练 模型评估与优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MAT…

Unity中Shader裁剪空间推导(透视相机到裁剪空间的转化矩阵)

文章目录 前言一、简单看一下 观察空间—>裁剪空间—>屏幕空间 的转化1、观察空间(右手坐标系、透视相机)2、裁剪空间(左手坐标系、且转化为了齐次坐标)3、屏幕空间(把裁剪坐标归一化设置)4、从观察空…

Java学习——设计模式——结构型模式1

文章目录 结构型模式代理模式适配器模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来…

开关量信号隔离器在水泥厂的应用

安科瑞 崔丽洁 摘要:在水泥厂生产过程中,需要皮带与提升机进行运输物料,回转下料器进行投放物料。其中涉及大量电动机相关的机械运动,对这些机械运动状态进行检测,可以及时发现问题避免造成事故。针对机械位置检测&…

前端图片适配不同屏幕方案

预备知识: 设备独立像素,以下图的iphone12 Pro为例,390*844表示的就是设备独立像素(DIP),也可以理解为CSS像素 物理像素(设备像素),就是屏幕的分辨率,显示屏就是由一个个物理像素…

基于EMD的滚动轴承故障诊断算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1EMD的基本原理 固有模态函数(IMF) 筛分过程 4.2 基于EMD的滚动轴承故障诊断算法 信号预处理 EMD分解 特征提取 故障诊断 5.算法完整程序工程 1.算法运行效…

Python爱心光波完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

3d导入模型怎样显示原本材质---模大狮模型网

要在导入3D模型时保留原本的材质,您可以尝试以下方法: 导入前检查文件格式:确保您所使用的3D软件支持导入模型的文件格式。不同的软件对文件格式的支持有所差异,选择正确的文件格式可以更好地保留原始材质。 使用正确的材质库&am…

pip freeze 导出的requirements.txt文件含有 @file

使用 pip freeze > requirements.txt 导出的文件中含有 file:// 使用这个文件在其他环境下安装就会出现 找不到路径的错误 原因是这种方法生成的文件只能用于本地环境,无法供他们使用 使用以下方式生成文件 解决:pip list --formatfreeze …

【数据库系统概论】第6章-关系数据库理论

真别看吧,抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式(Normal Form)6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表: but 为啥这样设计呢?由此引出怎样设计一个关系数据库…

C++的多继承和虚继承

目录 多继承的定义和用法定义多继承多继承中派生类对象的内存布局访问基类成员多继承带来的问题 虚继承虚继承的语法虚继承对象的内存布局虚继承中的构造虚继承的缺点 多继承的定义和用法 C支持多继承,即一个派生类可以有多个基类。 很多时候,单继承就…

Spring boot:3.X + Security OAuth2 自定义登录页面、登出后跳转到登录页

本文描述了基于 Spring Oauth2 的 code 模式&#xff0c;实现登陆同时授权、自定义登录界面、登出页面的功能。 1.Maven依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactI…

文件打包上传linux服务器,通过http协议url下载

背景&#xff1a;服务器部署tomcat&#xff0c;已经运行项目 直接在编译后的class文件新建文件&#xff0c;把想要下载的文件放入&#xff0c; 编译后新建文件存放 访问时&#xff0c;加zl/xxx.zip

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序开发系列-07组件

在开发小程序的过程中会遇到一个常见的问题&#xff0c;怎样将其他同事提供的样式或者第三方的样式载入自己的工程&#xff0c;本文基于这个问题为索引&#xff0c;探索下小程序的组件。 什么是组件 组件是视图层的基本组成单元。组件自带一些功能与微信风格一致的样式。一个…

C++标准模板库(STL)

标准模板库&#xff08;STL&#xff09;是一组C模板类&#xff0c;提供常见的编程数据结构和函数&#xff0c;如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库&#xff0c;因此&#xff0c;它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

vivado set_max_delay案例分析

案例分析 在一些设计中&#xff0c;某些信号在特定模式下具有恒定值。例如&#xff0c;在功能模式下&#xff0c;测试信号不切换&#xff0c;因此与VDD或VSS相连这取决于它们的活动水平。这也适用于在设计完成后不切换的信号已通电。同样&#xff0c;今天的设计有多种功能模式…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具&#xff0c;可以支持主流的数据库管理系统&#xff0c;如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑&#xff0c;还是数据同步、备份恢复等操作&#xff0c;Navicat Premium 1…