谷歌浏览器自动化之百度搜图

By terrorist at 17 天前 • 0人收藏 • 320人看过
import win.ui;
/*DSG{{*/
var winform = win.form(text="百度搜图";right=287;bottom=103)
winform.add(
button={cls="button";text="运行";left=88;top=48;right=216;bottom=88;z=1}
)
/*}}*/

//io.open()

import aaz.chrome.dp;

var cdp, err = aaz.chrome.dp()
if(!cdp){
    winform.msgboxErr(err);
	return ; 
}
cdp.timeout = 20000;

var task = function(path){
 	// 打开浏览器
	var ok, err = cdp.open()
    if(!ok){
         io.print("打开浏览器失败", err);
    	return ; 
    }
	
	// 连接浏览器
    var ok, err = cdp.connect();
    if(!ok){
        io.print("连接浏览器失败", err);
    	return ; 
    }

	// 订阅 Page 事件	
	cdp.Page.enable();

	// 打开网址
	cdp.Page.navigate(
		url = "https://www.baidu.com";
	)

	// 等待页面加载完成
	cdp.waitEvent( "Page.loadEventFired");

	// 点击相机
	cdp.Runtime.evaluate(
		expression = /**
       document.querySelector(".soutu-btn").click();
		**/
	)

	// 获取上传的 input 元素,选择器也可以用 [type=file]
	var ret = cdp.DOM.querySelector(
		nodeId = cdp.DOM.getDocument().root.nodeId;
		selector = ".upload-pic";
	)

	// 填写文件路径
	 cdp.DOM.setFileInputFiles(
		files = {path};
		nodeId = ret.nodeId
	) 
}
import fsys.dlg
winform.button.oncommand = function(id,event){
	var path = fsys.dlg.open("图片文件|*.jpg")
	if(path){
		cdp.run(task,,,path)
	}
	
}

winform.show();
win.loopMessage();


相关库:

 https://github.com/btx638/Chrome-DevTools-Protocol-aardio


参考:

https://github.com/cyrus-and/chrome-remote-interface/issues/164

3 个回复 | 最后更新于 17 天前
17 天前   #1

截图淘宝首页


import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=623;bottom=103)
winform.add(
btnScreenshot={cls="button";text="截图";left=440;top=16;right=576;bottom=48;z=3};
edUrl={cls="edit";text="https://www.taobao.com/";left=72;top=16;right=424;bottom=48;edge=1;z=2};
static={cls="static";text="网址:";left=24;top=16;right=72;bottom=48;transparent=1;z=1}
)
/*}}*/

// https://dschnurr.medium.com/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a
// https://blog.csdn.net/z69183787/article/details/91984005
// https://dev.to/gdledsan/selenium-4-and-chrome-driver-take-full-page-screenthos-2j8d
// https://github.com/puppeteer/puppeteer/blob/main/src/common/Page.ts#L2741


import crypt.bin
import process
import aaz.chrome.dp;

var cdp, err = aaz.chrome.dp()

var task = function(url){
	// 以无头模式启动,就是不显示浏览器的界面
	cdp.open(,true)
    cdp.connect();
	cdp.Page.enable();
	cdp.Page.navigate(
		url = url;
	)
	cdp.waitEvent( "Page.loadEventFired" );
	
	// 滚动页面
	
  	var totalHeight = 0;
  	// 每次滚动高度
  	var distance = 100;
  	
  	while(true){
		cdp.Runtime.evaluate(
			expression = string.format(" window.scrollBy(0, %s);", distance);
		)
		totalHeight += distance;
		
		var ret = cdp.Runtime.evaluate(
			expression = "document.body.scrollHeight";
			returnByValue = true;
		)
		
        if (totalHeight >= ret.result.value) {
          break;
        }
        win.delay(100)
  	}
  	
	

		
	var rect = cdp.Page.getLayoutMetrics()
	
	var ret = cdp.Page.captureScreenshot(
		format="jpeg";
		captureBeyondViewport = true;

		clip = {
			x = 0;
			y = 0;
			scale = 1;
			width = rect.cssContentSize.width;
			height = rect.cssContentSize.height;
		}

	)
	
	// 关闭浏览器
	cdp.Browser.close(); 
	if(ret){
		return crypt.bin.decodeBase64(ret.data); 	
	}
}

winform.btnScreenshot.oncommand = function(id,event){
	var url = winform.edUrl.text
	if(!string.startWith(url, "http")){
		winform.msgboxErr("请填写网址")
		return ; 
	}
	
	cdp.run(
		task,
		function(){
			winform.btnScreenshot.disabled = true
		},
		function(data){
			winform.btnScreenshot.disabled = false
			if(data){
				string.save("\截图.jpg", data)
				process.exploreSelect("\截图.jpg")
			}
		}, 
		url
	)
}


winform.show();
win.loopMessage();
return winform;


参考:

 https://dschnurr.medium.com/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a

https://blog.csdn.net/z69183787/article/details/91984005

https://dev.to/gdledsan/selenium-4-and-chrome-driver-take-full-page-screenthos-2j8d

https://github.com/puppeteer/puppeteer/blob/main/src/common/Page.ts#L2741


17 天前   #2

模拟一个等待函数

var js = /**
	const sleep = (time) => {
  		return new Promise(resolve => setTimeout(resolve, time))
	}
	
	async function sleepAsync(time) {
  		await sleep(time)
	}
	
	sleepAsync(%s)
**/
var wait = function(ms){
	return cdp.Runtime.evaluate(
		awaitPromise = true; // 执行是否应该等待结果值,并在等待的承诺被解决后返回。
		expression = string.format(js, ms)
	)
}


测试等待5000毫秒

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=385;bottom=140)
winform.add(
button={cls="button";text="运行";left=142;top=43;right=221;bottom=83;z=1}
)
/*}}*/

io.open()

import aaz.chrome.dp;

var cdp, err = aaz.chrome.dp()
if(!cdp){
    winform.msgboxErr(err);
	return ; 
}

var js = /**
	const sleep = (time) => {
  		return new Promise(resolve => setTimeout(resolve, time))
	}
	
	async function sleepAsync(time) {
  		await sleep(time)
	}
	
	sleepAsync(%s)
**/
var wait = function(ms){
	return cdp.Runtime.evaluate(
		awaitPromise = true; // 执行是否应该等待结果值,并在等待的承诺被解决后返回。
		expression = string.format(js, ms)
	)
}


cdp.timeout = 20000;

var task = function(){
 	// 打开浏览器
	var ok, err = cdp.open()
    if(!ok){
         io.print("打开浏览器失败", err);
    	return ; 
    }
	
	// 连接浏览器
    var ok, err = cdp.connect();
    if(!ok){
        io.print("连接浏览器失败", err);
    	return ; 
    }

	// 订阅 Page 事件	
	cdp.Page.enable();

	// 打开网址
	cdp.Page.navigate(
		url = "https://www.baidu.com";
	)

	// 等待页面加载完成
	cdp.waitEvent( "Page.loadEventFired" );

	io.print("等待开始")
	var tick = time.tick()
	wait(5000)
	io.print("等待结束,用时:",  time.tick()-tick )
	
	// 关闭浏览器
	cdp.Browser.close(); 
}

winform.button.oncommand = function(id,event){
	cdp.run(
		task,
		function(){
			winform.button.disabled = true
		},
		function(){
			winform.button.disabled = false
		}
	)
}

winform.show();
win.loopMessage();


17 天前   #3

666,  , 这个dp库越来越完善了.

登录后方可回帖

登 录
信息栏
公告:
私人站, 专注分享, 可在分享中适当提问, 但谢绝纯提问, 否则不再提醒一律删帖, 谢谢合作!



本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
Loading...