aardio网页组件:webPageOperation

news2024/11/23 1:40:51

webPageOperation是webview的初步封装,用来网页填表、操作网页。可操作web.form、web.view、web.view2等浏览器组件。
1

使用方法

首先把webPageOperation.aardio(源码在后面)放到~\lib\godking目录下,然后新建窗口项目:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls="button";text="打开网页";left=220;top=400;right=340;bottom=450;z=2};
button2={cls="button";text="搜索";left=410;top=400;right=530;bottom=450;z=3};
custom={cls="custom";text="自定义控件";left=9;top=13;right=744;bottom=386;ah=1;aw=1;z=1}
)
/*}}*/

import web.view
import console
var wb = web.view(winform.custom)
wb.go("https://www.sogou.com/")
 
winform.button.oncommand = function(id,event){
	import godking.webPageOperation;
	var wpo = godking.webPageOperation(wb);
	
	// 点击"图片"连接
	var s = "#weixinch";
	wpo.bySelector( s ).click();
}
 
winform.button2.oncommand = function(id,event){
	import godking.webPageOperation;
	var wpo = godking.webPageOperation(wb);
	
	// 填写搜索框内容
	var s = "#query";
	wpo.bySelector( s ).setValue("光庆aardio");
		
	// 表单提交
	var tagname = "form"
	wpo.byTagNameS( tagname,1 ).submit();	
}
 
winform.show();
win.loopMessage();

组件源码

//webPageOperation 网页操作
//光庆封装 http://chengxu.online
//V1.1.1
//2023-06-05
//参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API
/*
更新日志
	1.1.1 改进S结尾的操作集合,增加 byIndex() 函数,改进 byChildS() 和 byParent() 函数命名。
	1.1.0 支持 parentNode() 父元素操作集 和 childNodes() 子元素操作集。内置find函数,可寻找指定元素并返回操作集,但速度很慢。
	1.0.0 初步封装
Selector(CSS选择器)参考手册: 
	https://www.runoob.com/cssref/css-selectors.html
	https://m.w3cschool.cn/cssref/css-selectors.html
bySelector(querySelector)使用文档:
	https://www.runoob.com/jsref/met-document-queryselector.html	
	https://m.w3cschool.cn/jsref/met-element-queryselector.html
*/
namespace godking
	// 对象操作类
class_func = class {
    	ctor( webview,funcName,Selector="",index,childNodes="",childIndex){
    	    if index this.index = "[" ++(index-1)++ "]" else this.index = "";
    	    if childIndex this.childIndex = "[" ++(childIndex-1)++ "]" else this.childIndex = "";
    	    var childNodesIndex = childNodes ++ this.childIndex;
    	};
		getProp = function(Prop){
			Prop:="value";
			return webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ "." ++Prop);
		}
		setProp = function(Prop,v=""){
			Prop:="value";
			if type(v)==type.string v="'" ++v++ "'";
			return webview.doScript("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ "." ++Prop++ "=" ++v);
		}		
    	count = function(){
    	    var t;
    		if childNodes {
	    	    t = webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodes);
	    	}else{
	    		t = webview.eval("document." ++ funcName ++ "('" ++Selector++ "')");
	    	}
    	    if type(t) == type.table return ..table.count(t);
    	    else return 0;
    	}
		click = function(){
			return webview.doScript("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".click()");
		}
		submit = function(){
			return webview.doScript("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".submit()");
		}
		
		getValue = function() { return this.getProp("value") }; 
		setValue = function(v) { return this.setProp("value",v) }; 

		getText = function() { var t = this.getProp("value"); if t!==null return tostring(t); }; 
		setText = function(v) { return this.setProp("value",tostring(v)) }; 
		
		getChecked = function() { return this.getProp("checked") }; 
		setChecked = function(v=1) { return this.setProp("checked",v?1:0) }; 
		
		getInnerText = function() { return this.getProp("innerText") }; 
		setInnerText = function(v="") { return this.setProp("innerText",v) }; 
		
		getOuterText = function() { return this.getProp("outerText") }; 
		setOuterText = function(v="") { return this.setProp("outerText",v) }; 
		
		getOuterHTML = function() { return this.getProp("outerHTML") }; 
		setOuterHTML = function(v="") { return this.setProp("outerHTML",v) }; 
		
		getInnerHTML = function() { return this.getProp("innerHTML") }; 
		setInnerHTML = function(v="") { return this.setProp("innerHTML",v) }; 
		
		getSelectedItemIndex = function(){
			var idx = this.getProp("selectedIndex"); if idx!==null return idx+1; 
		}
		setSelectedItemByIndex = function(v){
			v:=1; v-=1; return this.setProp("selectedIndex",v)
		}
		getSelectedItemText = function(){
			var idx = this.getProp("selectedIndex"); if idx===null return ; 
			return webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".options.item(" ++idx++ ").text");
		}
		setSelectedItemByText = function(v=""){
			for(i=1;this.count();1){
				if webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".options.item(" ++(i-1)++ ").text")==v {
					return webview.doScript("document." ++ funcName ++ "('"+Selector+"')" ++ this.index ++ childNodesIndex ++ ".selectedIndex=" ++(i-1));
				}
			}
		} 
		getItemText = function(v){
			v:=1; v-=1;
			return webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".options.item(" ++v++ ").text");
		} 
		getItemCount = function(){
			var t = webview.eval("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".options");
			if type(t)==type.table return ..table.count(t); 
		} 				
		getName = function() { return this.getProp("name") }; 
		getID = function() { return this.getProp("id") }; 
		getHref = function() { return this.getProp("href") }; 
		getSrc = function() { return this.getProp("src") }; 
		getTag = function() { return this.getProp("tagName") }; 
		getType = function() { return this.getProp("type") }; 
		getClass = function() { return this.getProp("className") }; 
		getStyle = function() { return this.getProp("style") }; 

		setHref = function(v) { return this.setProp("href",v) }; 
		setSrc = function(v) { return this.setProp("src",v) }; 
		setTag = function(v) { return this.setProp("tagName",v) }; 
		setType = function(v) { return this.setProp("type",v) }; 
		setClass = function(v) { return this.setProp("className",v) }; 
		setStyle = function(v) { return this.setProp("style",v) }; 
		
		byParent = function(){
			return ..godking.class_func(webview,funcName,Selector,index,childNodes++ this.childIndex ++ ".parentNode",null); 
		}
		byChildS = function(v){
			return ..godking.class_func(webview,funcName,Selector,index,childNodes++ this.childIndex ++ ".childNodes",v:1); 
		}
		focus = function(){
			webview.doScript("document." ++ funcName ++ "('" ++Selector++ "')" ++ this.index ++ childNodesIndex ++ ".focus()");
		}
		byIndex = function(v){
			if childIndex return ..godking.class_func( webview,funcName,Selector,index,childNodes,v:1); 
			else return ..godking.class_func( webview,funcName,Selector,v:1,childNodes,childIndex); 
		}
    }

class webPageOperation {
	ctor(webview){}; 
	// 获取对象函数
    focus = function(){
    	webview.focus();
    }
	getProp = function(prop){
		return webview.eval("document."+prop);
	}
	setProp = function(prop,v){
		if type(v)==type.string v="'"+v+"'";
		return webview.doScript("document."+prop+"="+v);
	}
	hideScrollbar = function(){
		webview.doScript(`document.body.style.overflow='hidden';
		document.body.style.overflowX='hidden';
		document.body.style.overflowY='hidden';
		document.parentWindow.execScript("document.body.style.overflow='hidden';")
		`)
	}
	hideBoder = function(){
		webview.doScript("document.body.style.border='0px none #CCCCCC';")
	}
	addLimit = function(){
		webview.doScript(`document.οncοntextmenu=function(){return false;};
		document.onselectstart=function(){return false;};
		document.onsdragstart=function(){return false;};
		`)
	}
	getTitle = function(){
		return webview.eval("document.title");
	}
	getCookie = function(){
		return webview.eval("document.cookie");
	}	
	setDesignMode = function(v=true){
		webview.doScript("document.designMode='"+(v?"on":"off")+"'")
	}
	back = function(){
		webview.doScript("window.history.back();")
	}
	forward = function(){
		webview.doScript("window.history.forward();")
	}
	find = function(kv){
		var fd = function(clss,fd){
			for(i=1;clss.childNodes().count();1){
				// 检查当前子对象
				var curChd = clss.childNodes(i);
				var is = true;
				for(k,v in kv){
					if curChd.getProp(k)!==v {
						is=false;
						break;
					}
				}
				if is return curChd; 
				// 如果有子子对象,则深入分析当前子对象
				if curChd.childNodes().count() {
					var r = fd(curChd,fd);
					if r return r; 
				}
			}			
		}
		var cls = this.bySelector("html");
		if !cls.childNodes().count() cls = this.bySelector("body");
		if cls.childNodes().count() return fd(cls,fd); 
	}

    // 创建对象操作类实例函数
	byID = function(v){ return ..godking.class_func(webview,"getElementById",v) };
	bySelector = function(v){ return ..godking.class_func(webview,"querySelector",v) };
	byTagNameS = function(v,index){ return ..godking.class_func(webview,"getElementsByTagName",v,index:1) };
	byNameS = function(v,index){ return ..godking.class_func(webview,"getElementsByName",v,index:1) };
	byClassNameS = function(v,index){ return ..godking.class_func(webview,"getElementsByClassName",v,index:1) };
	bySelectorS = function(v,index){ return ..godking.class_func(webview,"querySelectorAll",v,index:1) };

}

/**intellisense()
godking.webPageOperation = 网页操作类
godking.webPageOperation( wb ) = 初始化网页操作类。参数:webform、webview、webview2 对象
godking.webPageOperation() = !godking_webPageOperation.
end intellisense**/

/**intellisense(!godking_webPageOperation.)
byID( "__" ) = 通过ID获取元素对象,创建对象操作集。
bySelector( "__" ) = 通过Selector路径获取元素对象,创建对象操作集。
byTagNameS( "__", 1 ) = 通过TagName获取元素对象集合,创建对象操作集。\n参数1:tagName;参数2:对象索引(从1开始)
byNameS( "__", 1 ) = 通过name获取元素对象集合,创建对象操作集。\n参数1:name;参数2:对象索引(从1开始)
byClassNameS( "__", 1 ) = 通过ClassName获取元素对象集合,创建对象操作集。\n参数1:ClassName;参数2:对象索引(从1开始)
bySelectorS( "__", 1 ) = 通过Selector路径获取元素对象集合,创建对象操作集。\n参数1:Selector路径;参数2:对象索引(从1开始)

byID() = !godking_webPageOperation_class.
bySelector() = !godking_webPageOperation_class.
byTagNameS() = !godking_webPageOperation_class.
byNameS() = !godking_webPageOperation_class.
byClassNameS() = !godking_webPageOperation_class.
bySelectorS() = !godking_webPageOperation_class.

getProp( "__" ) = 获取属性值。参数:属性名
setProp( "__", ) = 设置属性值。参数:属性名、属性值
hideScrollbar() = 隐藏滚动条
hideBoder() = 隐藏边框
addLimit() = 添加鼠标右键菜单、选择文本、拖拽的限制。
getTitle() = 获取标题
getCookie() = 获取cookie
setDesignMode( true ) = 设置设计模式(编辑模式)
back() = 后退
forward() = 前进
focus() = 网页组件获取输入焦点
end intellisense**/

/**intellisense(!godking_webPageOperation_class.)
getProp( "__" ) = 获取属性值。参数:属性名
setProp( "__", ) = 设置属性值。参数:属性名、属性值

count() = 元素总数量。by开头S结束的函数,可以通过该函数获取总元素数量。
click() = 点击元素
submit() = 提交表单
focus() = 网页元素获取输入焦点

getValue() = 取value值
setValue( "__" ) = 置value值

getText() = 取value值,自动tostring转文本。
setText( "__" ) = 置value值,自动tostring转文本。

getChecked() = 取选中状态
setChecked( true ) = 置选中状态

getInnerText() = 取innerText
setInnerText( "__" ) = 置innerText

getOuterText() = 取outerText
setOuterText( "__" ) = 置outerText

getOuterHTML() = 取outerHTML
setOuterHTML( "__" ) = 置outerHTML

getInnerHTML() = 取innerHTML
setInnerHTML( "__" ) = 置innerHTML

byChildS( 1 ) = 创建子元素对象操作集。参数:子元素索引。
byChildS() = !godking_webPageOperation_class.
byParent() = 创建父元素对象操作集。\n!godking_webPageOperation_class.
byIndex( 1 ) = 创建当前元素集(S结尾的)的指定索引的元素的操作集。参数:元素索引。
byIndex() = !godking_webPageOperation_class.

getSelectedItemIndex() = 取选择框当前选中项目索引
setSelectedItemByIndex( __ ) = 置选择框当前选中项目索引
getSelectedItemText() = 取选择框当前选中项目文本
setSelectedItemByText( "__" ) = 置选择框当前选中项目文本
getItemText( __ ) = 取指定项目文本。参数:项目索引(从1开始)
getItemCount() = 取项目数量
getName() = 取name
getID() = 取id
getHref() = 取href
getSrc() = 取src
getTag() = 取tagName
getType() = 取type
getClass() = 取class
getStyle() = 取style

setHref( "__" ) = 置href
setSrc( "__" ) = 置src
setTag( "__" ) = 置tagName
setType( "__" ) = 置type
setClass( "__" ) = 置class
setStyle( "__" ) = 置style

end intellisense**/

参考

https://blog.csdn.net/sdlgq/article/details/131011599

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

R2O语义分割: Refine and Represent: Region-to-Object Representation Learning

paper: arxiv.org/pdf/2208.11821v2.pdf repo link: KKallidromitis/r2o: PyTorch implementation of Refine and Represent: Region-to-Object Representation Learning. (github.com) 摘要&#xff1a; 在本文中提出了区域到对象表示学习&#xff08;Region-to-Object Rep…

windows10下jdk安装

文章目录 windows10下jdk安装说明what安装包下载执行安装包验证是否安装成功 windows10下jdk安装 说明 操作系统&#xff1a;windows10 版本&#xff1a;1.8 what JDK(Java Development Kit) 是 Java 语言的软件开发工具包 安装包下载 https://www.oracle.com/java/techn…

4.11 构建onnx结构模型-Clip

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Clip 结点进行分析 方式 方法一…

下一站 Gen AI 城市巡展指南来了!“码”上出发,Let‘s 构!

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…

【Java用法】Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 + 数据排序

Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 数据排序 一、业务场景二、Hutool官网树结构工具2.1 介绍2.2 使用2.2.1 定义结构2.2.2 构建Tree2.2.3 自定义字段名 2.3 说明 三、具体的使用场景3.1 实现的效果3.2 业务代码3.3 实现自定义字段的排序 四、踩过的坑4.1 坑…

Android studio如何安装ai辅助工具

引言 在没有翻墙的情况下&#xff0c;即单纯在公司打工&#xff0c;经测试&#xff0c;大部分ai工具都是使用不了的&#xff08;比如各种gpt,codeium,copilot&#xff09;&#xff0c;根本登录不了账号&#xff0c;但有一个国内的codegeex是可以使用的&#xff0c;在这里不对各…

DS冲刺整理做题定理(二)线性表、栈、队列的套路

继续归纳套路&#xff0c;做题练习非常重要&#xff0c;王道的基本上足够了&#xff0c;学有余力可以做一下数据结构1800~ DS冲刺整理做题定理&#xff08;一&#xff09;二叉树专题https://blog.csdn.net/jsl123x/article/details/134949736?spm1001.2014.3001.5501 目录 一…

Spring Boot--Freemarker渲染技术+实际案例

目录 Freemarker 1.1.什么是Freemarker 1.2.Freemarker模板组成部分 1.3.优点 FreeMarker常见的方法&#xff1a; 2.2.2.数值 2.2.3.布尔值 2.2.4.日期 2.3.常见指令 2.3.1.处理不存在的值 assign 2.3.4.list 2.3.5.include SpringBoot整合Freemarker Freemarker…

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 (多指标,多图)

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果…

数字孪生 5G时代的重要应用场景 - 读书笔记

作者&#xff1a;陈根 第1章&#xff1a;数字孪生概述 数字孪生&#xff1a;对物理世界&#xff0c;构建数字化实体&#xff0c;实现了解、分析和优化集成技术&#xff1a;AI、机器学习、大数据分析构成&#xff1a;传感器、数据、集成、分析、促动器&#xff08;可以人工干预…

【python-wrf】绘制wrf中的土地利用报错内容及其解决方法

从该代码处绘制wrf中的土地利用报错内容及其解决方法 1.报错内容&#xff1a; 微信公众平台 (qq.com)https://mp.weixin.qq.com/s/Cn0vhvfroVADPnT237LXNw --------------------------------------------------------------------------- AttributeError …

支付功能如何测试?

一、测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任何事物的测试思路都可以总结如下&#xff1a; 第一步&#xff1a;梳理产品的核心业务流程&#xff1a;明白这是个什么项目&#xff0c;实现了什么业务&#xff0c;以及是怎么实现…

青少年CTF-Crypto(Morse code/ASCII和凯撒)

FLAG&#xff1a;你这一生到底想干嘛 专研方向: Web安全 &#xff0c;Md5碰撞 每日emo&#xff1a;不要因为别人都交卷了&#xff0c;就乱选答案 文章目录 1.Morse code2、ASCII和凯撒的约定 1.Morse code 题目提示摩尔斯电码&#xff0c;这个是给的附件 直接用摩尔斯解密&am…

java实现局域网内视频投屏播放(四)投屏实现

代码链接​​​​​​​​​​​​​​​​​​​​​ 设备发现 上一篇文章说过&#xff0c;设备的发现有两种情况&#xff0c;主动和被动&#xff0c;下面我们来用java实现这两种模式 主动发现 构建一个UDP请求发送到239.255.255.250:1900获取设备信息&#xff0c;UDP包的…

记录汇川:套接字TCP通信-梯形图

H5U集成一路以太网接口。使用AutoShop可以通过以太网方便、快捷对H5U进行行监控、下载、上载以及调试等操作。同时也可以通过以太网与网络中的其他设备进行数据交互。H5U集成了Modbus-TCP协议&#xff0c;包括服务器与客户端。可轻松实现与支持Modbus-TCP的设备进行通讯与数据交…

redis-学习笔记(Jedis string 简单命令)

mset & mget 批量设置和获取键值对 可以看出,参数都是可变参数 (就是说, 可以写任意个) 代码演示 getrange & setrange 获取和设置 string 类型中 某一区间的值 代码演示 append 往字符串的末尾拼接字符串 代码演示 incr & decr 如果 string 中为数字的话, 可以进行…

最新版ES8的client API操作 Elasticsearch Java API client 8.0

作者&#xff1a;ChenZhen 本人不常看网站消息&#xff0c;有问题通过下面的方式联系&#xff1a; 邮箱&#xff1a;1583296383qq.comvx: ChenZhen_7 我的个人博客地址&#xff1a;https://www.chenzhen.space/&#x1f310; 版权&#xff1a;本文为博主的原创文章&#xff…

大数据机器学习与深度学习——回归模型评估

大数据机器学习与深度学习——回归模型评估 回归模型的性能的评价指标主要有&#xff1a;MAE(平均绝对误差)、MSE(平均平方误差)、RMSE(平方根误差)、R2_score。但是当量纲不同时&#xff0c;RMSE、MAE、MSE难以衡量模型效果好坏&#xff0c;这就需要用到R2_score。 平均绝对…

怎么去评估数据资产?一个典型的政务数据资产评估案例

据中国资产评估协会《数据资产评估指导意见》&#xff0c;数据资产评估主要是三个方法&#xff1a;市场法、成本法和收益法。之前小亿和大家分享了数据资产评估方法以及价值发挥的路径&#xff0c;今天结合一个案例来具体讲解一下怎么去评估数据资产。 这个案例是一个典型的一个…