首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用UIA后端访问子菜单元素

无法使用UIA后端访问子菜单元素
EN

Stack Overflow用户
提问于 2019-07-05 08:57:53
回答 1查看 220关注 0票数 1

我正在使用来自github的最新pywinauto代码,截止到2019/07/04。

我正在尝试访问一个基于Eclipse的应用程序菜单/子菜单条目。我使用的代码是:

代码语言:javascript
复制
mainwinobj.menu_select("Project->My first menu->my second menu(specific)")

不幸的是,这引发了一个例外:

代码语言:javascript
复制
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中,行

代码语言:javascript
复制
items = menu.items()

返回一个空列表,因此sub_item仍然是空列表。

试用解决方案

我围绕核心解决方案尝试了许多不同的东西,有时会导致正确的行为,但它从来都不是一致的。基本上,我强制搜索窗口,试图找到一个菜单:

代码语言:javascript
复制
        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]

或其他解决办法,如:

代码语言:javascript
复制
        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]

或者我删除了激活:

代码语言:javascript
复制
        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]

但是最后,没有什么是一致的,它有时确实有效,但是当我在我所期望的子菜单条目上得到额外的点击时,它总是失败,因为它会使正确的菜单消失。

EN

回答 1

Stack Overflow用户

发布于 2019-08-14 06:18:30

我找到了解决问题的方法,这个问题是因为,在调用menu_select之前,鼠标指针位于一个与子菜单图形扩展相冲突的位置。

由于某些原因,在选择最后一个子菜单条目之前,系统正在“单击”鼠标所在的位置,最终位于另一个菜单项。

因此,为了避免这个问题,我强制指针指向在调用menu_select之前没有可能操作的位置。

在第二步中,我使用win32作为我必须操作的大多数元素的自动化(更安全、更好地支持)的后端,我只对复杂的元素使用UIA。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56899812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档