2017-03-21 14 views
1

pywinautoを使用している個人用プロジェクトのサードパーティアプリケーションを自動化しています。 pywinautoがdialog.Existに対してTrueを返すような奇妙な問題に直面していますが、ダイアログは実際には見えません。その結果、コードはTrueを返すので、ダイアログのさらなるアクションは失敗します。アプリケーションがダイアログなどをキャッシュしていると思います。これをどう対処するか分かりません。ここでPywinauto Windowsが存在しますが可視ではありません

app = Application().connect(path = "D:/myapp/Trader.exe") 
existFlag = app.window_(title ="Trader - 23506").Exists(timeout =2) 
print existFlag #Returns True 
if(existFlag): 
    app.window_(title ="Trader - 23506").Close() #Fails 

は出力

**True** 
Traceback (most recent call last): 
    File "myauto.py", line 792, in <module> 
    app.window_(title ="Trader - 23506").Close() 
    File "C:\Python27\lib\site-packages\pywinauto\application.py", line 357, in __getattribute__ 
    ctrls = self.__resolve_control(self.criteria) 
    File "C:\Python27\lib\site-packages\pywinauto\application.py", line 239, in __resolve_control 
    raise e.original_exception 
pywinauto.findwindows.ElementNotFoundError: {'process': 12964, 'backend': u'win32', 'title': 'Trader - 23506'} 

答えて

1

はい、Win32アプリケーションが表示されていない既存のウィンドウを持つことができます。可視性をチェックするには、この呼び出すことができます。

visible = app.window(title ="Trader - 23506").is_visible() 

するか、(〜50%の症例で失敗したり、既存のウィンドウを右.exists(...)呼び出しの後に消えている場合)には、タイミングの問題かもしれません。ダイアログを閉じて処理する別の方法は次のとおりです。

dlg = app.window_(title ="Trader - 23506") 
try: 
    dlg.wait_not('visible', timeout=2) 
except Exception: # or timings.TimeoutError 
    dlg.close() 
+0

タイミングの問題ではありません。しかし、あなたの回避策とis_visible()チェックは、次のような回避策をとるのに役立ちました: dlg = app.window_(title = "Trader - 23506") try: \t if(dlg.Exists()およびdlg.wait_not '目に見える'、タイムアウト= 1)): \t \tプリント( "ダイアログが存在するかもしれないが、見えない") 除く: \tプリント( "ダイアログが存在し、可視") \tプリント(traceback.print_exc()) –

関連する問題