1 (изменено: mafckz, 2016-05-05 09:45:08)

Тема: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Не нашел в интернете информации о манипуляции браузером Microsoft Edge используя COM (Component Object Model), подобно тому, как это возможно с Internet Explorer.
Полагаю, что и с Edge'ом можно. Так ли это?

2

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Через Com насколько я знаю нет.
Можно через Selenium WebDriver.
Но я не пробовал, так как устанавливать все это не хочу - нет нужды.
https://habrahabr.ru/company/yandex/blog/173769/
https://autohotkey.com/boards/viewtopic … mp;t=11884

3 (изменено: mafckz, 2016-05-05 10:38:26)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Нашел следующий способ взаимодействия AHK со страницами в браузерах посредством JavaScript - использование функции для добавления шорткатов в javascript.

Для этого нужно:
- Установить в браузере расширение/плагин для использование пользовательских javascript'ов (для Google Chrome это Control Freak, CustomJS;  для FireFox - GreaseMonkey; либо другие).
- Написать JS скрипт, который будет выполняться на нужной странице.
- Включить написанный скрипт в шорткат функции.
- Сохранить полученный код в расширении браузера (можно настроить, что бы скрипт прогружался для одной страницы, для всего сайта, или всех страниц в браузере).

После этого через скрипт AHK можно посылать сочетания клавиш, созданных в функции шорткатов, и будет происходить выполнение javascript кода. Для обратной связи с AHK можно использовать команды alert и prompt.

Вот пример двух шорткатов. Первый "забинден" на F9 (через prompt показывает адрес веб-страницы), второй на Сontrol+F9 (также через prompt выдает список названий всех ссылок на странице):
(Шорткаты прописаны в самом конце кода)

/**
 * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 * Version : 2.01.A
 * By Binny V A
 * License : BSD
 */
shortcut = {
	'all_shortcuts':{},//All the shortcuts are stored in this array
	'add': function(shortcut_combination,callback,opt) {
		//Provide a set of default options
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		}
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}

		var ele = opt.target
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();

		//The function to be called at keypress
		var func = function(e) {
			e = e || window.event;
			
			if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;

				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
	
			//Find Which key is pressed
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			var character = String.fromCharCode(code).toLowerCase();
			
			if(code == 188) character=","; //If the user presses , when the type is onkeydown
			if(code == 190) character="."; //If the user presses , when the type is onkeydown
	
			var keys = shortcut_combination.split("+");
			//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
			var kp = 0;
			
			//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			};
			//Special Keys - and their codes
			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
	
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
				
				'pause':19,
				'break':19,
				
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
				
				'pageup':33,
				'page_up':33,
				'pu':33,
	
				'pagedown':34,
				'page_down':34,
				'pd':34,
	
				'left':37,
				'up':38,
				'right':39,
				'down':40,
	
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123
			};
	
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	//Meta is Mac specific
			};
                        
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
                        
			for(var i=0; k=keys[i],i<keys.length; i++) {
				//Modifiers
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;

				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;

				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1) { //If it is a special key
					if(special_keys[k] == code) kp++;
					
				} else if(opt['keycode']) {
					if(opt['keycode'] == code) kp++;

				} else { //The special keys did not match
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}

			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
	
				if(!opt['propagate']) { //Stop the event
					//e.cancelBubble is supported by IE - this will kill the bubbling process.
					e.cancelBubble = true;
					e.returnValue = false;
	
					//e.stopPropagation works in Firefox.
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		}
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		//Attach the function with the event
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},

	//Remove the shortcut - just specify the shortcut and I will remove the binding
	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination]);
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];

		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
};


shortcut.add("F9",
function() {
	prompt("Адрес этой веб-страницы:", window.location.href);
},
{ 'type':'keydown', 'propagate':true, 'target':document}
);


shortcut.add("Ctrl+F9",
function() {
	var links = document.getElementsByTagName("A");
	LinkTitles ="";
	for (var i = 0; i < links.length; i++) {
		LinkTitles += links[i].innerText + "\n";
	}
	prompt("Список всех ссылкок на этой странице:", LinkTitles);
},
{ 'type':'keydown', 'propagate':true, 'target':document}
);

Пытался сделать сохранение результатов в буфер обмена - как я прочитал, для этого нужно создавать на странице элемент и кликать по нему (через код). Мои тесты показали, что не на всех страницах срабатывает такой метод. Остановился на выводе результата через prompt и его копировании.

4

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

В общем надо установить SeleniumBasic:
http://florentbr.github.io/SeleniumBasic/
После этого можно тренироваться:

#SingleInstance, Force
#Persistent
 
driver := ComObjCreate("Selenium.FirefoxDriver")
driver.Get("http://www.google.ca/")
driver.findElementById("lst-ib").sendKeys("Eiffel tower")
driver.FindElementByName("btnG").Click

5

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Привет.
Попробовал этот код.
Показывает ошибку.

Что он хочет от меня ?

Post's attachments

2016-10-21_14h39_02.png 71.61 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

6

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Там же написано: не может открыть прослушиваемый порт.
Можно попробовать на более старых версиях фаерфокса.

7

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

хм.. а на хроме можно ?
Какой код для хрома, мне бы в идеале именно хром.

И вопрос еще доп. А можно запускать такой код, в уже открытом браузере ?
Или обязательно он сам должен запустить свой браузер ?

8

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Там же есть справка.

driver := ComObjCreate("Selenium.ChromeDriver")

А можно запускать такой код, в уже открытом браузере ?

Нет.

9

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Ок. Получилось запустить.
Как я заметил код описанный тут, отличается от кода в другой система.
Наприме:  WebElement element = driver.findElement(By.name("q"));
А тут например: driver.findElementById("phone").sendKeys("1111111111")

Собственно вопрос. А есть где то список команда которые можно тут применять ?

10

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

"C:\Program Files\SeleniumBasic\Selenium.chm"

11

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Спасибки )) будем грызть )

12

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

хм. А есть инструкция получше ?
Там конечно хорошо. Но сделана убого.
Чтобы пользоваться той инструкцией нужно изначально очень хорошо знать Селениум.
Там инструкция сделана, просто минимум кода и все., без объяснения что это и зачем.

Было бы хорошо, если инструкция была с объяснениями или хотя бы с минимальными примерами. Иначе очень сложно понять.
Например. Знаю что есть метод .FullScreen(). Но вот где его писать, и как применять вообще не написано. Просто в хелпе тупо .FullScreen() и все. И не понятно где писать, к чему применять.

13 (изменено: Malcev, 2016-10-24 13:47:12)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Там же написано:

Dim instance As Window
instance.FullScreen()

И есть пример:

Set win1 = driver.Window
driver.SwitchToNextWindow().Close
win1.Activate();
txt = dlg.Text
dlg.Accept

14 (изменено: Autosql, 2016-10-25 12:13:28)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Аааа понял. Пример просто был гораздо ниже. Я просто не увидел.

Но по примеру так и не понял.
Пробовал как понял, но не работает.


driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
driver.FullScreen()

;send {F11}

Как я понял вот так FullScreen, но он что-то не работает. Или я не так понял.

15

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Вот так правильно, но у меня не работает:

driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
win1:= driver.Window
win1.FullScreen()

16

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Ну так и у меня не работает. То что правильно, видимо не правильно smile
Вот только как правильно, из хелпа не понятно sad

17

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Почему неправильно? Другие же методы работают:

driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
win1:= driver.Window
win1.Maximize()

Если хотите докопаться до истины - пишите автору на gihub в issues.

18

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Другие да ) но этот не отработал.
Но я решил костылем )


driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
send {F11}
sleep 50

Из 10 раз отработал всегда верно.

19

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Подскажите еще.
Когда запускаю такой код:


driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
send {F11}
sleep 50

Хром показывает такую надпись.

И из-за неё фейлятся все тесты. Как отключить её я не нашел.
Отключал в хроме все приложения. Не помогло.
Кто знает как отключить это ?

Post's attachments

2016-10-25_14h58_48.png
2016-10-25_14h58_48.png 27.65 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

20

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

У меня на последней версии хрома и последнем chromedriver.exe такого не наблюдается.

21 (изменено: Autosql, 2016-10-26 11:58:12)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Версия 54.0.2840.71 m (64-bit)
Хмм. обновил браузер хром.
Стала версия и скрипт вообще перестал запускаться. Что он хочет, работал же этот код на старой версии.


Error:  0xA00A0021 - 
Source:		Selenium
Description:	SessionNotCreatedError
session not created exception
from unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"13368.1","isDefault":true},"id":1,"name":"","origin":"://"}
  (Session info: chrome=54.0.2840.71)
  (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 10.0 x86_64)
HelpFile:		(null)
HelpContext:	0

Specifically: Get

	Line#
	003: SendMode,Input
	004: SetWorkingDir,%A_ScriptDir%
	007: Return
	008: {
	012: Random,rnd,100,999
	014: driver := ComObjCreate("Selenium.ChromeDriver")
--->	015: driver.Get("https://yandex.ru")  
	016: driver.findElementById("pe").sendKeys("11")  
	017: Send,{F11}
	018: driver.findElementByName("pa").sendKeys("1")  
	019: Sleep,1500
	020: driver.FindElementByClass("de").Click  
	022: driver.findElementByXPath("//a[@data-id='94F139D79']").click  
	023: driver.findElementByXPath("//div[@data-id='98E37A']//input[@value='tr]").click  

22

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Скачайте последний chromedriver и замените свой.
http://chromedriver.storage.googleapis. … _win32.zip

23 (изменено: Autosql, 2016-10-26 11:58:20)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Спасибо. Заработало. И ошибка ушла что выше.

24

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Autosql, расставьте заглавные буквы и знаки препинания в своих сообщениях. Смайлик точкой не считается.

25 (изменено: Malcev, 2016-10-27 18:01:20)

Re: AHK: Управление (взаимодействие) AutoHotkey с браузерами

Правильней посылать F11 через Selenium, но chrome f1-f12 не воспринимает в отличие от IE.
Наверное баг.

driver := ComObjCreate("Selenium.ChromeDriver")
driver.Get("https://yandex.ru")
driver.sendKeys(driver.Keys.F11)
msgbox
driver := ComObjCreate("Selenium.IEDriver")
driver.Get("https://yandex.ru")
driver.sendKeys(driver.Keys.F11)
msgbox

Да и хендл окна непонятно как получить.
Этот код на VBS:

Set driver = CreateObject("Selenium.ChromeDriver")
driver.Get "https://www.google.co.uk"
msgbox driver.Window.Handle

пишет:

Object does not support this property or method

Хотя в справке написано:

Window.Handle Property 

Returns the handle of the current window.

Namespace: Selenium
Assembly: Selenium (in Selenium.dll) Version: 2.0.9.0 (2.0.9.0)
Syntax
VB Usage
CopyDim instance As Window
Dim value As String

value = instance.Handle

Хотя, такой же код название окна получает:

Set driver = CreateObject("Selenium.ChromeDriver")
driver.Get "https://www.google.co.uk"
msgbox driver.Window.Title

В общем непонятно.