pywinauto运用实例图文详解

博主废话有点多,讲得可能有些太细了。

然后这个是在windows中的运用,其他系统我没试过不知道。。

然后有两个例子,第二个是记事本的想了下,你们不一定有vscode,但是记事本都有,你可以试着操作下。。。

pywinauto的安装这里就不做说明了
命令安装

pip install --upgrade pywinauto

pywinauto手动下载的地址点击这里 

这里再分享一个我用来查找元素的工具spy++中文版的,我找了挺久还,就分享给你们了。

链接:https://pan.baidu.com/s/1B0yXHCXF9mhtZzVlrEF3PA 
提取码:8pf7

好了开始进行正文
首先需要引入pywinauto

from pywinauto import Application  # 导包

然后找到你需要启动的软件的地址,个人习惯是用地址启动,也可以用标题呀,类什么的,我只是觉得地址比较好找。
我测试执行用的是vscode,其实我是个小前端。。
这是我vscode的地址路径,如果是路径启动的话一定要找到他的.exe启动程序的地址,例子如下:

app = Application().start(r"F:\Microsoft VS Code\Code.exe")

上面这个命令输入之后就执行项目,他就会启动,下面就是我启动的vscode这个程序。

pywinauto的desktop有哪些方法_Code


然后使用文章顶顶推荐的工具查找启动的程序的标题,工具使用呢就是解压压缩包然后进行如下截图操作:

我电脑是64位的就双击这个spyxx_amd64.exe程序就行了

pywinauto的desktop有哪些方法_Code_02

出现这个界面,图片会不会有点模糊?应该能看清楚吧

pywinauto的desktop有哪些方法_Visual_03


这里按照图上的操作就行,一直按住鼠标左键拖拽到你刚才通过上面的start启动打开了的程序界面上,然后松开鼠标点击确定。

pywinauto的desktop有哪些方法_Visual_04


然后它就会定位到这个窗口,鼠标移到定位的窗口上,就是下面箭头指向的那个窗口,点击鼠标右键,弹出一些选项,点击属性选项

pywinauto的desktop有哪些方法_Visual_05


这里你会发现窗口标题是空的,似乎不是我们需要的窗口,然后我们点击窗口这一项,然后发现它有一个父窗口标题与我们打开的vscode程序标题相同,ok这个就是我们需要的,如果不确定也没关系试一下又不会出现什么问题,在摸索阶段就是要多尝试,错了无非就是报错嘛,然后你就知道不是这个title。。。然后。。。换一个继续尝试就是。。。。

pywinauto的desktop有哪些方法_Code_06


pywinauto的desktop有哪些方法_另存为_07


pywinauto的desktop有哪些方法_Visual_08


然后找到title后就继续写代码了,最好用一个sleep方法让它延迟一两秒再链接,因为有的程序会出现你启动了,但是当时链接不上,需要一两秒之后才行,为什么会这样具体的我忘了,大概意思就是这样。。。感兴趣的话你可以自己查一下。

这里有一个点需要注意,只能同时存在一个该程序启动,意思就是以我的vscode为例,如果你打开了两个它就会报错,或者说你在有一个vscode打开的时候执行这个项目它就会报错,懂?

time.sleep(2)
    # 绑定进程,class_name和title是可选的,可以灵活使用,如果找到多个或没有找到该程序,程序会报错
app = Application().connect(title="欢迎使用 - Visual Studio Code")

这上面的title是根据文章顶顶推荐的工具查找的,你如果使用的其他什么工具也行反正需要找到他的title或者class_name都行,我比较习惯用title个人意愿了这个就是。

这里补充一点,如果你打开的窗口里发现父窗口也是空,你就把这个属性弹窗×掉,然后再观察刚才定位的那个窗口,你就去找他的子窗口,父窗口,爷爷窗口,他的老祖宗窗口,看能不能找到,记住类名也是可以的不是一定要标题,如果都找不到咋办?凉拌,告辞了,等死吧,没救了,你去另寻高明,在下实在是束手无策了呀

pywinauto的desktop有哪些方法_Visual_09


好了继续,不废话了,对了,刚才的代码别忘了整,到目前为止流程的所有代码给你整一哈,你就执行就对了

from pywinauto import Application  # 导包
import time
def pywinauto_task():  # 定义一个自动化任务的函数
    app = Application().start(r"F:\Microsoft VS Code\Code.exe")
    time.sleep(2)
    # # 绑定进程,class_name和title是可选的,可以灵活使用,如果找到多个或没有找到该程序,程序会报错
    app = Application().connect(title="欢迎使用 - Visual Studio Code")
    
if __name__ == '__main__':  # 执行此函数
    pywinauto_task()

怎么看上面是否执行成功,这个就是,你要操作的程序成功启动了,然后控制台没报错。

然后就看你需要什么操作,我这里就演示下创建一个文件输入代码保存的操作吧。然后,最后面再给你们整一个操作记事本的,这样你也可以试一下。

首先根据打开的页面他有一行菜单栏对吧

pywinauto的desktop有哪些方法_Code_10


根据你需要的操作选择,我这里需要创建文件,就是如下代码

app["欢迎使用 - Visual Studio Code"].type_keys('%F^N{ENTER}')

这个.type_keys()是他自带的方法不是我自己定义的哈,我没那么厉害。这里的应用你可以理解为用这个.type_keys()来执行括号内的命令,这是我的理解哈,原本啥子意思不太懂他们的解释都是在输入框输入文本。。
这里再解释下括号里的内容,首先%F是键盘快捷alt+F的意思,%就表示alt;^N是ctrl+N的意思,最后的{ENTER}就是enter的意思,懂?
如果还是不懂为什么我要这么写,你就在你试验的时候先像下面一样先执行,然后再添加一个^N再执行,特别提醒这里的键盘快捷是根据我的程序来的,你自己要操作什么程序就是什么快捷,别憨憨的哈

app["欢迎使用 - Visual Studio Code"].type_keys('%F')

还有哪些键盘操作?嘿嘿,给你们个截图,我在别人博客借的?点这里就是这位老哥的博客,感谢下老哥。

pywinauto的desktop有哪些方法_另存为_11


pywinauto的desktop有哪些方法_另存为_12


上面的代码执行完就是这个结果,新建了一个文件夹

pywinauto的desktop有哪些方法_另存为_13


执行完之后,发现窗口标题变了,然后用上面spy++工具去查找,我就不重复了,比较懒。

pywinauto的desktop有哪些方法_Visual_14


找到之后就写内容吧,注意标题变了哟,别忘了改

哦~这里.type_keys()里面为什么是字符串?

因为上面我应该说了一句这个方法是用来在输入框里输入文本的,所以,懂?意思就是你括号里的内容是上面的那些键盘或者鼠标快捷的时候,他就是执行那些操作,是其他字符串的时候就是输入文本。

app['Untitled-1 - Visual Studio Code'].type_keys('测试')

然后执行

执行完好你发现窗口title又变了。。。。

特别提醒一下一定要用复制的方法,不要手动输入title有的时候容易整漏了。。。或者敲错了

pywinauto的desktop有哪些方法_Visual_15

app['● 测试 - Visual Studio Code'].type_keys('%F^A')

这里就弹出了选择保存文件路径

pywinauto的desktop有哪些方法_Code_16


一样的做法有了新窗口使用spy++查找窗口,然后修改文件名如下

app['另存为'].type_keys('测试.txt')

这里你可能会问,为什么这里会直接就是在文件名这块输入文本?
呵呵~
你如果观察仔细点会发现,你弹出这个保存窗口的时候,文件名这个输入框是选中状态的,所以,就不想解释了,我废话有点太多了。。。

这里为什么多了一个[‘保存(&S)’],因为我发现他是一个的窗口,还是[‘另存为’]的子窗口,我怎么知道的?别问,问就是spy++工具
然后.click()就是点击,一般适用于button按钮。我猜测.type_keys(‘ENTER{}’)也行,果然试了下果然可以,我可真是个小机灵鬼

app['另存为']['保存(&S)'].click()

好了,保存也做完了。
最后就退出吧,然后你发现窗口title又变了。。。真滴烦,去工地找工作去了
算了,继续吧,我热爱编程???
这里try一下因为不确定你是否保存过同名文件。别问问就是去找窗口title

try:
        app['确认另存为']['是'].click()
    except:
        app['测试.txt - Visual Studio Code'].type_keys('%F^X')
    else:
        app['测试.txt - Visual Studio Code'].type_keys('%F^X')

完整代码:

from pywinauto import Application  # 导包
import time

def pywinauto_task():  # 定义一个自动化任务的函数
    app = Application().start(r"F:\Microsoft VS Code\Code.exe")
    time.sleep(2)
    # 绑定进程,class_name和title是可选的,可以灵活使用,如果找到多个或没有找到该程序,程序会报错
    app = Application().connect(title="欢迎使用 - Visual Studio Code")
    app["欢迎使用 - Visual Studio Code"].type_keys('%F^N{ENTER}')
    app['Untitled-1 - Visual Studio Code'].type_keys('测试')
    app['● 测试 - Visual Studio Code'].type_keys('%F^S')
    app['另存为'].type_keys('测试.txt')
    app['另存为']['保存(&S)'].type_keys('{ENTER}')
    try:
        app['确认另存为']['是'].click()
    except:
        app['测试.txt - Visual Studio Code'].type_keys('%F^X')
    else:
        app['测试.txt - Visual Studio Code'].type_keys('%F^X')
        
if __name__ == '__main__':  # 执行此函数
    pywinauto_task()

再提醒一下随时注意窗口的title变化

wdnmd终于完了。。我裂开了 万恶的记事本就贴下代码,不想解释了,太多记事本的例子了,看不懂问我,看见就会回,但你问的我不一定会,嘿嘿~

from pywinauto import Application
import time

app = Application().start("notepad.exe")
time.sleep(1)
app = Application().connect(class_name="Notepad")
app['无标题 - 记事本'].type_keys('测试')
app['无标题 - 记事本'].menu_select("文件->保存")
app['另存为'].type_keys('测试.txt')
dlg_spec = app['另存为']
app['另存为'].type_keys('%T{DOWN}{DOWN}{ENTER}')#选择文件类型保存
app['另存为']['保存(&S)'].type_keys('{ENTER}')
try:
    app['确认另存为']['是'].click()
except:
    app['测试.txt - 记事本'].type_keys('%F^X')
else:
    app['测试.txt - 记事本'].type_keys('%F^X')