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

By terrorist at 2022-04-29 • 0人收藏 • 1369人看过
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

4 个回复 | 最后更新于 2022-08-18
2022-04-30   #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


2022-04-30   #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();


2022-04-30   #3

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

2022-08-18   #4

marks

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...