pywinauto.findwindows.WindowNotFoundError 在 pywinauto 中

pywinauto.findwindows.WindowNotFoundError in pywinauto

我是pywinauto新手,刚开始学习。我已经在本地 32 位 Windows 7 OS 中安装了带有 pip 的 pywinauto。 所以,我有这个示例代码可以在 chrome 浏览器中打开 URL。

from pywinauto import application
app=application.Application()
app.start(r'C:\Program Files\Google\Chrome\Application\chrome.exe')
app.window_(title='New Tab')
app.window_().TypeKeys('{F6}')
app.window_().TypeKeys('{ESC}')
app.window_().TypeKeys('www.facebook.com')

在 运行 上,它抛出错误:

Traceback (most recent call last):
File "pywinauto_nil.py", line 6, in <module>
app.window_().TypeKeys('{F6}')
File "C:\Python27\lib\site-packages\pywinauto\application.py", line 252, in    
__getattr__
    ctrls = _resolve_control(self.criteria)
File "C:\Python27\lib\site-packages\pywinauto\application.py", line 758, in _resolve_control
    raise e.original_exception
pywinauto.findwindows.WindowNotFoundError

我用谷歌搜索,但找不到任何有用的解决方案。

我哪里错了?

完整的答案会很长很复杂。从你的小问题开始吧。

  1. Chrome 生成了几个未与 app 对象连接的进程。解决方案:使用 Application(backend="uia").connect(title='New tab')(或 title_re 或任何可能的 find_windows)。

  2. 更大的问题是默认backend="win32"(或pywinauto 0.5.4及之前版本)无法检测和处理Chrome控件。 MS UI 自 0.6.0 以来引入了自动化支持。顺便说一下,pywinauto/UIA 可以以一种与进程无关的方式处理顶级 windows:Desktop(backend='uia').NewTab.type_keys('some_URL')

  3. 关于 Chrome 的更多详细信息。它默认不启用 UIA 支持。 To enable UIA accessibility 它必须 运行 所以:chrome.exe --force-renderer-accessibility。尽管 UIFirefox 和 Opera 默认启用了一种模式。

最后,pywinauto 并不是专门为 Web 自动化设计的。现在它可能与 Selenium 结合使用。

补充 Vasily 所说的内容:

这里可能还有其他问题。

如果您的 Chrome 启动速度太慢,连接可能会丢失。

我认为这在启动方法中有某种规定,但由于 chrome 启动多个进程可能会导致问题。

我建议你使用 Python 的模块 "webbrowser" 启动 Chrome,然后尝试使用 pywinauto 连接它。

如果我没记错的话,有一个选项可以等待 window 出现。只需指定超时。否则尝试在一个确定的循环中连接,并在尝试之间进行一些休眠。

它可能有效,也可能无效,取决于是否需要 UIA 支持。如果是,您必须启动 Chrome 支持 UIA。