让PyWinAuto程序等待弹出窗口的Python代码

0 投票
1 回答
1753 浏览
提问于 2025-04-18 10:07

我有一个用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()

撰写回答