(转贴)AutoIt:AutoIt比我想象的更加强大
前段时间,我一直认为,通过AutoIt进行自动化操作,也只有几个方法可以用,它们只是controlClick, controlsend等如下图:https://images0.cnblogs.com/blog/558488/201309/03173424-6dd19083331c43fba8cdbca36689146c.png我一直认为,AutoIt的所有的GUI 方法,都是用来创建界面使用的。今天,开发找我,让我把他的一个GUI页面上所有的资源获取下来:页面上一个ListView中,一共有大约70个list,我现在需要遍历这70个list,然后当该list获取焦点的时候,右键点击,然后在弹出框中点击第二个选项,从而保存图片?我一直期待能找到一个函数,比喻:ControlGetFocusPos,可是没有这个函数,mouseGetPos函数只能获取鼠标所在的位置,google搜索也得不到想要的答案。https://images0.cnblogs.com/blog/558488/201309/03174248-e550595a99744e14803f4a380fdfbead.png问题最终还是被我解决了:1. 遍历每个list的位置坐标X, Y;2. 在该坐标上右键点击;3. 用键盘上的Down和Enter键,点击弹出框的第二个按钮;4. 保存相应资源具体代码如下:#include <GuiListView.au3>;获取窗口句柄$handle = WinGetHandle(".NET Reflector 6")WinActivate($handle);获取控件句柄;$control = ControlGetHandle($handle,"","WindowsForms10.SysListView32.app.0.232467a_r11_ad11");获取列表中List数目$count = ControlListView($handle,"",$control,"GetItemCount")for $i = 1 to 10 ;获取位置信息 $x = _GUICtrlListView_GetItemPositionX($control, $i-1) $y = _GUICtrlListView_GetItemPositionY($control, $i-1) ControlClick($handle,"", $control,"right",1, $x, $y) ControlSend($handle,"",$control,"{down 2}{enter}") WinWait("Save As") WinWaitActive("Save As") $handle2 = WinGetHandle("Save As") ControlSetText($handle2,"", "Edit1", "C:\Users\chenpassion\Desktop\Autoit\pic\" & $i & ".png") ControlClick($handle2,"","Button1") WinWaitClose("Save As") ControlSend($handle,"",$control,"{down}")Next看来又有得深入学习了!_GUICtrl***函数,是非常强大的,可以做更多的识别页面元素,操作Windows GUI 控件。
转载于:https://www.cnblogs.com/autotest/p/3299200.html
本帖最后由 rmajly 于 2022-2-16 00:15 编辑
程序界面中SysTreeView及其节点控件的自动化操作(AutoIt3)
楼主菜鸟一枚,目前遇到一个任务 如下图1所示,在SysTreeView控件中,运用递归方法检索到“LS_账户清洗_多金产品账户日终对账-副本”节点;
然后上移两级,如图2所示,点击右键菜单中的“生成模块代码(无目录结构)”。
本来想用Python+Win32+Spy++方法,无奈只能抓到SysTreeView的句柄,里面的控件句柄抓不到,无奈只能放弃。
冥思苦想之际,偶遇AutoIt,定睛一看,卧槽!正解!于是花了两天学习了一下,侥幸达到了任务要求。具体实现代码如下:
#include <GuiTreeView.au3>
;声明变量
Global $hWnd,$goalfile,$result,$htzqchtz,$count,$isgo
Local $str,$location,$j,$hItem,$start,$end
_main()
Func _main()
;运行Eclipse,等待配置完毕
Run('D:\研究生\4:研二下\hs_eclipse\eclipse.exe')
WinWaitActive("")
;激活目标程序窗口
$htzqchtz="资源 - Eclipse SDK"
WinActivate($htzqchtz, "")
ConsoleWrite("资源 -- Eclipse SDK被激活" & @CRLF)
$count=1
$isgo=True
;清理项目
WinMenuSelectItem('资源 - Eclipse SDK','','项目(&P)','清理(&N)...')
;Sleep(10)
send("{ENTER}")
;获取目标TreeView,并全部展开
$hWnd=ControlGetHandle($htzqchtz,"","SysTreeView321") ;控件句柄
;$goalfile='(11111056)LS_账户同步多金融_客户风险等级维护(银行试题)'
$goalfile='LS_账户清洗_多金产品账户日终对账'
;将树节点全部展开
_GUICtrlTreeView_Expand($hWnd)
;点击根结点,刷新工程目录
ControlTreeView ($htzqchtz,"",$hWnd,"Select",'#0')
;Sleep(10)
$hItem =_GUICtrlTreeView_GetSelection($hWnd)
_GUICtrlTreeView_ClickItem($hWnd,$hItem,"right", False,1);点击项目
;sleep(10)
for $i = 1 to 10;发送按键来实现
;sleep(10)
send("{DOWN}")
next
;sleep(10)
send("{ENTER}")
;自定义函数求节点书目
ConsoleWrite('TreeView总节点个数:'&_GUICtrlTreeView_GetCount($hWnd)&@CR)
;sleep(10)
$str='#0'
$start=TimerInit() ;计时开始
SearchTree($str)
$end=TimerDiff($start);计时结束
ConsoleWrite('检索时间:'&$end&@CR)
ConsoleWrite('检索结果:'&$result&@CR)
ConsoleWrite('检索节点个数:'&$count&@CR)
;将目标根节点路径拆分
$location=StringSplit($result,'|')
;获取上级目标节点路径
for $j=2 to $location-2
;ConsoleWrite('目标操作路径数是:'&$location[$j]&@CR)
$str=$str&'|'&$location[$j]
Next
ConsoleWrite('目标操作路径数:'&$str&@CR)
;Sleep(10)
;获取上级目标节点,右键点击弹出菜单窗口
ControlTreeView ($htzqchtz,"",$hWnd,"Select",$str)
;Sleep(10)
$hItem =_GUICtrlTreeView_GetSelection($hWnd)
_GUICtrlTreeView_ClickItem($hWnd,$hItem,"right", False,1);点击项目
;sleep(10)
;#cs
;发送按键来实现
for $i = 1 to 16
;sleep(10)
send("{DOWN}")
next
;sleep(10)
send("{RIGHT}")
;sleep(1000)
send("{ENTER}")
;#ce
;将树节点全部折叠
;_GUICtrlTreeView_Expand($hWnd,'',False)
EndFunc
;TreeView的根结点遍历函数
Func SearchTree($str)
Local $i,$temp,$str1,$num
$str1=$str
$num=ControlTreeView($htzqchtz,"",$hWnd,"GetItemCount",$str1)
$count+=$num
;#cs只要有匹配结果,立马跳出递归
If $isgo=False Then
Return $str1
EndIf
;#ce
If $num=0 Then
$temp=ControlTreeView($htzqchtz,"",$hWnd, "GetText", $str1)
If StringInStr($temp,$goalfile) Then
$isgo=False
ConsoleWrite('匹配节点名称:'&$temp&@CR)
$result=$str1
EndIf
Else
For $i=0 to $num-1
SearchTree($str1&StringFormat('|#%d',$i))
Next
EndIf
#cs
If $isgo=False Then
Return $str1
EndIf
#ce
EndFunc
————————————————
版权声明:本文为CSDN博主「PARKZHOU」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/PARKZHOU/article/details/76522165
这种用wg的方法更合适 可惜此软件不开源! 功能强大,无从下嘴
页:
[1]