初识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端应用自动化测试(二)元素定位
可以参考这个例子
window.descendants()方法相当于一次性获取到了所有的孩子节点,而第二中方法每次需要去查找一次,当你的层级结构比较深,比较复杂的时候,肯定是第一种方法的速度更快,如果只是查找一个节点,应该是第二种方法。
问题点:元素定位方法优劣.
分析思路:
单纯比执行效率,理论上应当是方法2最快,毕竟是直奔目标去执行的.
若页面元素不多,两者半斤八两,一样快.
若页面元素层级复杂,方法1(一次性获取了窗口的所有子元素,这个操作会增加耗时),
第一种速度要快些
第二种,需要循环递归处理,所以速度相对慢一些
我在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
1是遍历查找,2是系统的hash查找,2高一点吧,也和系统性能有关系