【问题标题】:PywinAuto and the disappearing control IdentifierPywinAuto 和消失的控件标识符
【发布时间】:2015-06-07 04:59:56
【问题描述】:

我正在使用 pywinauto(来自新 github 的最新版本)自动登录到另一个程序。 “登录”窗口有一堆按钮和两个字段,一个是用户名,一个是密码。

我的问题是用户名和密码“编辑”控件标识符具有相同的访问名称:['1','0','Edit']。没有“Edit2”。

当我使用时

sign_in.print_control_identifiers()

它仍然只显示一个编辑属性。如何访问此其他编辑控件?

使用演示公司文件更新图片:

这里是登录窗口:http://imgur.com/VwS9w0b

鼠标悬停在密码上:http://imgur.com/6HWQVlZ

密码字段被点击,它也被称为edit1! http://imgur.com/GUnTVrK

交换输出:http://imgur.com/LJB99y1

我找到的一个解决方案是模拟“tab”键

  sign_on.TypeKeys("{TAB}")

但这不是一个很好的解决方案,因为如果另一个窗口在 TAB 时获得焦点,那么脚本会将选项卡发送到该窗口。

【问题讨论】:

    标签: python windows python-3.x pywin32 pywinauto


    【解决方案1】:

    我不确定您使用的是哪个版本的 Pywinauto。 GitHub 上有一个恢复的(https://github.com/pywinauto/pywinauto)。您可以将控件作为字典的元素来访问:

     sign_in['0']
     sign_in['1']
    

    突出显示一个 GUI 元素也有助于理解您所指的元素:

    sign_in['0'].DrawOutline() # green by default
    sign_in['1'].DrawOutline('red') # acceptable keywords: 'red','blue','green'
    sign_in['Edit'].DrawOutline(0xff0000)   # blue
    

    通过遍历所有控件的子级并突出显示它们的示例来更新答案。这样您就可以查看您是否可以访问“密码”字段。

    import time
    def drawContours(ctl):
        for c in ctl.Children():
            drawContours(c)
            time.sleep(1)
            c.DrawOutline()
        ctl.DrawOutline()
    
    drawCountours(sign_in)
    

    【讨论】:

    • 我已经尝试过类似的方法。 sign_in['0'] 和 sign_in['1'] 都指向同一个编辑框,即登录名。只有当您手动向下选项卡时,编辑才会参考密码。我可以使用 {TAB} 下来,但这并不能解释这种行为。
    • 正如@vasily 在下面指出的,尝试使用sign_in['Edit2'] 访问它。如果它不起作用,则可能您的第二个编辑框不在“登录”层次结构下。
    • 我认为您需要提供更多详细信息。请使用您的代码及其输出的摘录更新您的问题。当您放置标签“python-3.x”时,我猜它正在运行 python 3。我说得对吗?
    • 您是否尝试过使用 Spy++ 或 Inspect 工具来查看控件层次结构?检查还应显示“FrameworkId”属性(如此处:i.stack.imgur.com/9dzfb.png)。如果不是“Win32”,请告诉我们。
    • 是的,Python 3。我使用了 Autoit window spy 和 SWAPY,并且我已经用屏幕截图更新了原始帖子。我实际上没有看到列出了 FrameworkID 的字段。
    【解决方案2】:

    Edit0Edit1 指的是同一个第一个编辑框。这是预期的行为(按设计)。 Edit2 指第二个编辑框,Edit3 指第三个编辑框,依此类推。如果你得到 print_control_identifiers() 输出,你通常会看到类似的内容(例如,记事本中的“查找”对话框):

    Edit - ''   (L152, T160, R323, B180)
        'Edit' 'Edit0' 'Edit1' 'Fi&nd what:Edit' ()
    
    Edit - ''   (L152, T188, R323, B208)
        'Edit2' 'Re&place with:Edit' ()
    

    因此,每个控件都列出了best_match 搜索算法的可能名称。这些名称试图唯一(不与其他控件重叠),但一个控件有多个最佳名称。这是正常情况。 sign_in['Edit2'] 可能是你需要的。

    如果您不同意这种方法,您可以在这里提出设计讨论:https://github.com/pywinauto/pywinauto/issues

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多