我正在使用pywinauto(新github中的最新版本)来自动登录到另一个程序。 “登录”窗口有一堆按钮和两个字段,一个用于用户名,另一个用于密码。
我的问题是用户名和密码'edit'控件标识符具有相同的Access名称:['1','0','Edit']。没有“Edit2”。
当我使用
时sign_in.print_control_identifiers()
它仍然只显示一个编辑属性。如何访问其他编辑控件?
使用演示公司文件更新图片:
这是登录窗口:http://imgur.com/VwS9w0b
鼠标悬停在密码上方:http://imgur.com/6HWQVlZ
点击密码字段,它也称为edit1! http://imgur.com/GUnTVrK
Swapy输出:http://imgur.com/LJB99y1
我找到的解决方案是模拟“标签”键
sign_on.TypeKeys("{TAB}")
但这不是一个很好的解决方案,因为如果另一个窗口在TAB时关注,那么脚本会将标签发送到该窗口。
答案 0 :(得分: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)
答案 1 :(得分:0)
Edit0
和Edit1
指的是同一个第一个编辑框。它的预期行为(按设计)。 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