网站无法识别我的输入[如何从VBA手动触发IE dom事件]

Nil*_*ils 15 javascript internet-explorer vba web-scraping dom-events

我想自动购买gdax.但我在Amount窗口中的输入无法识别.我可以在小字段上看到,它说:Total (LTC) ? 0.00000000

我的代码:

Sub test()

    Dim ObjIE As New InternetExplorer
    Dim Ohtml As HTMLDocument
    Dim HTMLtags As IHTMLElementCollection
    Dim HTMLtag As IHTMLElement
    Dim HTMLobjekt As IHTMLElement
    Dim item_limit As Object
    Dim y As Integer

    With ObjIE
        .Visible = True
        .navigate "https://www.gdax.com/trade/LTC-EUR"
        Do Until .readyState = READYSTATE_COMPLETE: Loop
        Set Ohtml = .document
    End With

    'Amount
    Do
        Set HTMLtags = Ohtml.getElementsByClassName("OrderForm_input-box_XkGmi")
        DoEvents
    Loop While HTMLtags.Length = 0
    For Each HTMLtag In HTMLtags
        If HTMLtag.Children(1).innerText = "EUR" Then
            Set HTMLobjekt = HTMLtag.Children(0)
            HTMLobjekt.Value = 100      ' this is the part that i excanged
        End If
    Next HTMLtag

    'get the Total(LTC) to cross check
    Do
        Set HTMLtags = Ohtml.getElementsByClassName("OrderForm_total_6EL8d")
        DoEvents
    Loop While HTMLtags.Length = 0
    For Each HTMLtag In HTMLtags
        Debug.Print HTMLtag.innerText & "Total(LTC)"
    Next HTMLtag

End Sub
Run Code Online (Sandbox Code Playgroud)

这是网站在完成代码时所说的内容:

Picture.this是这样的

这就是它应该是什么样子,当我手动输入数字时看起来:

Picture.this应该如何

我还用以下内容交换标记的部分:

HTMLobjekt.innerText = 100
Run Code Online (Sandbox Code Playgroud)

要么

HTMLobjekt.innerText = "100"
Run Code Online (Sandbox Code Playgroud)

要么

HTMLobjekt.Value = "100"
Run Code Online (Sandbox Code Playgroud)

但没有任何效果.

SIM*_*SIM 10

在采取任何主动之前,您需要确保页面已满载.我检查了动态生成的一个这样的类的可用性OrderBookPanel_text_33dbp.然后我完成了你试图做的其余事情.最后,Focus在将该金额放入占位符之前,您需要使用目标.应用以上所有内容,您的脚本应该更像如下:

Sub Get_Value()
    Dim HTML As HTMLDocument, tags As Object
    Dim tag As Object, ival As Object

    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .navigate "https://www.gdax.com/trade/LTC-EUR"
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set HTML = .document

        Do: Set tags = HTML.querySelector("[class^='OrderBookPanel_text_']"): DoEvents: Loop While tags Is Nothing
        Do: Set tag = HTML.querySelector("input[name='amount']"): DoEvents: Loop While tag Is Nothing
        tag.Focus
        tag.innerText = 100

        Set ival = HTML.querySelector("[class^='OrderForm_total_']")
        [A1] = ival.innerText
        .Quit
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

此时输出:

0.79139546
Run Code Online (Sandbox Code Playgroud)


ome*_*pes 5

不是一个完整的答案,只是一个方向。在浏览器(例如Chrome)中打开网页https://www.gdax.com/trade/LTC-EUR。单击以打开目标元素上的上下文菜单(下面的屏幕快照中的第1步),单击检查(2),从右侧打开的开发人员工具中您可以看到目标元素(3),并且连接了一堆事件侦听器瞄准目标(4)。处理程序之一是inputdocument节点级别。实际上,当事件从<input>节点冒泡时,此事件处理程序会更新金额。您可以通过删除所有其他事件处理程序(单击它们的Remove按钮)来轻松检查。但是,如果您特别删除此input处理程序(5),则不会进行任何更新(直到重新加载网页)。

F12

因此,要模拟用户活动,您需要创建此类input事件对象并将其分派到目标<input>节点。注意<input>节点和input控件事件是完全不同的,只是名称相同。

可以在调试器中跟踪IE中的事件处理程序执行情况。打开IE开发人员工具(按F12),转到“ 调试器”选项卡(下面的屏幕快照中的步骤1),“ 断点”选项卡(2),单击“ 添加事件断点”(3),选择输入事件(4)。现在,任何输入事件都将暂停代码执行并打开调试器窗口(5)。

调试器

如果您尝试在网页上输入金额文本框,调试器将显示事件处理程序功能代码:

处理程序

您可以继续执行(F5),也可以单步执行/结束/退出。要查看传递给该函数的事件对象,请arguments在控制台中键入,手动键入后将输出标准事件处理程序调用:

通过键入调用

我测试了以下测试代码以从VBA触发该事件:

Sub Test()

    Dim oEvt As Object

    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .Navigate "https://www.gdax.com/trade/LTC-EUR"
        Do While .ReadyState < 4 Or .Busy
            DoEvents
        Loop
        With .Document
            Do While IsNull(.querySelector("div.OrderForm_input-box_XkGmi input"))
                DoEvents
            Loop
            Set oEvt = .createEvent("Event")
            oEvt.initEvent "input", True, False, .parentWindow, 1
            With .querySelector("div.OrderForm_input-box_XkGmi input")
                .Focus
                .Value = "1000"
                .dispatchEvent oEvt
                Stop
            End With
        End With
    End With

End Sub
Run Code Online (Sandbox Code Playgroud)

结果,发生与手动键入金额绝对相同的动作。它的工作原理没有任何错误。但是道达尔(LTC)尚未更新。调试器也会暂停执行,事件对象的输出如下:

由VBA致电

唯一的区别是该isTrusted属性适用True于标准呼叫和False通过VBA进行的呼叫。我猜这就是为什么在处理程序代码中跳过更新的原因。我试图跟踪整个代码执行,直到事件处理程序完成为止,但是似乎这是一项巨大的逆向工程工作,我暂时不能花时间。

目前,我当时仍停留在调查中。