0

我有一个使用 PyWinAuto 自动化应用程序的 Python 2.7 脚本。在应用程序的某一时刻,它会停止并长时间执行某项操作……有时 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 新手,但我知道必须有一种更智能、更可靠的方法来实现这一目标……有什么想法吗?

4

1 回答 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()
于 2014-07-01T19:06:18.120 回答