1

我正在使用 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 时获得焦点,那么脚本会将选项卡发送到该窗口。

4

2 回答 2

2

我不确定您使用的是哪个版本的 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)
于 2015-06-07T09:40:50.210 回答
0

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

于 2015-06-08T10:38:28.937 回答