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)
这是网站在完成代码时所说的内容:
这就是它应该是什么样子,当我手动输入数字时看起来:
我还用以下内容交换标记的部分:
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)
不是一个完整的答案,只是一个方向。在浏览器(例如Chrome)中打开网页https://www.gdax.com/trade/LTC-EUR。单击以打开目标元素上的上下文菜单(下面的屏幕快照中的第1步),单击检查(2),从右侧打开的开发人员工具中您可以看到目标元素(3),并且连接了一堆事件侦听器瞄准目标(4)。处理程序之一是input在document节点级别。实际上,当事件从<input>节点冒泡时,此事件处理程序会更新金额。您可以通过删除所有其他事件处理程序(单击它们的Remove按钮)来轻松检查。但是,如果您特别删除此input处理程序(5),则不会进行任何更新(直到重新加载网页)。
因此,要模拟用户活动,您需要创建此类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)尚未更新。调试器也会暂停执行,事件对象的输出如下:
唯一的区别是该isTrusted属性适用True于标准呼叫和False通过VBA进行的呼叫。我猜这就是为什么在处理程序代码中跳过更新的原因。我试图跟踪整个代码执行,直到事件处理程序完成为止,但是似乎这是一项巨大的逆向工程工作,我暂时不能花时间。
目前,我当时仍停留在调查中。