1

Тема: JS: Совместная разработка - ищу единомышленников, знающих JScript

Всем привет!

Подскажите, присутствуют ли гуры JScript на форуме?

Имеются весьма базовые навыки по этому движку, и есть желание разработать класс-обертку для chromedriver.
Сам класс вроде как начал, но в процессе утыкаюсь в ограничение собственный знаний синткасиса, приемов, фишек...

Цель: на выходе получить скрипт используемый как самостоятельно, так и подключаемый в OLE->ScriptControl (главная фишка, ради которой весь замут))).

Есть желающие поучавствовать в совместной разработке (или просто дать подсказок)?

Вот что набросал (exe-шник драйвера покамест запускается вручную, но в дальнейшем планируется автомат):

	
// json2js:

this.JSON||(this.JSON={}),function(){function f(t){return t<10?"0"+t:t}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(t){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(t){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(t){return escapable.lastIndex=0,escapable.test(t)?'"'+t.replace(escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var n,r,f,o,u,i=gap,a=e[t];switch(a&&"object"==typeof a&&"function"==typeof a.toJSON&&(a=a.toJSON(t)),"function"==typeof rep&&(a=rep.call(e,t,a)),typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a)return"null";if(gap+=indent,u=[],"[object Array]"===Object.prototype.toString.apply(a)){for(o=a.length,n=0;n<o;n+=1)u[n]=str(n,a)||"null";return f=0===u.length?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+i+"]":"["+u.join(",")+"]",gap=i,f}if(rep&&"object"==typeof rep)for(o=rep.length,n=0;n<o;n+=1)"string"==typeof(r=rep[n])&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);else for(r in a)Object.hasOwnProperty.call(a,r)&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);return f=0===u.length?"{}":gap?"{\n"+gap+u.join(",\n"+gap)+"\n"+i+"}":"{"+u.join(",")+"}",gap=i,f}}"function"!=typeof JSON.stringify&&(JSON.stringify=function(t,e,n){var r;if(indent=gap="","number"==typeof n)for(r=0;r<n;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if((rep=e)&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){var j;function walk(t,e){var n,r,f=t[e];if(f&&"object"==typeof f)for(n in f)Object.hasOwnProperty.call(f,n)&&(void 0!==(r=walk(f,n))?f[n]=r:delete f[n]);return reviver.call(t,e,f)}if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();

////////////////////////////////////////////////////////////////////////////////////////////////////


function ChromeDriver(){
	
	function HttpQueryA(method, url,postdata) {
			var whr = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
				whr.Open(method,url,true);
				whr.Send(postdata);
				whr.WaitForResponse(10);
			return whr.responseText;
		}
	
	port = '9515'; 
	
	var session = eval('('+HttpQueryA('POST','http://localhost:'+port+'/session','{"capabilities":{}}')+')');
	var sessionId = session.value.sessionId;

	this.OpenUrl = function(url){
	return eval('('+
	HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/url',
	'{"url":"'+encodeURI(url)+'"}')+')').value;	// null if ok
	};
	
	this.OpenUrl('data:text/html,<h1>Test</h>');
	
    this.PageSource = function(){
		return eval('('+HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/source')+')').value;
	};
	

this.FindElementsByXPath = function(XPValue){	
		var params = new Object();
		params.using = 'xpath';
		params.value = XPValue;
		query = JSON.stringify(params);
		response = HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element',query);
		var obj = eval('('+response+')');

			var a = new Array();
			for (var key in obj.value) {
				a.push(obj.value[key]);	
			}
       return a;
	}
	
this.FindElementByXPath = function(XPValue){	
       return this.FindElementsByXPath(XPValue)[0];
	}
	
this.FindElementById = function(id){	
	return this.FindElementByXPath('//*[@id="'+id+'"]');
    }

this.FindElementByName = function(name){	
	return this.FindElementByXPath('//*[@name="'+name+'"]');
    }

this.FindElementByAttribute = function(attr, name){	
    
	Element = this.FindElementByXPath('//*[@'+attr+'="'+name+'"]');
	Element.test = function(){return 'ok';};
	
	return Element;
	
    }

   this.ExecuteScript = function(script){
		return eval('('+ 
		HttpQueryA('POST',
		'http://localhost:'+port+'/session/'+sessionId+'/execute/sync',
		'{"script":"'+script+'","args":[]}'
		)+')')['value'];
	};
	
	this.Close = function(confirmMsg){
		HttpQueryA('DELETE','http://localhost:'+port+'/session/'+sessionId+'/window');
	};
	
	this.ParentHandle = -1;
	this.Parent = new Number();
	this.Parent = -1;
	return this;
};


//*

var v = new ChromeDriver();
v.OpenUrl('https://forum.mydataexpress.ru');
WScript.Echo(v.FindElementByAttribute('class','crumb'));
 
//  WScript.Echo(v.FindElementByAttribute('class','crumb').test); 

//*/ 

//v.Close();

Текущий вопрос, который сейчас волнует - как сделать вложенную функцию, которую можно вызвать внутри родительской способом:
Родитель(Параметры).Чилд(Параметры)... (а точнее - FindElementByAttribute('...').text, где "text", это отдельная функция с параметрами полученными из результата родительской)

2

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Вроде что-то наг..кодил..))

// json2js
this.JSON||(this.JSON={}),function(){function f(t){return t<10?"0"+t:t}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(t){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(t){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(t){return escapable.lastIndex=0,escapable.test(t)?'"'+t.replace(escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var n,r,f,o,u,i=gap,a=e[t];switch(a&&"object"==typeof a&&"function"==typeof a.toJSON&&(a=a.toJSON(t)),"function"==typeof rep&&(a=rep.call(e,t,a)),typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a)return"null";if(gap+=indent,u=[],"[object Array]"===Object.prototype.toString.apply(a)){for(o=a.length,n=0;n<o;n+=1)u[n]=str(n,a)||"null";return f=0===u.length?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+i+"]":"["+u.join(",")+"]",gap=i,f}if(rep&&"object"==typeof rep)for(o=rep.length,n=0;n<o;n+=1)"string"==typeof(r=rep[n])&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);else for(r in a)Object.hasOwnProperty.call(a,r)&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);return f=0===u.length?"{}":gap?"{\n"+gap+u.join(",\n"+gap)+"\n"+i+"}":"{"+u.join(",")+"}",gap=i,f}}"function"!=typeof JSON.stringify&&(JSON.stringify=function(t,e,n){var r;if(indent=gap="","number"==typeof n)for(r=0;r<n;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if((rep=e)&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){var j;function walk(t,e){var n,r,f=t[e];if(f&&"object"==typeof f)for(n in f)Object.hasOwnProperty.call(f,n)&&(void 0!==(r=walk(f,n))?f[n]=r:delete f[n]);return reviver.call(t,e,f)}if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();

/////////////


function Chrome(){

	function HttpQueryA(method, url,postdata) {
			var whr = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
				whr.Open(method,url,true);
				whr.Send(postdata);
				whr.WaitForResponse(10);
			return whr.responseText;
		}
	
	port = '9515'; 

	var session = JSON.parse(HttpQueryA('POST','http://localhost:'+port+'/session','{"capabilities":{}}'));
	var sessionId = session.value.sessionId;

	
	this.OpenUrl = function(url){
	// return eval('('+
	HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/url',
	'{"url":"'+encodeURI(url)+'"}');
	//+')').value;	// null if ok
	return this;
	};
	
	this.OpenUrl('data:text/html,<h1>Test</h>');
	
    this.PageSource = function(){
		return eval('('+HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/source')+')').value;
	};

this.FindElementByXPath = function(XPValue){
		
		var params = new Object();
		params.using = 'xpath';
		params.value = XPValue;
		query = JSON.stringify(params);
		// WScript.Echo(query);
		response = HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element',query);		
		var obj = JSON.parse(response);
			var a = new Array();
			for (var key in obj.value) {
				a.push(obj.value[key]);	
			}
return a[0];
}

//var element = '';

this.FindElementById = function(id){
	this.element = this.FindElementByXPath('//*[@id="'+id+'"]');
	return this;
}

this.FindElementByName = function(name){
	this.element = this.FindElementByXPath('//*[@name="'+name+'"]');
	return this;
}

this.Text = function(){
	var ts = HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/text');
    //WScript.Echo(ts);
	try 
	{return JSON.parse(ts).value}
	catch(e) 
	{return ts};
}


this.Tag = function(){
	var ts = HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/name');
    //WScript.Echo(ts);
	try 
	{return JSON.parse(ts).value}
	catch(e) 
	{return ts};
}

   this.ExecuteScript = function(script){
		return eval('('+ 
		HttpQueryA('POST',
		'http://localhost:'+port+'/session/'+sessionId+'/execute/sync',
		'{"script":"'+script+'","args":[]}'
		)+')')['value'];
	};
	
	this.Close = function(confirmMsg){
		HttpQueryA('DELETE','http://localhost:'+port+'/session/'+sessionId+'/window');
	};

		this.Quit = function(confirmMsg){
		HttpQueryA('DELETE','http://localhost:'+port+'/session/'+sessionId);
	};
	
	this.SendKeys = function(Keys){
		res =
		HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/value',
		'{"text":"'+Keys+'"}');
		return this;
		// WScript.Echo(res);
	};
	
	
	this.Click = function(){
		res =
		HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/click','{}');
		return this;
		// WScript.Echo(res);
	};
	
	
	this.ParentHandle = -1;
	
	this.Parent = new Number();
	this.Parent = -1;
	
	return this;
};

Пробуем:


(new Chrome())
.OpenUrl('https://google.ru')
.FindElementByName('q')
.SendKeys('Котики')
.FindElementByName('btnK')
.Click();

Ну и..:

https://i.imgur.com/PgYg9Sq.png

3

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Добавил еще несколько функций... Кое что "оптимизировал" (не могу сказать точно, ибо не ас в js)).

// json2js
this.JSON||(this.JSON={}),function(){function f(t){return t<10?"0"+t:t}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(t){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(t){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(t){return escapable.lastIndex=0,escapable.test(t)?'"'+t.replace(escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var n,r,f,o,u,i=gap,a=e[t];switch(a&&"object"==typeof a&&"function"==typeof a.toJSON&&(a=a.toJSON(t)),"function"==typeof rep&&(a=rep.call(e,t,a)),typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a)return"null";if(gap+=indent,u=[],"[object Array]"===Object.prototype.toString.apply(a)){for(o=a.length,n=0;n<o;n+=1)u[n]=str(n,a)||"null";return f=0===u.length?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+i+"]":"["+u.join(",")+"]",gap=i,f}if(rep&&"object"==typeof rep)for(o=rep.length,n=0;n<o;n+=1)"string"==typeof(r=rep[n])&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);else for(r in a)Object.hasOwnProperty.call(a,r)&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);return f=0===u.length?"{}":gap?"{\n"+gap+u.join(",\n"+gap)+"\n"+i+"}":"{"+u.join(",")+"}",gap=i,f}}"function"!=typeof JSON.stringify&&(JSON.stringify=function(t,e,n){var r;if(indent=gap="","number"==typeof n)for(r=0;r<n;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if((rep=e)&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){var j;function walk(t,e){var n,r,f=t[e];if(f&&"object"==typeof f)for(n in f)Object.hasOwnProperty.call(f,n)&&(void 0!==(r=walk(f,n))?f[n]=r:delete f[n]);return reviver.call(t,e,f)}if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();

/////////////


function Chrome(){
	
	this.Result = function(){
	   this.Result = JSON.parse(this.Result).value;	
	   WScript.Echo(this.Result);
	 //  if (this.Result == null)
		//	 {this.Result = 'ok';}
		//else
		//	 {this.Result = this.Result.message;}
	}
	


	function HttpQueryA(method, url,postdata) {
			var whr = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
				whr.Open(method,url,true);
				whr.Send(postdata);
				whr.WaitForResponse(10);
			return whr.responseText;
		}
	
	port = '9515'; 

	var session = JSON.parse(HttpQueryA('POST','http://localhost:'+port+'/session','{"capabilities":{}}'));
	var sessionId = session.value.sessionId;
	
	this.OpenUrl = function(url){
	this.Result =
	HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/url',
	'{"url":"'+encodeURI(url)+'"}');

	return this;
	};
	

	
//	this.OpenUrl('data:text/html,<h1>Test</h>');
	
    this.PageSource = function(){
		return eval('('+HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/source')+')').value;
	};

this.FindElementByXPath = function(XPValue){
		
		var params = new Object();
		params.using = 'xpath';
		params.value = XPValue;
		query = JSON.stringify(params);
		// WScript.Echo(query);
		response = HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element',query);	
        this.Result = response;		
		var obj = JSON.parse(response);
			var a = new Array();
			for (var key in obj.value) {
				a.push(obj.value[key]);	
			}
return a[0];
}


this.FindElementByCss = function(selector){
		var params = new Object();
		params.using = 'css selector';
		params.value = selector;
		query = JSON.stringify(params);
		// WScript.Echo(query);
		response = HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element',query);	
		//WScript.Echo(response);
        this.Result = response;		
		var obj = JSON.parse(response);
			var a = new Array();
			for (var key in obj.value) {
				a.push(obj.value[key]);	
			}
//WScript.Echo(a[0]);	
this.element =  a[0];
return this;
		

}


var element = '';

this.FindElementById = function(id){
	this.element = this.FindElementByXPath('//*[@id="'+id+'"]');
	return this;
}

this.FindElementByName = function(name){
	this.element = this.FindElementByXPath('//*[@name="'+name+'"]');
	return this;
}


this.Text = function(){
	var ts = HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/text');
    //WScript.Echo(ts);
	try 
	{return JSON.parse(ts).value}
	catch(e) 
	{return ts};
}

this.Tag = function(){
	var ts = HttpQueryA('GET','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/name');
    //WScript.Echo(ts);
	try 
	{return JSON.parse(ts).value}
	catch(e) 
	{return ts};
}

   this.ExecuteScript = function(script){
	 //  this.ExecuteScript_Result =
		//JSON.parse(
		//WScript.Echo('{"script":'+JSON.stringify(script)+',"args":[]}');
		HttpQueryA('POST',
		'http://localhost:'+port+'/session/'+sessionId+'/execute/sync',
		'{"script":'+JSON.stringify(script)+',"args":[]}');
		//).value;
		return this;
	};
	
	this.Close = function(confirmMsg){
		HttpQueryA('DELETE','http://localhost:'+port+'/session/'+sessionId+'/window');
	};

		this.Quit = function(confirmMsg){
		HttpQueryA('DELETE','http://localhost:'+port+'/session/'+sessionId);
	};

	this.SendKeys = function(Keys){
		HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/value',
		'{"text":"'+Keys+'"}');
		return this;
		// WScript.Echo(res);
	};
	
	



	this.Click = function(){
		this.Result = 
		HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/click','{}');
		return this;
		// WScript.Echo(res);
	};

	



		// WScript.Echo(res);

	
	//(function(){HttpQueryA('POST','http://localhost:'+port+'/session/'+sessionId+'/element/'+this.element+'/click','{}')})();
	
	
	
	this.Alert = function(Msg){
		//var res = 
		this.ExecuteScript('alert('+Msg+');');
		// WScript.Echo(JSON.stringify(res));
		return this;
		
	};
	
	//this.ParentHaxndle = -1;
	//this.Parent = new Number();
	//this.Parent = -1;
	
	return this;	
};

Пробуем проверить бонус-малус:

Chrome()
.OpenUrl('https://kbmka.ru/widget/3/kbm/value/?pid=darqn&style=mini&subid=rsa')
.FindElementById('surname').SendKeys('Иванов')
.FindElementById('name').SendKeys('Иван')
.FindElementById('patronymic').SendKeys('Иванович')
.FindElementById('date').SendKeys('20.02.1983\n') // Без "\n" остается висеть календарь
.FindElementByName('series').SendKeys('3125')
.FindElementByName('nubmer').SendKeys('536952')
.FindElementByName('email').SendKeys('ivanov@yandex.ru')
.FindElementByCss('.btn.btn-check')
.Click();

Короткий видос как это работает:  https://youtu.be/_rWs1hbRrg4

4 (изменено: Xameleon, 2021-07-18 16:54:57)

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

vovka3003, приветствую. Я тоже, к сожалению, не силён в JS. Идея понравилась - решил поизучать возможности. Собрал свою альтернативку, внеся пару коррективов:
1) Стандартизовал отправку JSON в функции apiRequest. Так чтобы всегда производилась сериализация входных данных в параметре data.

function apiRequest(method,url,data){

2) Там где собирается url вставил оборачивание вставок в encode(...). Таким образом исключается попадание управляющих символов в адрес
3) Чтобы в пределах сессии не дублировать сборку адреса, сделал промежуточную переменную sessionURL, которая хранит базовый адрес обращения для сессии
4) Работу с DOM перенёс в клиентский скрипт. Да, идея работать с элементами через Rest прикольная, но получается слишком много накладных - каждое обращение к элементам превращается в http запрос. ПМСМ, лучше по максимуму перенести в клиентский скрипт, чтобы ускорить выполнение. Но, конечно, это не вариант, если стоит цель полностью обернуть весь функционал апи в объектную модель.

vovka3003 пишет:

Текущий вопрос, который сейчас волнует - как сделать вложенную функцию, которую можно вызвать внутри родительской способом:
Родитель(Параметры).Чилд(Параметры)... (а точнее - FindElementByAttribute('...').text, где "text", это отдельная функция с параметрами полученными из результата родительской)

Вот как раз от этого я посчитал логичным уйти. Да, можно сделать функцию конструктор, передать в неё id объекта(ов) и наделить свойствами и методами инстанс, но это опять накладные расходы и нагрузка. Ещё встаёт вопрос - оборачивать каждый id в объект сразу или только по обращению к каждому item-у. В общем возни куча )

Ниже то, что у меня получилось:

script.wsf


<?xml version="1.0" encoding="UTF-8"?>
<job>
	<resource id="clientScript">
	<![CDATA[
	var form = document.forms[0]
	form.elements["firstname"].value	= "Иван";
	form.elements["middlename"].value	= "Иванов";
	form.elements["lastname"].value		= "Иванович";
	form.elements["birsday"].value		= "01.12.1967";
	form.elements["series"].value		= "23УВ";
	form.elements["nubmer"].value		= "234534";
	form.elements["email"].value		= "test@mail.ru";
	document.querySelector('.btn.btn-check').click();
	]]>
	</resource>
	<script language="JScript">
	<![CDATA[
	if(!/cscript\.exe/ig.test(WScript.FullName)){
		new ActiveXObject('WScript.Shell').Run('cmd /c cscript //nologo "' + WScript.ScriptFullName + '"',1,true);
		WSH.Quit();
	}
	
	// minifed json2.js
	this.JSON||(this.JSON={}),function(){function f(t){return t<10?"0"+t:t}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(t){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(t){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(t){return escapable.lastIndex=0,escapable.test(t)?'"'+t.replace(escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var n,r,f,o,u,i=gap,a=e[t];switch(a&&"object"==typeof a&&"function"==typeof a.toJSON&&(a=a.toJSON(t)),"function"==typeof rep&&(a=rep.call(e,t,a)),typeof a){case"string":return quote(a);case"number":return isFinite(a)?String(a):"null";case"boolean":case"null":return String(a);case"object":if(!a)return"null";if(gap+=indent,u=[],"[object Array]"===Object.prototype.toString.apply(a)){for(o=a.length,n=0;n<o;n+=1)u[n]=str(n,a)||"null";return f=0===u.length?"[]":gap?"[\n"+gap+u.join(",\n"+gap)+"\n"+i+"]":"["+u.join(",")+"]",gap=i,f}if(rep&&"object"==typeof rep)for(o=rep.length,n=0;n<o;n+=1)"string"==typeof(r=rep[n])&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);else for(r in a)Object.hasOwnProperty.call(a,r)&&(f=str(r,a))&&u.push(quote(r)+(gap?": ":":")+f);return f=0===u.length?"{}":gap?"{\n"+gap+u.join(",\n"+gap)+"\n"+i+"}":"{"+u.join(",")+"}",gap=i,f}}"function"!=typeof JSON.stringify&&(JSON.stringify=function(t,e,n){var r;if(indent=gap="","number"==typeof n)for(r=0;r<n;r+=1)indent+=" ";else"string"==typeof n&&(indent=n);if((rep=e)&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){var j;function walk(t,e){var n,r,f=t[e];if(f&&"object"==typeof f)for(n in f)Object.hasOwnProperty.call(f,n)&&(void 0!==(r=walk(f,n))?f[n]=r:delete f[n]);return reviver.call(t,e,f)}if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
	// Standard streams
	var StdIn = WSH.StdIn,
		StdOut = WSH.StdOut,
		StdErr = WSH.StdErr;

	var ChromeDriver = (function(){
		var whr = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
		// Function for encoding URL parts
		function encode(data){
			return encodeURIComponent(data).replace(/[!'()*]/g, function (c) {
				return '%' + c.charCodeAt(0).toString(16);
			});
		}
		// macro for api requests
		function apiRequest(method,url,data){
			try {
				// Debug output
				StdOut.WriteLine('[ API REQUEST ]');
				StdOut.WriteLine('method:\t'	+ method);
				StdOut.WriteLine('url:\t'		+ url);
				StdOut.WriteLine('data:\t'		+ JSON.stringify(data,null,'\t'));
				whr.open(method, url, false);
				whr.send(JSON.stringify(data));
			} catch(e){}
			if(e) throw new Error('Failed to request Chrome driver. ' + e.description);
			try {
				// Debug output
				StdOut.WriteLine('[ API RESPONSE ]');
				StdOut.WriteLine('status:\t'		+ whr.status);
				StdOut.WriteLine('statusText:\t'	+ whr.statusText);
				StdOut.WriteLine('response:\t'		+ JSON.stringify(JSON.parse(whr.responseText),null,'\t'));

				var response = JSON.parse(whr.responseText).value
				switch(whr.status){
				case 200:
					return response
				default:
					throw new Error(response.message);
				}
			} catch(e){}
			if(e) throw new Error('Failed to parse Chrome driver response. ' + e.description);
		}
		
		return {
			url: 'http://localhost:9515',
			// Function for session creation
			createSession: function(capabilities){
				var response = apiRequest('POST',this.url + '/session',capabilities || {capabilities:{}}),
					// Building session base URL
					sessionUrl = this.url + '/session/' + encode(response.sessionId);
					
				return {
					// Navigation function
					navigate: function(url){
						return apiRequest('POST',sessionUrl + '/url',{
							url: url
						})
					},
					// Client script execution
					execute:function(code, args){
						apiRequest('POST',sessionUrl + '/execute/sync',{
							script: code,
							args: args || []
						})
					},
					// Function for closing session
					close: function(){
						apiRequest('DELETE',sessionUrl);
					}
				}
			}
		}
	})();

	try {
		var session = ChromeDriver.createSession();
		// Navigating to kbmka site
		session.navigate('https://kbmka.ru/widget/3/kbm/value/?pid=darqn&style=mini&subid=rsa');
		// Executing client script
		session.execute(getResource('clientScript'));
	} finally {
		StdOut.WriteLine('To close script, please press ENTER');
		StdIn.ReadLine();
		if(session) session.close();
	}

	]]>
	</script>
</job>
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

А так ли нужен драйвер, когда есть:
https://chromedevtools.github.io/devtools-protocol/

6 (изменено: Xameleon, 2021-07-19 11:44:59)

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Malcev, заманчиво! А есть сэмпл реализации интеграции с wsh ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Нет, но есть на автохотки:
https://github.com/G33kDude/Chrome.ahk

8 (изменено: svoboden, 2021-07-20 00:23:20)

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Здравствуйте. Хотелось бы спросить у знающих людей. Возможно ли через драйвер подключиться к уже существующему запущенному браузеру. Спасибо. Думаю, что нет. Но все же, может кто подскажет что.

9

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Конечно может.
Запускаете хром с --remote-debugging-port=номерпорта.
После когда надо подсоединяетесь указав номерпорта через debuggerAddress.

10

Re: JS: Совместная разработка - ищу единомышленников, знающих JScript

Malcev пишет:

А так ли нужен драйвер, когда есть:
https://chromedevtools.github.io/devtools-protocol/

Пока не очень понял как работать напрямую с протоколом. Если это проще чем с драйвером, тогда я руками и ногами "за"...