我正在使用来自github的最新pywinauto代码,截止到2019/07/04。
我正在尝试访问一个基于Eclipse的应用程序菜单/子菜单条目。我使用的代码是:
mainwinobj.menu_select("Project->My first menu->my second menu(specific)")不幸的是,这引发了一个例外:
Traceback (most recent call last):
File <MYPATH>\pywinauto\controls\uia_controls.py", line 1073, in item_by_path
menu = next_level_menu(menu, menu_items[i], items_cnt == i + 1)
File "<MYPATH>\pywinauto\controls\uia_controls.py", line 1053, in next_level_menu
return self._sub_item_by_text(parent_menu, item_name, exact, is_last)
File "<MYPATH>\pywinauto\controls\uia_controls.py", line 1017, in _sub_item_by_text
self._activate(sub_item, is_last)
File "<MYPATH>\pywinauto\controls\uia_controls.py", line 984, in _activate
if not item.is_active():
AttributeError: 'NoneType' object has no attribute 'is_active'尽管如此,我可以看到它在My first menu上正确地点击了,但是在第二个上却没有。
我也得到了一个不一致的行为,有时我可以看到它错误地单击位于My first menu上方的子菜单,在正确单击My first menu之后,导致正确的子菜单从屏幕上消失。异常仍然会发生,这并没有改变,但它影响了我尝试过的解决方法,如下所述。
根目录导致问题
我很快就能够理解问题的根本原因:在_sub_item_by_text中,行
items = menu.items()返回一个空列表,因此sub_item仍然是空列表。
试用解决方案
我围绕核心解决方案尝试了许多不同的东西,有时会导致正确的行为,但它从来都不是一致的。基本上,我强制搜索窗口,试图找到一个菜单:
if not menu.items():
print("waiting for menu " + menu.window_text())
time.sleep(1)
menus = menu.top_level_parent().children(control_type="Menu", title=menu.window_text())
print(menus)
menu = menus[0]或其他解决办法,如:
if not menu.items():
print("waiting for menu " + menu.window_text())
self._activate(menu, False)
timings.wait_until(
timings.Timings.window_find_timeout,
timings.Timings.window_find_retry,
lambda: len(self.top_level_parent().descendants(control_type="Menu", title=menu.window_text())) > 0)
menus = menu.top_level_parent().children(control_type="Menu", title=menu.window_text())
print(menus)
menu = menus[0]或者我删除了激活:
if not menu.items():
print("waiting for menu " + menu.window_text())
timings.wait_until(
timings.Timings.window_find_timeout,
timings.Timings.window_find_retry,
lambda: len(self.top_level_parent().descendants(control_type="Menu", title=menu.window_text())) > 0)
menus = menu.top_level_parent().children(control_type="Menu", title=menu.window_text())
print(menus)
menu = menus[0]但是最后,没有什么是一致的,它有时确实有效,但是当我在我所期望的子菜单条目上得到额外的点击时,它总是失败,因为它会使正确的菜单消失。
发布于 2019-08-14 06:18:30
我找到了解决问题的方法,这个问题是因为,在调用menu_select之前,鼠标指针位于一个与子菜单图形扩展相冲突的位置。
由于某些原因,在选择最后一个子菜单条目之前,系统正在“单击”鼠标所在的位置,最终位于另一个菜单项。
因此,为了避免这个问题,我强制指针指向在调用menu_select之前没有可能操作的位置。
在第二步中,我使用win32作为我必须操作的大多数元素的自动化(更安全、更好地支持)的后端,我只对复杂的元素使用UIA。
https://stackoverflow.com/questions/56899812
复制相似问题