pywinauto:从MS Edge Canary地址栏中获取URL

问题描述

我使用pywinauto从Chrome浏览器的地址栏中获取URL地址没有任何问题。我“应该”能够以相同的方式从Microsoft Edge Canary浏览器中获取URL。但是,似乎有些事情阻止pywinauto抓取URL。导致其超时并产生后续异常。

代码:

from pywinauto import Application

app = Application(backend='uia')
app.connect(title_re=".*Microsoft​ Edge.*",found_index=0)

captionsearch = Application().connect(title_re=".*Microsoft​ Edge.*",found_index=0)
caption = captionsearch.windows(title_re=".*Microsoft​ Edge.*",found_index=0)
caption = str(caption)

dlg = app.top_window()
url = dlg.child_window(title="Address and search bar",control_type="Edit").get_value()

错误:

Traceback (most recent call last):
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\application.py",line 258,in __resolve_control
    criteria)
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\timings.py",line 458,in wait_until_passes    
    raise err
pywinauto.timings.TimeoutError

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "d:/OneDrive/Dev/Projects/Python/Share-URL-Edge.py",line 42,in <module>
    url = dlg.child_window(title="Address and search bar",control_type="Edit").get_value()
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\application.py",line 379,in __getattribute__
    ctrls = self.__resolve_control(self.criteria)
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\application.py",line 261,in __resolve_control
    raise e.original_exception
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\timings.py",line 436,in wait_until_passes
    func_val = func(*args,**kwargs)
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\application.py",line 222,in __get_ctrl
    ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria))
  File "C:\Users\micha\AppData\Local\Programs\Python\Python37\lib\site-packages\pywinauto\findwindows.py",line 87,in find_element
    raise ElementNotFoundError(kwargs)
pywinauto.findwindows.ElementNotFoundError: {'title': 'Address and search bar','control_type': 'Edit','top_level_only': False,'parent': <uia_element_info.UIAElementInfo - 'pywinauto: URL from MS Edge Canary Address Bar - Stack Overflow and 1 more pare page - Personal - Microsoft​ Edge',Chrome_WidgetWin_1,1510144>,'backend': 'uia'}

我可以通过更改以下行来使其工作:

url = dlg.child_window(title="Address and search bar",control_type="Edit").get_value()

收件人:

url = dlg.child_window(control_type="Edit",found_index=0).get_value()
if url == "":
    url = dlg.child_window(control_type="Edit",found_index=1).get_value()
if url == "":
    url = dlg.child_window(control_type="Edit",found_index=2).get_value()
if url == "":
    url = dlg.child_window(control_type="Edit",found_index=3).get_value()

但是,这是一种糟糕的方法。而且,在某些情况下它不起作用。我非常感谢具有pywinauto经验的人,可以帮助我以正确的方式进行操作。

PS:使用inspect.exe来解决此问题没有太多运气。据我所知,Edge Canary和Google Chrome浏览器都使用元素名称Address and search bar。但是,它仅不适用于Edge Canary浏览器。

解决方法

无论站点是否安全,此代码似乎都可以工作:

app = pywinauto.Application(backend='uia')
app.connect(title_re=".*Microsoft​ Edge.*",found_index=0)
dlg = app.top_window()
wrapper = dlg.child_window(title="App bar",control_type="ToolBar")
url = wrapper.descendants(control_type='Edit')[0]
print(url.get_value())

即使此修补程序起作用,也最好直接转到“地址和搜索栏”元素。如果这样做不起作用,则应在https://github.com/pywinauto/pywinauto/issues

中报告此问题

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...