让PyWinAuto程序等待弹出窗口的Python代码
我有一个用Python 2.7写的脚本,使用PyWinAuto来自动化一个应用程序。在这个应用程序的某个环节,它会去做一些事情,时间不定……有时候是15秒,有时候可能长达2分钟……每次都不一样。
一旦这个过程完成,就会弹出一个对话框,我希望PyWinAuto能够继续执行后面的操作。所以,我想让程序等待并检查这个弹出的对话框是否出现。当它出现时,我就想跳出这个循环。下面是实现这个功能的代码:
all_done = 1
while all_done != 1:
try:
app.Phazer.Static2.Texts() == [u'Would you like to Store Results?']
all_done = 1
break
except:
print("Testing...")
time.sleep(2)
..rest of the code..
不过,80%的情况下,它每次都能正常工作……但有时候,PyWinAuto会提前跳出循环,去处理那个还没有出现的弹出对话框。
我刚开始学Python,但我知道一定有更聪明、更可靠的方法来解决这个问题……有没有什么建议?
1 个回答
1
我能想到的唯一情况是,app.Phazer.Static2 有时会和其他控件匹配上。
app.Phazer.Static2 相当于 app.Phazer.ChildWindow(best_match='Static2')。在 pywinauto 中使用的最佳匹配算法可能会捕捉到其他名字相似的静态文本。
比较运算符 == 不会引发任何异常,所以你可能会得到错误的静态文本,它会返回 False,什么都不做,all_done = 1,然后跳出循环。就这样。
你可以使用以下代码来确保你连接的是正确的控件:
app.Phazer.ChildWindow(class_name='Static', ctrl_index=1)
或者
app.Window_(title='Phazer', class_name='#32770').ChildWindow(class_name='Static', ctrl_index=1)
如果你对捕捉对话框有疑问的话。
所以最终的检查应该是
if app.Phazer.ChildWindow(class_name='Static', ctrl_index=1).Texts() != [u'Would you like to Store Results?']:
raise Exception()