当前位置: 首页 > 工具软件 > pywinauto > 使用案例 >

自动化工具Pyautogui和Pywinauto详细介绍和使用

相温文
2023-12-01


在PC端应用程序自动化测试工具有三种,即对于C/S架构来说:Pyautogui、Pywinauto和Pywin32,其中对于浏览器B/S架构来说还可以使用selenium来进行web端的自动化(这个以后在写),因为Pywin32我用的比较少,下面着重介绍其他软件。

一. Pywinauto库的介绍

pywinauto 模块主要用于应用控制(打开、关闭应用等)窗口控制(最大化、最小化窗口等),也可以等位到控件,并对控件进行操作,如点击、编辑等。具体使用方法如下:

#对于首次使用这个包的用户,需要安装包,安装命令如下:
#在cmd里面输入:pip isntall pywinauto
from pywinauto.application import Application   #导入Application类
app = Application(backend="uia")   #实例化
#backend 属性有2个取值:win32 和 uia,win32 为默认值,根据应用程序的属性来进行查看,常用的小工具有inspect.exe、SpyLite.exe,具体下载链接在下面
path = r""   #这里填入想要打开程序的绝对路径
app.start(path)   #启动程序
app.connect(path)  #连接程序或者app.connect(process=3308),这里填入的是一个应用程序的进程号,在任务管理器中可以看到
app.kill()  #这里是强制杀死程序

百度网盘链接
提取码:xi2l

二、 pyautogui库的介绍和使用

2.1 博客推荐

由于网上对这个工具介绍很多,我这里推荐三个我认为写的很好的博客分享给大家:
pyautogui详解
pyautogui和自动化测试框架的结合使用
pyautogui使用教程

2.2 如何实现测试自动化呢?

①、这个工具可以通过坐标来进行点击,即需要不同的坐标,如果页面元素位置发生改变,则坐标不管用了。
②、通过图片在进行定位,事先在页面截图,在通过在页面上进行查找,如果没有找到则返回None,找到了就返回一个<class ‘pyscreeze.Box’>类型(左上角坐标x,左上角坐标y,长,宽),如果返回的是center中心坐标(x,y),则是一个<class ‘pyscreeze.Point’>类型Point(x=680, y=135),则可以通过该结果来进行判断、断言
③、这个工具还可以使用热键来进行操作,就可以实现键盘的操作,实现自动化,但是由于pyautogui本身对图片识别率较低,便引入了opencv来提升识别率,通过灰度值得调整可以快速准确的识别定位图片
④、但是pyautogui的图片是跟分辨率有关系,所以复用性不高,即在其他电脑上想要使用,要么将所有的电脑的分辨率调成一样;或者将窗口设置成一样大小(即分辨率一样)
⑤、 由于pyautogui是通过图片来进行定位,则需要专门的图片存储来进行管理,则这会加大成本,因此这也是它的局限性。
⑥、由于通过图片定位,这无疑需要花费较多的时间来进行查找,对于一些比较看重时间的项目就不太适合。所以仁者见仁智者见智了。

2.3 常见的使用方法介绍

2.3.1 故障保险方法

import pyautogui

pyautogui.PAUSE = 1   #即pyautogui每次调用完程序后等待时间,也可以和time.sleep()结合起来使用
pyautogui.FAILSAFE = True  #在程序执行错误时,可以将鼠标移到左上角(0,0),让程序停止下来,避免后续的无用功

2.3.2 获取屏幕的分辨率和鼠标的实时位置

import pyautogui
import time

size = pyautogui.size()   #获取屏幕分辨率
time.sleep(1)
position = pyautogui.position()   #获取鼠标当前位置
print(f"屏幕的尺寸:{size},当前鼠标的位置:{position}")

2.3.3 模拟鼠标单击(左、右、中)、双击、滚动、移动、拖动方法

2.3.3.1 点击方法

参考源码,发现点击有以下几种方法:①通过x,y坐标②通过坐标序列③,通过图片点击,④,通过图片返回坐标进行点击,⑤,通过像素定位点击,欢迎大家补充!!!

import pyautogui   #第一种方法通过x,y坐标点击
import time

pyautogui.hotkey("win","d")   #热键win+D  最小化pycharm
time.sleep(1)
pyautogui.click()  #可以不填参数,即在当前位置进行点击
pyautogui.click(x=100,y=100,clicks=2,duration=0.1,interval=0.2,tween="linear",button="PRIMARY",logScreenshot="gg") #x,y如果是整数,则就是坐标

参数解释

clicks:点击次数,默认是1次,2就是双击
duration:点击持续时间,默认为0.0
interval:点击间隔时间,默认为0.0
tween:鼠标的移动模式,默认是简单的线性吐温,可以不管,如需了解详细信息,请参阅PyTweening模块文档
button:鼠标按键,默认左键,可选(left,middle,right,primary,secondary)
logScreenshot:表示点击时开始截图,这里填入截图名字,默认None,不截图
_pause:不推荐使用“暂停”参数。调用“pyautogui"或者sleep()函数来实现暂停。

#第二种方法
import pyautogui
import time

pyautogui.hotkey("win","d")
time.sleep(1)
pyautogui.click(x=(100,100))  #让x=(),序列化x也能进行点击操作,这种只针对x;y不能使用这种方法,会报错。
#第三种方法
pyautogui.click(x="gg.PNG",duration=0.1,clicks=2)  #预先截图,点击两次;只针对x
pyautogui.click(1000,600)   #在空白处点击一次,防止第二次运行失败

#第四种方法
import pyautogui
import time
import cv2

pyautogui.hotkey("win","d")
time.sleep(1)
result = pyautogui.locateOnScreen(image="gg.PNG", grayscale=False, confidence=0.9)  #这个函数是将你预先截取的图片在页面进行查找,如果找到了就返回找到位置的(图片左上角坐标x,y,长,宽),没有找到则返回None
print(type(result),result)   #<class 'pyscreeze.Box'> Box(left=75, top=5, width=74, height=73)
center= pyautogui.center(result)  #这个函数是返回result的中心坐标
print(type(center),center)  #<class 'pyscreeze.Point'> Point(x=112, y=41)
pyautogui.click(center)  #单击

#####第二种获取中心坐标方法
center= pyautogui.locateCenterOnScreen(image ="gg.PNG",grayscale= False,confidence=0.9)  #这种方法是和上面两个函数的结合使用
print(type(center),center)   #<class 'pyscreeze.Point'> Point(x=112, y=41)
pyautogui.click(center)  #单击

参数解释:

image:这里填入图片的路径,绝对路径和相对路径都可以
grayscale:grayscale=True代表去饱和度,可以消除显示器饱和度导致的颜色偏差而导致图片定位失败的问题,可以提升速度
confidence:表示灰度值,值越高定位越准,但可能失败,建议0.8或者0.9

#####第5种方法,通过像素定位来点击
x,y = center  #这是上面获取的中心坐标
print(type(x),type(y))   #<class 'numpy.int64'> <class 'numpy.int64'>
posi_pixel = pyautogui.pixel(int(x),int(y))
print(pyautogui.pixel(int(x),int(y)))   #这里装换格式
if pyautogui.pixel(int(x),int(y))[0] == 0:   #<class 'tuple'>取下标
    print("找到了")
    pyautogui.click(center)
#### 也可以手动输入坐标来查找
posi_pixel = pyautogui.pixel(100,100)  #返回一个像素组成的元祖,如(255,255,255)

2.3.3.2左击,右击方法

方法和click()方法大同小异,只是少了一个button参数。

import pyautogui
import time
import cv2

pyautogui.hotkey("win","d")
time.sleep(1)
pyautogui.leftClick(x=100,y=100,clicks =2)  #鼠标左击两次
pyautogui.rightClick(x=100,y=100,clicks =2)  #鼠标右击两次
pyautogui.middleClick(x=100,y=100,clicks =2)  #鼠标滚轮击两次

pyautogui.tripleClick()   #这个方法是3次连续点击

2.3.3.3 滚动方法

import pyautogui

time.sleep(1)
pyautogui.scroll(clicks=200,x=100,y=100)  #在坐标(100,100)处向上滚动200像素
pyautogui.scroll(clicks=-200,x=100,y=100)  #在坐标(100,100)处向下滚动200像素
# 如有指定的需求。(目前仅有Linux支持)水平滚动
pyautogui.hscroll(clicks=100)
# 垂直滚动
pyautogui.vscroll(clicks=-200)

2.3.3.4 鼠标移动方法

具体参数前面都有讲解

import pyautogui
import time

pyautogui.moveTo(200,200)  #绝对移动,从当前位置移动到指定位置
time.sleep(1)
pyautogui.move(1000,100)   #相对移动,在原来的基础上再次移动即(x+1000,y+100)
pyautogui.moveRel(1000,100)  #同上

2.3.3.5 鼠标拖动方法

import pyautogui
import time

pyautogui.dragTo(100,100)   #鼠标绝对拖动
pyautogui.drag(200,100)    #鼠标相对推动(x+200,y+100)
pyautogui.dragRel(100,100)  #同上

2.3.4 模拟键盘操作

2.3.4.1 键盘按下或按键组合

import pyautogui
import time

pyautogui.press(keys="enter",presses=2)   #按enter键两次
pyautogui.hotkey("enter","enter")  #热键,连续两次按enter
pyautogui.hotkey("ctrl","c")
pyautogui.hotkey("ctrl","v")

2.3.4.2 键盘写入


import pyautogui
import time

pyautogui.hotkey("win","d")   
time.sleep(1)
pyautogui.click(x="gg.PNG",clicks=2,duration=0.1)  
pyautogui.write(["1","2"],interval=1)  #可以依次写入,也可以一次性写入
pyautogui.write("12",interval=0.1)  #同上
pyautogui.typewrite("12",interval=0.1)  #同上
pyautogui.typewrite(["1","2"],interval=1)  #同上

2.3.4.3 键盘和鼠标按下和松开,和鼠标拖动异曲同工

import pyautogui
import time

pyautogui.mouseDown()  #按下
pyautogui.mouseUp()    #松开
pyautogui.keyDown()   #按键按下
pyautogui.keyUp()   #按键松开
time.sleep(3)

三、pyautogui简单实例

3.1 打开百度网页并输入内容,点击回车

具体步骤:截浏览器的图标、截浏览器输入框图标,获得坐标,点击,输入地址,点击回车,代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @time     :2022/8/23 9:38
# @Author   :南风知我意
# @FileName :exam

import pyautogui
import time

def get_position(path,value):
    center = pyautogui.locateCenterOnScreen(image=path, grayscale=True, confidence=value)
    return center

def open_baidu():

    url = "http://www.baidu.com"
    pyautogui.hotkey("win","d")
    time.sleep(1)
    center = get_position(path="gg.PNG",value=0.9)
    pyautogui.click(center,clicks=2,duration=0.1)
    time.sleep(1)
    center = get_position(path="max.PNG",value=0.9)
    pyautogui.click(center)
    time.sleep(1)
    center = get_position(path="url_input.PNG",value=0.9)
    pyautogui.click(center,clicks=1)
    time.sleep(1)
    pyautogui.write(url,interval=0.1)
    pyautogui.press("enter",presses=2)
    time.sleep(1)
    center = get_position(path="input_content.PNG",value=0.9)
    pyautogui.click(center)
    time.sleep(1)
    pyautogui.write("hhhh",interval=0.1)   #这是在百度搜索框输入内容
    time.sleep(1)
    pyautogui.press("enter",presses=2)   #按了两次回车

if __name__ == '__main__':
    open_baidu()
 类似资料: