web自动化上传文件

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.hqwc.cn/news/307821.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据Doris(四十四):查询物化视图和自动匹配

文章目录 查询物化视图和自动匹配 一、​​​​​​​查询物化视图

网络运行状况监控工具

网络运行状况是网络在其操作和环境约束范围内按预期运行的能力,但是,随着云和人工智能等技术的出现,网络变得越来越复杂,维护其 IT 基础设施是一项越来越繁琐的任务。为了确保网络可靠性,组织需要了解每个端点的运行状…

Walker S敲锣,人形机器人第一股优必选在港交所主板挂牌上市

12月29日,优必选(股份代码:9880.HK)正式在香港交易所主板挂牌上市,股价最高达91港元,对应市值约380亿港元。 图片1:从左至右依次为:香港交易所联席营运总监陈翊庭,香港联…

TG7050CKN,TG7050SKN ,TG7050CMN,TG7050SMN

爱普生推出的温补晶振型号:TG7050CKN,TG7050SKN ,TG7050CMN,TG7050SMN频率范围为 10mhz ~ 54mhz 适用于广泛的频率需求。这几款的特点就是耐高温,温度可达105℃高温,而且都是高稳定性温补晶振,&…

计量经济学|学习笔记以及学习感悟

初级计量经济学着重于介绍基本的统计工具和经济模型,以帮助理解经济数据和经济现象之间的关系。它包括回归分析、假设检验和预测方法等内容。中级计量经济学则深入研究这些方法的理论基础和实际应用,包括更复杂的模型和技术,如面板数据分析、…

Python 操作 MySQL:使用 mysql-connector-python 操作 MySQL 数据库

大家好,我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时,mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能,使您能够执行各种数据库操作,如连接数据库、执行查询和插入数据等。在本文…

IDEA使用HDFS的JavaApi

注:以下代码操作是利用junit在java测试文件夹中实现。 1. 准备工作 1.1 创建测试类 创建测试类,并定义基本变量 public class HDFSJAVAAPI {// 定义后续会用到的基本变量public final String HDFS_PATH "hdfs://hadoop00/";Configuration …

CleanMyMac X 4.14.6中文版2024年最新必备的Mac系统清理工具

CleanMyMac X 4.14.6中文版是一款专业的Mac系统清理软件,可一键智能扫描清理mac系统日志缓存磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X 破解版可以强力卸载恶意软件,修复系统漏洞&…

CSI多普勒效应

CSI多普勒效应 一、定义二、应用三、计算方法1方法2STFT和DFT间的区别 一、定义 多普勒频移是指由于运动引起的信号频率的变化。当信号源相对于接收器运动时,由于多普勒效应,信号的频率会发生改变。多普勒频移可以通过以下公式表示: 二、应…

acwing 前缀差分

二维差分 构造差分时,在读入矩阵元素时同时构建差分即最初差分矩阵是一个全零矩阵的差分读入一个元素时,差分矩阵随即更新即该数组是一个含有已读入元素的矩阵的差分矩阵随后对于区间累加,执行相应操作,因为当前矩阵已经是构造好…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符&#xff…

再见2023,你好2024(附新年烟花python实现)

亲爱的朋友们: 写点什么呢,我已经停更两个月了。2023年快结束了,时间真的过得好快,总要写点什么留下纪念吧。这一年伴随着许多挑战和机会,给了我无数的成长和体验。坦白说,有时候我觉得自己好像是在时间的…