【pywinauto】简单的UI⾃动化⼊门(基于Windows)第⼀篇前⾔
开⼀个新坑,关于pywinauto的使⽤的,
最近⼀两个星期都在踩pywinauto的坑,踩了的好多坑,时常在想要是我看教程的时候就能有⼈指导清楚我就好了;
⽹上搜到的pywinauto教程没能让我避开雷区,如果说这个教程能够帮助更多⼈不要踩坑可就太好了;
dubbo对于python系统当然如果说现实是我踩坑多纯粹是我⽐较憨那我也认了,各位带哥不要嘲笑就好了。
pywinauto可以说是使⽤起来⽐较轻松简单的模块,对我这种摸鱼选⼿⾮常友善;
作者不仅仅⼀直在更新,甚⾄⼀直在回答问题,可谓是我这样菜鸡的希望之光
Pywinauto的安装
⾸先我安装的是python的32位,python安装就不⽤讲了吧,x86表⽰32位,x64表⽰64位,
官⽹直接下载默认为32位,64位要选Windows x86-64 executable installer这个版本;
当然我之所以选32位的还是因为⽬标程序的兼容性问题,最终选什么版本还是看个⼈需求。
直接最简单的安装:
命令⾏:
pip install pywinauto
如果出现提⽰升级pip,基本可以⽆视
选择特定版本的python安装/安装到指定版本的python:
E:\python_32\python -m pip install pywinauto
替换成你⾃⼰的路径便可,那些什么-t -d的⽅法不知道为什么我就是不⾏,直接给我糊到设了环境变量的那个版本⾥了
如果使⽤的IDE是pychram,那就更简单了:
trimmean反函数直接选⼩加号选包就OK了
⾸先是实例化部分
有两种⽅法,实例化以后才能抓到窗⼝内的各种控件按钮⽂本框之类的,也是⽬前来说最容易出问题的⼀个部分,
直接放原⽂:
An Application() instance is the point of contact for all work with the application you are automating. So the Application instance needs to be connected to a process. There are two ways of doing this:
mysql8教程入门到精通pdf需要⽤到的主要函数为Application(),连接进程的⽅法有两种:
start(self, cmd_line, timeout=app_start_timeout) # instance method:
or:
connect(self, **kwargs) # instance method:
start() is used when the application is not running and you need to start it. Use it in the following way:
python入门教程appstart()是⽤于程序没打开的情况的,但是⼀般没打开就打开就完事⼉了,所以start()⼀般主要还是⽤来模拟打开的这整个过程app = Application().start(r"c:\path\to\your\application -a -n -y --arguments")
这⾥已经有第⼀个坑了:
问题就出在这个路径这⾥了:
app_path = 'D:\000\msk\test_library\bin\i_'
app = Application().start(app_path)
dlg_test = app[r'测试窗体']
nginx主配置文件路径使⽤如下语句读取名为 ⽂件时,遇到错误 ValueError: embedded null character
if __name__ == '__main__':
fr = open("F:\eclipse_workspace\machine_learning_example\Ch02\trainningDigits\")
for i in range(32):
lineStr = fr.readline()
lineStr = lineStr.strip()
print(lineStr)
pass
1、通过测试,确定错误确实是⽂件读取语句;
2、是否是⽂件中包含null字符呢?⽤ultraedit⼯具⽤16进制形式检查数据⽂件,没有发现有null字符;
3、是否是因为Windows中的编码和python中的编码形式不⼀样造成的呢?查看到⽂件编码为GBK格式,但python是可以正确读取GBK⽂件的,试了其它GBK⽂件,读取没有任何问题;
4、是不是因为⽂件名太长?把数据⽂件放在当前⽂件夹下,尝试读取确实没有问题。但真的是⽂件名太长的原因吗?这时候我才发现⽂件名中有个 ‘\0’ ,才如梦初醒。
注意:⼀般情况下,Python解释器会将遇到的‘\’识别为路径,会⾃动增加⼀个'\'以便和转义字符进⾏区分,但若遇到转义字符则不增
加‘\’。
例如:上述⽂件名将被转换为 F:\\eclipse_workspace\\machine_learning_example\\Ch02\trainingDigits\。因⽽出错。
⽂件路径中若包含‘\0’、'\t' 等特殊转义字符时要特别注意。
推荐⽂件路径写法:
F:/eclipse_workspace/machine_learning_example/Ch02/trainningDigits/ ,斜杠反过来了,这样就不会出现歧义了。
F:\\eclipse_workspace\\machine_learning_example\\Ch02\\trainningDigits\\
如果喜欢⽤000,001,00加英⽂这样的路径,就很容易出这个问题
回到⽂档:
The timeout parameter is optional, it should only be necessary to use if the application takes a long time to start up.
如果上⽂中:start(self, cmd_line, timeout=app_start_timeout)你要打开的程序启动时间特别长,最好设置timeout,这⾥的timeout单位是秒,⽽且不是⽤来防⽌过长的,⽽是防⽌过短的...如果不填写,他⾃⾝带的时间⾮常短,很容易就timeout弹出了。
connect() is used when the application to be automated is already launched. To specify an already running application you need to specify one of the following:
connect()是⽤来连接已经启动的程序的,要连接上需要标志物,可以是⼀下三种参数任意选择:
当有多个进程时可以加不⽌⼀个标志物。
process: (PID)the process id of the application, e.g. app = Application().connect(process=2341)
handle: (句柄)The windows handle of a window of the application, e.g. app = Application().connect(handle=0x010f0c)
path:(路径)The path of the executable of the process (GetModuleFileNameEx is used to find the path of each process and compared against the value passed in) e.g.
app = Application().connect(path=r"c:\windows\")
or any combination of the parameters that specify a window, these get passed to the function. e.g.
或者⽤。
会⽤上⾯这个的不⽤往下看了,我估计⼀时半会⼉都讲不到哪⾥,甚⾄还有太监的可能性。
这⾥⼗分不推荐path,感觉速度⽐较慢,容易报错,原因我还没研究过
app = Application().connect(title_re=".*Notepad", class_name="Notepad")
Note: The application has to be ready before you can use connect*(). There is no timeout or retries like there is when finding the application after start(). So if you start the application outside of pywinauto you need to either sleep or program a wait loop to wait until the application has fully started.
在使⽤connect()前必须要让程序准备好,尤其是那种⽐较复杂的程序,⽽start()⽤前最好保证程序完全关闭,在残留的情况下连接不到进程或者连接到了但是后续的操作没反应就要好好考虑下是不是连接出了问题。
其实start也是会出现⼀些问题,我使⽤的⼀种⽅法是在进程中寻程序,有的话直接返回PID,没有的话就⽤cmd启动应⽤,这主要是解决我的软件的问题,不太清楚是权限还是什么问题,我⽤start会卡在登录加载界⾯,⽽⽤cmd加载出路径然后再启动就没问题,我也不知道为什么。
from pywinauto import Application
import psutil
import os
your_name_path = '000/msk/YOUR_NAME/YOUR_FILE'
cd_your_name_path = 'd: & cd '+your_name_path+' & start '
# 这⾥的d:是盘符,不要问我为什么写的这么怪,被逼⽆奈
def connect_your_name():
your_name_pid = None
centos搭建web服务器for i in psutil.pids():
p = psutil.Process(i)
if str(p.name()) == '':
your_name_pid = i
elif str(p.name()) == '':
your_name_pid = i
if your_name_pid is None:
os.system(cd_your_name_path)
your_name_app = connect_your_name()
else:
your_name_app = Application(backend='uia').connect(process=your_name_pid)
return your_name_app
其实我怀疑
app = Application().start(r"c:\path\to\your\application -a -n -y --arguments")
这⾥的参数是能够解决我的问题的,但是之前我是看别⼈教程尝试的,所以尝试出了这种笨办法,如果有时间我看看能不能解决这⽅⾯的问题再更新。
为什么要重点写写连接程序的问题,因为这⾥是最基本的地⽅,这⾥连接不好,后⾯所有的操作都⽆从谈起。
后⾯还要着重讲的就是Application(backend='win32')和Application(backend='uia'),这⾥也是坑了我好
久
也不知道什么时候再写呢,说不定就太监了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论