找回密码
 加入
搜索
查看: 1323|回复: 4

(转贴)AutoIt:AutoIt比我想象的更加强大

[复制链接]
发表于 2022-2-16 00:10:53 | 显示全部楼层 |阅读模式

前段时间,我一直认为,通过AutoIt进行自动化操作,也只有几个方法可以用,它们只是controlClick, controlsend等如下图:

我一直认为,AutoIt的所有的GUI 方法,都是用来创建界面使用的。

今天,开发找我,让我把他的一个GUI页面上所有的资源获取下来:

页面上一个ListView中,一共有大约70个list,我现在需要遍历这70个list,然后当该list获取焦点的时候,右键点击,然后在弹出框中点击第二个选项,从而保存图片?

我一直期待能找到一个函数,比喻:ControlGetFocusPos,可是没有这个函数,mouseGetPos函数只能获取鼠标所在的位置,google搜索也得不到想要的答案。

问题最终还是被我解决了:

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


 楼主| 发表于 2022-2-16 00:13:02 | 显示全部楼层
本帖最后由 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("[CLASS:SWT_Window0]")

   ;激活目标程序窗口
   $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[0]-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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2022-2-16 10:13:09 | 显示全部楼层
这种用wg的方法更合适
发表于 2022-2-16 13:40:34 | 显示全部楼层
可惜此软件不开源!
发表于 2022-5-9 11:17:18 | 显示全部楼层
功能强大,无从下嘴
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-25 07:27 , Processed in 0.112807 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表