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详解
pyautogui和自动化测试框架的结合使用
pyautogui使用教程
①、这个工具可以通过坐标来进行点击,即需要不同的坐标,如果页面元素位置发生改变,则坐标不管用了。
②、通过图片在进行定位,事先在页面截图,在通过在页面上进行查找,如果没有找到则返回None,找到了就返回一个<class ‘pyscreeze.Box’>类型(左上角坐标x,左上角坐标y,长,宽),如果返回的是center中心坐标(x,y),则是一个<class ‘pyscreeze.Point’>类型Point(x=680, y=135),则可以通过该结果来进行判断、断言
③、这个工具还可以使用热键来进行操作,就可以实现键盘的操作,实现自动化,但是由于pyautogui本身对图片识别率较低,便引入了opencv来提升识别率,通过灰度值得调整可以快速准确的识别定位图片
④、但是pyautogui的图片是跟分辨率有关系,所以复用性不高,即在其他电脑上想要使用,要么将所有的电脑的分辨率调成一样;或者将窗口设置成一样大小(即分辨率一样)
⑤、 由于pyautogui是通过图片来进行定位,则需要专门的图片存储来进行管理,则这会加大成本,因此这也是它的局限性。
⑥、由于通过图片定位,这无疑需要花费较多的时间来进行查找,对于一些比较看重时间的项目就不太适合。所以仁者见仁智者见智了。
import pyautogui
pyautogui.PAUSE = 1 #即pyautogui每次调用完程序后等待时间,也可以和time.sleep()结合起来使用
pyautogui.FAILSAFE = True #在程序执行错误时,可以将鼠标移到左上角(0,0),让程序停止下来,避免后续的无用功
import pyautogui
import time
size = pyautogui.size() #获取屏幕分辨率
time.sleep(1)
position = pyautogui.position() #获取鼠标当前位置
print(f"屏幕的尺寸:{size},当前鼠标的位置:{position}")
参考源码,发现点击有以下几种方法:①通过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)
方法和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次连续点击
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)
具体参数前面都有讲解
import pyautogui
import time
pyautogui.moveTo(200,200) #绝对移动,从当前位置移动到指定位置
time.sleep(1)
pyautogui.move(1000,100) #相对移动,在原来的基础上再次移动即(x+1000,y+100)
pyautogui.moveRel(1000,100) #同上
import pyautogui
import time
pyautogui.dragTo(100,100) #鼠标绝对拖动
pyautogui.drag(200,100) #鼠标相对推动(x+200,y+100)
pyautogui.dragRel(100,100) #同上
import pyautogui
import time
pyautogui.press(keys="enter",presses=2) #按enter键两次
pyautogui.hotkey("enter","enter") #热键,连续两次按enter
pyautogui.hotkey("ctrl","c")
pyautogui.hotkey("ctrl","v")
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) #同上
import pyautogui
import time
pyautogui.mouseDown() #按下
pyautogui.mouseUp() #松开
pyautogui.keyDown() #按键按下
pyautogui.keyUp() #按键松开
time.sleep(3)
具体步骤:截浏览器的图标、截浏览器输入框图标,获得坐标,点击,输入地址,点击回车,代码如下:
#!/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()