1

Тема: AHK: XMLHttpRequest object

Не понимаю как с помощью него послать клик.
Судя по документации у него есть метод dispatchEvent.
https://msdn.microsoft.com/library/ms535874
Так не получается:

URL := "http://help.dottoro.com/external/examples/ljwcseaq/onmousedown_4.htm"
xml := ComObjCreate("Msxml2.XMLHTTP.6.0")
xml.open("GET", URL, 0)
xml.send
;~ initMouseEvent(eventType, canBubble, cancelable, viewArg, detailArg, screenXArg, screenYArg, clientXArg, clientYArg, ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, buttonArg, relatedTargetArg)
MouseDownEvent := xml.document.createEvent("MouseEvent")
MouseDownEvent.initMouseEvent("mousedown",true,false, _, _, _, _, _, _, _, _, _, _, _, _)

MouseUpEvent := xml.document.createEvent("MouseEvent")
MouseUpEvent.initMouseEvent("mouseup",true,false, _, _, _, _, _, _, _, _, _, _, _, _)

xml.document.querySelector("BUTTON[Id=""testButton""]").dispatchEvent(MouseDownEvent)
xml.document.querySelector("BUTTON[Id=""testButton""]").dispatchEvent(MouseUpEvent)
MsgBox, %  xml.responseText

2

Re: AHK: XMLHttpRequest object

Для начала — а откуда у XMLHttpRequest-объекта взялось свойство document? Я такого по ссылке не обнаружил.

URL := "http://help.dottoro.com/external/examples/ljwcseaq/onmousedown_4.htm"
xml := ComObjCreate("Msxml2.XMLHTTP.6.0")
xml.open("GET", URL, 0)
xml.send

MsgBox, % IsObject(xml.document)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: XMLHttpRequest object

Кстати, в чём оновные отличия XMLHttpRequest от WinHttpRequest?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: Malcev, 2015-08-04 14:55:37)

Re: AHK: XMLHttpRequest object

Я его из примера взял:
https://msdn.microsoft.com/en-us/library/ff975247

var a = document.createElement('a');
var evt = document.createEvent('MouseEvents');
evt.initEvent("click", true, true);
a.dispatchEvent(evt);

А как тогда?
Так тоже не получается:

URL := "http://help.dottoro.com/external/examples/ljwcseaq/onmousedown_4.htm"
xml := ComObjCreate("Msxml2.XMLHTTP.6.0")
xml.open("GET", URL, 0)
xml.send

MsgBox, % IsObject(xml.constructor)

Кстати, в чём оновные отличия XMLHttpRequest от WinHttpRequest?

Как я понимаю, с помощью него можно посылать события на элементы. Только не получается пока.
Я им заинтересовался после поста Lexikos:

I started looking into this because using WinHttpRequest in synchronous mode causes the script to hang until the request completes, but it turns out you can get around that by opening the request in asynchronous mode and calling WinHttpRequest.WaitForResponse(). The advantages of XMLHTTP are that the API is well known to many web developers, and the events (like onreadystatechange) are compatible with AutoHotkey.

http://ahkscript.org/boards/viewtopic.p … 247#p34247

5

Re: AHK: XMLHttpRequest object

serzh82saratov пишет:

Кстати, в чём оновные отличия XMLHttpRequest от WinHttpRequest?

Как я понимаю основное отличие проявляется в случае, если получаемый файл представляет собой синтаксически правильный XML-документ, в этом случае становится доступной его DOM без необходимости чтения его сырого кода.

Забыл пароль и потерял e-mail.

6

Re: AHK: XMLHttpRequest object

Но в этом случае DOM даёт возможность только разбора (получение аттрибутов, свойств) элементов, или же позволяет их использование, без необходимости отправки запросов. Т.е. например применили метод "click" на кнопке, а данная кнопка уже с помощью скриптов выполняет переход на другую страницу, или скачивание файла и.т.п. Что должно произойти по клику?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: XMLHttpRequest object

Имеется в виду произвольный XML, не обязательно XHTML. Откуда в нём click? onreadystatechange - для назначения функции обратного вызова при асинхронном запросе (тут не имеет значения XML или что-угодно).

Забыл пароль и потерял e-mail.

8

Re: AHK: XMLHttpRequest object

Как это откуда?
По ссылке в первом посте присутствует метод:
dispatchEvent - Sends an event to the current element.

9

Re: AHK: XMLHttpRequest object

Если есть метод, еще не значит, что есть события, которые можно назначить этим методом.
Возможно, он взят из более общего интерфейса.
Возможно и наиболее вероятно, чтобы заработали обработчики  событий, узел надо вырезать из полученного XML и вставить в HTML-документ.
Кроме того, по той ссылке немного другой XMLHttpRequest, чтобы его получить надо действовать как-то так (не проверялось):

htmldoc := ComObjCreate("htmlfile")
req := htmldoc.Script.XMLHttpRequest() ; Script - то же, что и parentWindow

или

htmldoc := ComObjCreate("htmlfile")
htmldoc.Script.execScript("var req = new XMLHttpRequest();", "JScript")
req := htmldoc.Script.req

Вполне возможно, что его лучше получать не через htmlfile, а через InternetExplorer.Application… И даже если сам объект буден создан, не факт что им можно будет воспользоваться, т.к. на такой XMLHttpRequest, вроде бы, распространяется политика одного источника.

10 (изменено: wisgest, 2015-08-04 21:37:46)

Re: AHK: XMLHttpRequest object

P.S.

wisgest пишет:

Кроме того, по той ссылке немного другой XMLHttpRequest, чтобы его получить надо действовать как-то так (не проверялось)…
<…>
И даже если сам объект буден создан, не факт что им можно будет воспользоваться, т.к. на такой XMLHttpRequest, вроде бы, распространяется политика одного источника.

Проверилось.
Первый код не работает, т.к. там не хватает new, а чтобы воспользоваться JScript'овым new из AHK, всё-равно нужны костыли с помощью eval() или window.execScript()
Второй, как и предполагалось, при попытке вызвать метод .open() приводит к ошибке:

Error:  0x80070005 - Отказано в доступе. Source: (null)
Description: Отказано в доступе.
HelpFile: C:\WINDOWS\system32\mshtml.hlp
HelpContext: 0

11

Re: AHK: XMLHttpRequest object

попробуйте так:

        HttpObj1 := ComObjCreate("WinHttp.WinHttpRequest.5.1")
        _G := "http://GET_URL"
        HttpObj1.Open("GET",_G,true)                    ;the third parameter means, that it will be working asynchronously
        HttpObj1.Send()
        MsgBox,  % "Length: [" . StrLen(clp) . "], Status: [" . HttpObj1.Status . "], GET:`n-------------------`n" . _G
        Sleep, 5000
            If (HttpObj1.Status) MsgBox % HttpObj1.ResponseText

12

Re: AHK: XMLHttpRequest object

Так смысл всего этого был в том, чтобы нажать кнопку. Так, что этот вариант не подходит.
Вот я наткнулся на такой код и там пишут, что кнопка не нажимается из-за того, что

Are you trying to fire an event on the ajax response body, as if it was loaded into the DOM ? Stop me if I'm wrong, but the ajax request response is not loaded into the current DOM, so you cannot execute scripts on it, event if it has been parsed as a document. Take a look at the XMLHttpRequest spec : point 5-4 says "with scripting disabled"

var sendToLog;
var xhr = new XMLHttpRequest();
xhr.open('GET', '/newsfeed-simulator', true);
xhr.responseType = 'document';
xhr.onload = function(e) {
  if (this.status == 200) 
  {

    var event = xhr.response.createEvent("MouseEvents");
event.initMouseEvent("click", true, true, window,
            0, 0, 0, 0, 0,
            false, false, false, false,
            0, null);
xhr.response.getElementById("simulate-button").dispatchEvent(event);

    $(xhr.response).ready(function() 
    {
        console.log(xhr.response.body);
        sendToLog = xhr.response.getElementsByClassName("story-score");
    });

    chrome.extension.sendMessage({writeToLog: sendToLog});  

}
}

xhr.send();

http://stackoverflow.com/questions/1502 … ttprequest
Получается, что если есть кнопка без scripting, то на нее клик послать таки можно?
Проверить на ahk не могу, так как, как заметил wisgest:

Кроме того, по той ссылке немного другой XMLHttpRequest,

13 (изменено: shiz, 2019-11-07 18:10:10)

Re: AHK: XMLHttpRequest object

_gruz пишет:

попробуйте так

С какого перепугу?

_gruz пишет:
StrLen(clp)

Что такое clp?

_gruz пишет:
HttpObj1.Open("GET",_G,true)                    ;the third parameter means, that it will be working asynchronously

Не проще ли false, т.е. synchronously, и никакой Sleep не нужен?

_gruz пишет:
Sleep, 5000
    If (HttpObj1.Status) MsgBox % HttpObj1.ResponseText

И даже, если оставить третьим параметром true, ни в коем случае не пробуйте делать так!
Лучше уж

HttpObj1.WaitForResponse()
MsgBox % HttpObj1.ResponseText

или


while not HttpObj1.Status
    Sleep 100
MsgBox % HttpObj1.ResponseText
Забыл пароль и потерял e-mail.

14

Re: AHK: XMLHttpRequest object

Недавно был подобный вопрос. Ведь в теле страницы есть и содержимое скрипта, и данные для обработки.
Возможно же как то загрузить только текстовое содержимое в какую то среду типа "htmlfile" или что то другое, и использовать возможности имеющихся на странице скриптов, браузер же это как то так делает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: XMLHttpRequest object

А вот и минусы метода:
http://ahkscript.org/boards/viewtopic.p … 984#p52984