定位和操作元素执行效率讨论_PC客户端自动化测试

初识PC自动化,就在登录这里卡住了。以下两种方法,请问那种方法执行效率更高?
C仙人说是第二种。NO,第一种方法执行时间少了一半左右呢。请问是什么原因?还有执行效率更高的写法吗?求分享
方法1:

    app = Application(backend="uia").connect(process=process_id)
    window = app.window(title="登录到全部行情主站")
    a=time.time()
    children = window.descendants()
    for child in children:
        if child.element_info.automation_id == "1001":
            child.set_focus()
            child.set_edit_text(username)

        if child.element_info.automation_id == "21812":
            child.set_focus()
            child.set_edit_text(password)

        if child.element_info.name == "登 录":
            child.click()

方法2:

app = Application(backend="uia").connect(process=process_id)
window = app.window(title="登录到全部行情主站")
#window.print_control_identifiers()

child=window.child_window(auto_id="21795", control_type="ComboBox")
child1=child.child_window(auto_id="1001", control_type="Edit")
child1.set_edit_text(username)
child2=window.child_window(auto_id="21812", control_type="Edit")
child2.set_edit_text(password)
child3=window.child_window(title="登 录", auto_id="1", control_type="Button")
child3.click()

以下是window的层级关系


Pane - '登录到全部行情主站'    (L830, T441, R1730, B1086)
['登录到全部行情主站', 'Pane', '登录到全部行情主站Pane']
child_window(title="登录到全部行情主站", control_type="Pane")
   | 
   | ComboBox - ''    (L960, T798, R1335, B848)
   | ['ComboBox打开', 'ComboBox', 'StaticComboBox']
   | child_window(auto_id="21795", control_type="ComboBox")
   |    | 
   |    | Edit - ''    (L1008, T806, R1305, B841)
   |    | ['Edit', 'StaticEdit', 'Edit0', 'Edit1', 'StaticEdit0', 'StaticEdit1']
   |    | child_window(auto_id="1001", control_type="Edit")
   |    | 
   |    | Button - '打开'    (L1311, T800, R1334, B847)
   |    | ['打开Button', 'Button', '打开', 'Button0', 'Button1']
   |    | child_window(title="打开", auto_id="DropDown", control_type="Button")
   | 
   | Edit - ''    (L960, T855, R1335, B900)
   | ['Edit2', 'StaticEdit2']
   | child_window(auto_id="21812", control_type="Edit")
   | 
   | Button - '保存密码'    (L960, T914, R1080, B944)
   | ['Button2', '保存密码Button', '保存密码']
   | child_window(title="保存密码", auto_id="20329", control_type="Button")
   | 
   | Button - '自动登录'    (L1230, T914, R1350, B944)
   | ['Button3', '自动登录', '自动登录Button']
   | child_window(title="自动登录", auto_id="20330", control_type="Button")
   | 
   | Static - '忘记账号/密码?'    (L960, T1010, R1110, B1040)
   | ['忘记账号/密码?', '忘记账号/密码?Static', 'Static', 'Static0', 'Static1']
   | child_window(title="忘记账号/密码?", auto_id="21896", control_type="Text")
   | 
   | Static - '脱机'    (L1293, T1008, R1338, B1038)
   | ['脱机Static', 'Static2', '脱机', '脱机0', '脱机1']
   | child_window(title="脱机", auto_id="22384", control_type="Text")
   | 
   | Button - '免费注册'    (L1448, T824, R1628, B860)
   | ['免费注册', 'Button4', '免费注册Button']
   | child_window(title="免费注册", auto_id="21816", control_type="Button")
   | 
   | Button - '脱机'    (L1511, T998, R1547, B1034)
   | ['Button5', '脱机Button', '脱机2', '脱机Button0', '脱机Button1']
   | child_window(title="脱机", auto_id="21827", control_type="Button")
   | 
   | Button - '脱机'    (L1448, T998, R1484, B1034)
   | ['Button6', '脱机Button2', '脱机3']
   | child_window(title="脱机", auto_id="21853", control_type="Button")
   | 
   | Button - '脱机'    (L1574, T998, R1610, B1034)
   | ['Button7', '脱机Button3', '脱机4']
   | child_window(title="脱机", auto_id="21829", control_type="Button")
   | 
   | Button - '游客登录'    (L1448, T950, R1628, B986)
   | ['Button8', '游客登录', '游客登录Button']
   | child_window(title="游客登录", auto_id="21851", control_type="Button")
   | 
   | Static - 'Static'    (L831, T443, R1731, B754)
   | ['StaticStatic', 'Static3']
   | child_window(title="Static", auto_id="22069", control_type="Text")
   | 
   | Static - '没有账号?您可以:'    (L1448, T794, R1658, B821)
   | ['没有账号?您可以:Static', '没有账号?您可以:', 'Static4']
   | child_window(title="没有账号?您可以:", auto_id="21487", control_type="Text")
   | 
   | Button - '设置'    (L1218, T1011, R1278, B1041)
   | ['设置', 'Button9', '设置Button']
   | child_window(title="设置", auto_id="21898", control_type="Button")
   | 
   | Button - '扫码登录'    (L1448, T908, R1628, B944)
   | ['扫码登录', '扫码登录Button', 'Button10']
   | child_window(title="扫码登录", auto_id="63275", control_type="Button")
   | 
   | Button - '短信登录'    (L1448, T866, R1628, B902)
   | ['Button11', '短信登录Button', '短信登录']
   | child_window(title="短信登录", auto_id="63276", control_type="Button")
   | 
   | Button - '登 录'    (L960, T956, R1335, B1001)
   | ['Button12', '登 录', '登 录Button']
   | child_window(title="登 录", auto_id="1", control_type="Button")

第一种方法比第二种方法执行效率更高是因为它利用了窗口的descendants方法,一次性获取了窗口的所有子元素,然后在遍历子元素的过程中定位和操作目标元素。而第二种方法则是逐层遍历查找元素,定位和操作目标元素。所以第一种方法只需要进行一次遍历,而第二种方法则需要进行多次遍历,所以第一种方法执行时间更短。

如果想要进一步优化,可以考虑使用元素的自动化id来定位元素,因为自动化id是唯一的,直接定位效率更高。另外,可以使用元素的缓存来加速操作,即在第一次定位元素后将其缓存,以后再次使用时就可以直接从缓存中获取,而不需要再次查找。

【pywinauto】PC端应用自动化测试(二)元素定位
可以参考这个例子


【Python自动化测试】python实现PC客户端自动化快速入门:pywinauto_pc客户端自动化测试_程序员二黑的博客-CSDN博客 python 实现 PC 客户端自动化:pywinauto 快速上手!_pc客户端自动化测试 https://blog.csdn.net/weixin_54696666/article/details/128849677

window.descendants()方法相当于一次性获取到了所有的孩子节点,而第二中方法每次需要去查找一次,当你的层级结构比较深,比较复杂的时候,肯定是第一种方法的速度更快,如果只是查找一个节点,应该是第二种方法。

问题点:元素定位方法优劣.
分析思路:
单纯比执行效率,理论上应当是方法2最快,毕竟是直奔目标去执行的.
若页面元素不多,两者半斤八两,一样快.
若页面元素层级复杂,方法1(一次性获取了窗口的所有子元素,这个操作会增加耗时),

第一种速度要快些

第二种,需要循环递归处理,所以速度相对慢一些

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7559236
  • 除此之外, 这篇博客: window电脑C盘占用过大问题的几种解决方法中的 方法四、删除window更新文件(这个一旦删除,无法还原,慎重考虑) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我在win10在“设置–系统–存储–立即释放空间”可以把window之前的旧版本删除,因为我不需要还原,所以,我这里就不要了,根据自己的情况考虑(慎重考虑)。
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    然后我释放之后,电脑磁盘空间就多了几个G,但是要确保你不在恢复系统,确定之前的旧版本不需要再删除。
    (慎重考虑,删除无法恢复)

    在这里插入图片描述

    参考:
    https://www.cnblogs.com/tangmiao/p/10077525.html
    https://www.jb51.net/article/106779.htm
    https://www.jianshu.com/p/16e7752419e0?utm_campaign
    https://blog.csdn.net/xocom/article/details/79728372

  • 您还可以看一下 尹成老师的C语言系列之 Windows 下语音开发在游戏中的运用课程中的 字符串复习小节, 巩固相关知识点

1是遍历查找,2是系统的hash查找,2高一点吧,也和系统性能有关系