社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python+pywinauto+lackey实现pc端exe自动化

小末的夏天 • 4 年前 • 947 次点击  

欢迎阅读

最近一年多一直在从事PC端exe的测试,也是趁着闲余时间,调研了下exe的自动化。
核心框架为python+pywinauto+lackey这样的一个组合方式
本文以大家熟知的Tim为例子,实现打开exe,输入账号密码并且登录,搜索具体聊天对象,发送消息,并退出账号的一系列简单操作。
依然是从环境搭建开始,我会尽我所能,详细的去介绍每一步,让各位能看懂我每一步操作的目的和理由。只对代码感兴趣的,跳到文章最后即可。

框架介绍

以python3为基础进行程序设计。
pywinauto是基于Python开发的,用于PC端exe自动化测试的脚本模块。虽然它可以履行元素定位的职责,但是现在的前端语言繁多,很多时候难以定位到元素属性(也可能是我才疏学浅),于是我采用了lackey。lackey也是基于python开发的第三方库。通过lackey,我们可以用图像定位的方式去定位具体元素。这种方式,在理解上简单明了,而且代码写起来也十分简洁轻松。
关于lackey的资料,在网上基本没有,我也是通过查看原生文档,才艰难了解到这个模块的魅力。
对于我这样一个英文不太好的人,简直是成吨伤害。

环境搭建

python3环境安装,无需多言,IDE也依然是采用pycharm。

pywinauto 可以直接在pycharm的设置中直接安装
在是插入图片描述
或者在CMD中直接输入:pip install pywinauto

在这里插入图片描述

但是国内环境,如果网络不是特别完美,经常会被墙掉,所以建议加上镜像地址去安装。

pip install -i https://pypi.doubanio.com/simple/  pywinauto
  • 1

——————————————————————————————————————————

lackey 的安装方式和pywinauto方式上大致相同,pycharm安装或者pip安装均可,但是我没有找到lackey在国内的镜像地址,连清华的镜像里都没有lackey。
如果你实在受网络影响,频频安装失败,稍安勿躁,我还有最后一招。进入下面这个地址,下载lackey的安装包。
链接: https://pypi.org/project/Lackey/ .
在这里插入图片描述
将文件放在本地目录:C:\Users\Administrator
在这里插入图片描述
然后CMD中输pip安装命令
在这里插入图片描述
至此理论上的pc exe自动化环境就已经完成了。总结起来,就是安装两个python的第三方模块。

Tim自动化

首先导入我们需要用到的模块

import pywinauto
import time
import lackey
  • 1
  • 2
  • 3

—————————————————————————————————————————————
我们需要先启动Tim
pywinauto模块中,Application类的start方法,可以启动本机指定路径的程序

#启动exe
path = r'E:\tools\Tim\Bin\TIM.exe'
app = pywinauto.Application().start(path)
  • 1
  • 2
  • 3

到了这一步,可以尝试调试一下,是否正常打开了exe。
(关于exe的启动或者连接,有多种方式。但是如果注意使用连接的话,必须得保证exe已经在运行了。)

—————————————————————————————————————————————
登录界面
到了这一步就需要使用lackey进行图像识别性质的元素定位了。
我们将QQ号输入框进行小范围截图,范围大致如红框所示:
在这里插入图片描述

在python工程中,新建photo文件夹,将截图文件放入,保存为为‘qqhaoma.png’。
(之后所有需要定位的元素,都需要进行小范围截图,并保存到photo文件夹中)
在账号登录的这一过程中,我们总共需要截三个图:QQ号输入框、QQ密码输入框、安全登录按钮。
在这里插入图片描述
供识别的图像准备好后,即可开始定位
我们使用lackey模块中的click方法,此方法会匹配图像对应的元素,并单击默认的鼠标左键。

#QQ账号
lackey.click('photo/qqhaoma.png')
  • 1
  • 2

type方法可以模拟键盘按键进行输入

lackey.type('XXXXXXXXX')
  • 1

QQ密码的定位和输入、登录按钮的定位点击都可以同理实现。

#QQ账号
lackey.click('photo/qqhaoma.png')
lackey.type('12345678')
time.sleep(0.5)
#QQ密码
lackey.click('photo/qqmima.png')
lackey.type('12345678')


    

time.sleep(0.5)
#安全登录
lackey.click('photo/anquandenglu.png')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

—————————————————————————————————————————————

Tim主界面
在主界面,我们依然通过lackey图像识别的方式,使用click方法定位TIm左上角的搜索框并单击,然后输入我想搜索的好友
在这里插入图片描述

lackey.click('photo/sousuo.png')
lackey.type('zhengyi')
  • 1
  • 2

Tim搜索到了我希望聊天的好友,这个时候需要对列表进行双击操作,才能打开对话框
在这里插入图片描述
双击的方法是doubleclick

lackey.doubleClick('photo/zhengyi.png')
  • 1

打开对话框后,输入框默认是激活状态,这时可以直接输入需要发送的消息,再定位发送按钮,就完成消息发送

lackey.type('你好Hello summer!')
lackey.click('photo/fasong.png')
  • 1
  • 2

—————————————————————————————————————————————
退出登录
定位左上角头像框并单击,然后单击退出账号,即可
(我也曾试过,直接用app.kill()关掉整个窗口,但是Tim有点耍无赖,关掉窗口后,程序还在后台运行,还没办法手动更改这个设置~)
在这里插入图片描述

lackey.click('photo/touxiang.png')
lackey.click('photo/tuichuzhanghao.png')
  • 1
  • 2

有时候退出的时候,Tim还会弹出一个提示是否确定退出的提示框,所以加一个try

try:
    lackey.click('photo/shi.png')
except:
    pass
  • 1
  • 2
  • 3
  • 4

至此,整个场景结束

完整代码

import pywinauto
import time
import lackey

#启动程序
path = r'E:\tools\Tim\Bin\TIM.exe'
app = pywinauto.Application().start(path)

#QQ账号
lackey.click('photo/qqhaoma.png')
lackey.type('134567888')
time.sleep(0.5)
#QQ密码
lackey.click('photo/qqmima.png')
lackey.type('1231413423')
time.sleep(0.5)
#安全登录
lackey.click('photo/anquandenglu.png')
#搜索对话人,并双击打开对话框
lackey.click('photo/sousuo.png')
time.sleep(0.5)
lackey.type('zhengyi')
time.sleep(1)
lackey.doubleClick('photo/zhengyi.png')
time.sleep(0.5)
#输入消息并发送
lackey.type('你好Hello summer!'


    
)
lackey.click('photo/fasong.png')
time.sleep(3)
#点击头像,退出账号
lackey.click('photo/touxiang.png')
lackey.click('photo/tuichuzhanghao.png')
try:
    lackey.click('photo/shi.png')
except:
    pass

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

细心的同学可能会发现,中文并没有被发送出去。因为type方法只能响应键盘事件,并且原生文档中明确说明了此方法不支持文本。我用自己蹩脚的英文查找了整篇文档,也没有找到能对文档进行输入的方法,所以这可能是暂时的一个遗憾吧,相信随着开发者后期会进行完善。
原生文档:
链接: https://lackey.readthedocs.io/en/latest/lackey.html# .

如果想进行自动化测试场景设计的话,再加上pytest模块即可,这方面的资料比较多了。

写在最后

虽然lackey暂时在国内基本找不到相关资料,并且它暂时功能不是那么的完善,但是我觉得它是一个很合适的exe定位手段。想想我写的这篇公开贴可能是国内第一篇针对lackey的实例,内心还是比较励志的。pywinauto也有如menu_select、type_keys、click等诸多方法进行定位,只是在一些前端框架中局限性比较高。我最开始也是用notepad进行练手,inspect查看元素属性,全部用pywinauto进行定位。后来对工作的软件进行自动化时,发现一些title、class_name等属性基本无法定位。关于exe的定位,本就应该结合多种方式去互相辅助、并行使用。祝lackey以后越来越好用~

Author
zhengyi
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70991
 
947 次点击