当前位置:   article > 正文

PyWinAuto 自动化(二)

PyWinAuto 自动化(二)

  在 PyWinAuto 自动化(一)中,提高了如何操作应用程序,先获取应用程序对象、然后获取窗口对象、再获取元素对象,最后就可以操作元素(控件)。这里先补充一下控件的相关内容,通过定位拿到控件之后,可以获取相关控件属性,常用方法如下:

  • .wrapper_object():获取控件类型;
  • .window_text():控件标题文字;
  • .class_name():获取控件类名;
  • .element_info.name:控件标题文字;
  • .element_info.class_name:控件类名;
  • .element_info.conrtol_type:控件类型;
  • .get_properties():以字典形式返回控件的属性;

  这些相关属性,可以通过第三方工具直接看到的,这里要介绍一个 dir()方法,传入一个参数:控件/其他方法,就能够查看该控件支持哪些方法,这个很有用,在编写代码的过程中也会经常用到。你拿到一个控件的时候,如果不知道它支持哪些方法,或者你使用的方法报错,可以先看看这个控件是否支持这个方法。

# 应用对象
app = Application(backend="uia").connect(title_re='.*DingTalk.*')
# 查看对象
dlg = app.window(title="DingTalk")
print(dlg.wrapper_object())   ====>> uiawrapper.UIAWrapper - 'DingTalk', Dialog

#控件
ele = dlg.child_window(best_match="Edit2")
ele.click_input()
print(ele.wrapper_object())   ====>> uia_controls.EditWrapper - '', Edit

print(dir(dlg.wrapper_object()))
print(dir(ele.wrapper_object()))

print(dlg.children())
print(dlg.class_name())
print(ele.get_properties())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
app = Application("uia").connect(title="钉钉")
dlg = app.window(title="钉钉")
search = dlg.child_window(title="搜索", control_type="Edit")

print(search.window_text())   #搜索
print(search.element_info.name)   #搜索
print(search.element_info.class_name)
print(search.element_info.control_type)  #Edit
print(dir(search.wrapper_object()))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  控件常用操作

  • .is_dialog():弹窗判断;
  • .dump_tree(depth=None, filename=None):跟上文中的 print_control_identifiers()一样。
  • .scroll(direction,amount,count=1):滚动,direction指定方向:up、down、left、right;amount 滚动行/页:line、page;count:滚动次数。
  • .capture_as_image().save():将控件截图,并保存;
  • .rectangle():获取控件上下左右的坐标;通过 .top、.bottom、.left、.right可以获取某一个具体值。而 .mid_point() 可以得到控件中心点位置;
  • .exists(timeout=None,retry_interval=None):判断控件是否存在,这个经常用到,有些程序的执行会比弹窗渲染快,导致无法获取到控件信息,所以先判断一下再操作。
  • .children_texts():所有子控件文字列表;
  • .set_text():输入文字;
  • .click():点击;
  • .click_input():点击,移动鼠标光标并执行真正的点击;
  • .texts():获取文本内容,就是 Static 部分内容;
  • .type_keys(keys,pause=None,with_spaces=False):键盘输入,底层还是调用 keyboard.send_keys;
    –keys:要输入的内容;
    –pause:每输入一个字符后要等待的时间,默认是 0.01;有些程序有安全校验,输入太快,系统判断非人为,此时,这里可以控制输入的速度;
    –with_spaces:是否保留 kyes 中的所有空格,默认是去除的;
    –也可以输入快捷按键,shift 用+表示,crtl 用 ^ 表示,alt 用 %表示;例如:输入 alt + t +p,可以写成 type_keys(“%TP”)。
    –还可以输入一下特殊按键,比如:空格、退格,type_keys(“{SPACE}”)、type_keys(“{BACKSPACE}”)。

  窗口及控件截图

# 截图-窗口
app = Application(backend="uia").connect(title_re='.*DingTalk.*')
dlg = app.window(title="DingTalk")
pic = dlg.capture_as_image()
pic.save("login.png")

# 截图-控件
ele = dlg.child_window(best_match="Edit2")
pic2 = ele.capture_as_image()
pic2.save("pwd.png")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  菜单及子菜单项操作
  思路就是:先获取到这个菜单项,返回一个对象,然后获取所有的子菜单项,选择一个子菜单。items() 方法可以获取子菜单项,选择子菜单有2种方式:1.通过下标选择;2.通过路径选择。最后通过 click_input() 或 select() 打开子菜单。
  下标选择子菜单:.item_by_index(index)
  路径选择子菜单:.item_by_path(“父菜单->子菜单”)

menus = dlg.child_window(best_match="Menu")
print(menus.items())
print(menus.item_by_index(0))

print(menus.item_by_path("编辑(E)->撤销"))

menus.item_by_path("文件(F)->打印(P)...").click_input()  #点击子菜单;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
m = dlg.child_window(best_match = "Menu")
f = m.item_by_path("文件->打开").select()
  • 1
  • 2

  级联菜单选择
  可以直接通过 menu_select(”一级菜单 -> 二级菜单“),但是,控件本身必须是 Menu;

dlg.menu_select("File -> Export Sessions")
  • 1

  Combox 选项选择
  对于这类下拉选择框,有2种方式选择值:标准操作、点击选择。


# 标准操作,获取到下拉选择框,直接通过 select 选择一个值
dlg.child_window(best_match="ComboBox").select("xxx")

# 点击选择,分步操作,先点击下拉框,再选列表值
dlg.child_window(best_match="ComboBox").click_input()
dlg.child_window(best_match="cURL Script").click_inpit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  文件对话框
  可以直接定位文件,输入文件名,保存;

dlg.child_window(title="文件名",control_type="Edit").set_text("xxx")
dlg.child_window(title="保存(S)").click_input()
  • 1
  • 2

  TabControl 选项卡
  选项卡通常是一组,所以先定位选项卡组,在选择某个Tab;

dlg.child_window(best_match="TabControl").select("xxx")
  • 1

  上传文件窗口
  上传文件就是打开一个窗口,然后去指定的目录路径下选择指定的文件,然后确定,所以,没有特殊操作。但是,要注意,Application 对象只能控制一个进程实例,当你打开一个上传文件窗口时,相当于又开了一个进程,所以,要使用 Desktop() 获取应用程序对象。

app2 = pywinauto.Desktop()
dlg2 = app2.window(title="打开")
dlg2.child_window(title_re=".*地址:.*").click_input()   点击地址栏
SendKeys("{BACKSPACE}")  删除;
  • 1
  • 2
  • 3
  • 4

  鼠标操作

  • click(coords=(x,y)):单击鼠标,传入一个坐标;
  • double_click(coords=(x,y)):双击;
  • right_click():右击鼠标;
  • wheel_click():点击鼠标中间的按钮,有的鼠标没有;
  • press():按下鼠标;
  • repleace():释放鼠标;
  • move():移动鼠标;
  • scroll(coords=(x,y),wheel_dist=1):滚动鼠标,传入鼠标滚动的位置;wheel_dist 是滚动次数。

  窗口等待
  这个就是等窗口出现再操作窗口里面的控件,有时脚本执行的快,窗口还没出现,所以会报错,这就要提 wait()、wait_not()。
  wait(wait_for, timeout=None, retry_interval=None),等待窗口处于某个状态;

wait_for等待的状态;exists:表示该窗口是有效的句柄;visible:表示该窗口未隐藏;enabled:表示未禁用窗口;ready:表示该窗口可见并启用;active:表示该该窗口处于活动状态;
timeout超时时间;
retry_interval重试时间间隔;

  wait_not(wait_for, timeout=None, retry_interval=None),等待窗口处于某个状态;

new_dlg = dlg.child_window(best_match="新建标签")
new_dlg.wait(wait_for="ready",timeout=5,retry_interval=1)  # 等待窗口出现
new_dlg.click_input()  #重新获取焦点
SendKeys("nihoa")

chat = dlg.child_window(control_type = "Document",class_name="Chrome_RenderWidgetHostHWND")  #获取聊天窗口;
chat.wait("ready",10,1)  #等待聊天窗口
chat.print_control_identifiers()  #聊天窗口加载完成后打印结构
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  到这里,控件的属性、操作,以及不同场景的操作都介绍完了,当然,这不是全部,好多功能不能一一讲解,大家有其他疑问,尤其是键盘操作那块,可以参考 pywinauto 中文文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/121326
推荐阅读
相关标签
  

闽ICP备14008679号