我有一段 pywinauto 代码,它试图从 ItemList 中删除一个 Item。有时 type_keys() 不起作用,就好像窗口失去焦点一样。有趣的是,如果我单击运行 python 代码的命令提示符窗口,这会突然触发代码正确设置应用程序的焦点并继续运行。
以下是这些步骤的概述:
- 在特定应用程序中打开一个 Open Diaglog 窗口
(此处为 Tradestation 的开发环境) - 从 ItemList 中选择一个项目
- 键入 DELETE 键(弹出确认窗口)
- 在确认窗口中选择“是”
大多数情况下,此序列都有效,除了偶尔(可能每 5 次左右尝试中的 1 次)它会在没有发生 DELETE 键按下的情况下失败。该项目被选中,但窗口出现失焦(或看起来如此)。
我一直在追逐这个问题几天/几周,尝试各种不同的东西,即增加延迟,调整超时,调整 pywinauto.Timings.fast/slow,尝试在各个地方设置焦点等等......我也把代码放入一个无限的“while”循环,希望它能在后续尝试中起作用。
有趣的是,当它卡住时,如果我单击运行 python 应用程序的 Windows 命令提示符窗口,然后突然打开对话框框重新聚焦并继续成功运行。
我正在寻找有关根本原因的建议或我可以尝试的其他方法。
这是代码结束的地方:
strategy = self.window.child_window(title=name, control_type='ListItem')
Timings.slow()
while True:
# Issues where delete/confirm window not showing
# Try solving with SetFocus in case the open diag is going out of focus
_logger.info("Set focus")
handle = win32gui.FindWindow(None, OPEN_DLG_TITLE)
win32gui.SetForegroundWindow(handle)
# Highlight the strategy
_logger.info("Select Strategy")
strategy.select()
if strategy.is_selected() == 0:
time.sleep(2)
continue
_logger.info("Strategy selected")
# Delete it...
_logger.info("Type DELETE")
#strategy.type_keys('{DELETE}')
strategy.type_keys('{DELETE}', set_foreground=False)
# Delay in case return comes back too quickly
time.sleep(2)
# Click 'Yes' in Confirmation Window
_logger.info("Check confirmation window")
confirm_window = self.window.child_window(
title="Confirm file removal",
control_type="Window"
)
if confirm_window.exists() is False:
try:
_logger.info('... does not exist. Briefly wait 5 seconds')
confirm_window.wait('exists', timeout=5)
except pywinauto.timings.TimeoutError:
#breakpoint()
_logger.info('---- Retrying -----')
continue
assert confirm_window.exists() is True
break
Timings.fast()