网页自动化用于采集、填表等任务,现在一般用Chrome,aardio提供了chrome driver和chrome driverex扩展库,支持cdp命令。
窗口自动化,无非是win、winex、mouse、key几个库配合,标准窗口就是句柄操作,非标准窗口可以使用winex.accObject,还不行就找图找色找字,扩展库里还有大漠。
下面是我之前的两个小练习:
一、网页自动化
import win.ui;
/*DSG{{*/
var winform = win.form(text="Chrome Driver 练习";right=584;bottom=539;bgcolor=12639424;border="thin";max=false)
winform.add(
button={cls="button";text="开始采集";left=394;top=27;right=462;bottom=56;z=2};
button2={cls="button";text="保存结果";left=474;top=26;right=547;bottom=57;disabled=1;z=10};
combobox={cls="combobox";left=69;top=199;right=211;bottom=225;edge=1;items={};mode="dropdown";z=6};
edit={cls="edit";text="http://m.titan007.com/info.htm#section1";left=70;top=27;right=388;bottom=54;edge=1;multiline=1;readonly=1;z=1};
edit2={cls="edit";left=69;top=67;right=548;bottom=192;edge=1;hscroll=1;multiline=1;vscroll=1;z=4};
listview={cls="listview";left=66;top=236;right=548;bottom=527;edge=1;fullRow=1;gridLines=1;hscroll=1;vscroll=1;z=9};
static={cls="static";text="网址:";left=18;top=26;right=59;bottom=50;align="center";center=1;transparent=1;z=3};
static2={cls="static";text="日志:";left=17;top=65;right=64;bottom=89;align="center";center=1;transparent=1;z=5};
static3={cls="static";text="大洲:";left=14;top=203;right=61;bottom=227;align="center";center=1;transparent=1;z=7};
static4={cls="static";text="国家:";left=14;top=244;right=61;bottom=268;align="center";center=1;transparent=1;z=8}
)
/*}}*/
winform.listview.setColumns({"","序号","国家","链接"},{1,50,100,-1},{0,2,2,0})
var result={}
var log=function(...){
winform.edit2.print(tostring(time(,"%H:%M:%S")),...);
}
import chrome.driverex
var driver,err=chrome.driverex()
if !driver return win.msgbox(err);
driver.disableAutomation()
driver.setHeadless()
winform.button.oncommand = function(id,event){
winform.button.disabled=true
log("打开浏览器")
wb=driver.startBrowser()
log("打开网页")
wb.go(winform.edit.text)
wb.wait()
log("获取大洲名称")
var lables=wb.getEles("xpath",`//*[@id="tabHeader"]/ul/li`)
for (i=2;#lables){
var lableText=lables[i].getText()
winform.combobox.add(lableText)
}
winform.combobox.add("全部")
winform.combobox.selText="全部"
var n=0
for (i=2;#lables){
var lableText=lables[i].getText()
log("获取"++lableText++"国家名称")
lables[i].click()
wb.wait()
var countries=wb.getEles("xpath",`//*[@id="tc_`++(i-1)++`"]/ul/li/a`)
for (i=1;#countries-1){
var name=countries[i].getText()
var link=countries[i].getAttribute("href")
n++
winform.listview.addItem({lableText,n,name,link})
}
}
result=table.clone(winform.listview.items)
log("采集完毕")
winform.button.disabled=false
winform.button2.disabled=false
}
winform.combobox.onListChange = function(){
var sel=winform.combobox.selText
if sel="全部" {
winform.listview.items=result
return ;
}
var tab=table.filter(result,function(v){
return v[1]=sel
})
winform.listview.items=tab
for (i=1;winform.listview.count){
winform.listview.setItemText(i,i,2)
}
}
winform.button2.oncommand = function(id,event){
//保存不是此次练习重点,故采取最简单方式
string.save("\result.txt",table.tostring(result) )
process.exploreSelect("\result.txt")
}
winform.onClose = function(hwnd,message,wParam,lParam){
winform.show(false)
if wb wb.closeAll()
if driver driver.close()
}
winform.show();
win.loopMessage();
二、窗口自动化-禁用触控板
这部分之前发过,现在整合到一块。一直觉得笔记本电脑的触控板很烦人,打字时不小心就会碰到。而且我这台电脑似乎有毛病,明明禁用了,下次开机又启用。于是写了个自动禁用触控板的程序。这个程序未必适用于每台电脑,而且没毛病的电脑可能禁用一次就好了,不必像我这样还要写程序。
//打开控制面板的鼠标属性
import process.control
process.control("mouse")
//找到窗口句柄
import winex
var hwnd0= winex.waitVisible("鼠标 属性")
//找到选项卡句柄
var hwnd=winex.findEx(hwnd0,,"SysTabControl32")
//这里改用新学的acc库操作,切换选项卡
import winex.accObject
var acc = winex.accObject.fromWindow(hwnd)
var tab = acc.find(name = "@装置设定值")
tab.doDefaultAction()
win.delay(100)
//找到选项卡对应页面的句柄和禁用按钮句柄
hwnd=winex.findEx(hwnd0,,,"Advanced Features")
hwnd=winex.findEx(hwnd,,,"@禁用(&D)")
//如果已经处于禁用状态就点击取消
if !win.isEnable(hwnd){
var cancle=winex.findEx(hwnd0,,,"取消")
winex.click(cancle)
return
};
//模拟点击禁用按钮
winex.click(hwnd)
//如果弹出警告就模拟点击确定
winex.waitTimeout=500
var warn=winex.waitVisible("警告")
if warn {
var yes=winex.findEx(warn,,,"确定")
winex.click(yes)
}
win.delay(100)
//点击主窗口确定按钮,使设置生效并关闭窗口
var ok=winex.findEx(hwnd0,,,"确定")
winex.click(ok)