VBA中有没有一种方法可以获取javascript生成的元素

Is there a way in VBA to get elements produced by javascript?

本文关键字:javascript 获取 元素 方法 有没有 一种 VBA      更新时间:2023-09-26

我已经在谷歌上做了几个小时的侦探工作(包括搜索StackOverflow),寻找一种可以在VBA中定位JavaScript生成的HTML元素的技术。

例如,我不能对此使用ie.Document.getElementById(id):http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&模式=i

然而,正如在谷歌网站上测试的那样,这种方法能够在静态页面上找到元素

我曾经尝试过简单地从Document.body中获取所有InnerText,然后解析文件以获得我想要的TD值,但在尝试拆分不同行上的两个值时遇到了障碍。例如,Split(..)将以下内容理解为"2040":

20
40

据我所知,getElementById(id)的问题在于,网站的表是在页面加载后由JavaScript生成的,因此由该JavaScript创建的任何元素都不能成为我的VBA代码的目标。有没有让我的VBA代码看到这个JavaScript生成的内容?

谢谢你的帮助!

编辑

正在使用的VBA代码:

Function Quote(Market, Parameter)
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Navigate "http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&mode=i"
    While ie.Busy
        DoEvents
    Wend
    Dim id As String
    id = "dt1_" & Market & "_" & StrConv(Parameter, vbLowerCase)
    Quote = ie.Document.getElementByID(id).InnerText
    ie.Quit
End Function

基本上,我尝试使用Market的列标题来构建HTML元素ID。因此,例如,如果市场为"NGU12",列标题为"Open",则构建的ID为:"dt1_NGU12_Open",这是包含市场NGU12的"Open"值的TD元素的ID。

正如Tim所提到的,在尝试访问时,静态和动态生成的内容之间应该没有区别。试试这个:

Function Quote(Market, Parameter)
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Navigate "http://www.kisfutures.com/electronic.html?page=quote&sym=NGU12&mode=i"
    While ie.Busy
        DoEvents
    Wend
    Application.Wait Now + TimeSerial(0,0,1) 'Pause 1 second, hopefully
                                             'the dynamic content is 
                                             'generated within this 
                                             'time-frame
    Dim id As String
    id = "dt1_" & Market & "_" & StrConv(Parameter, vbLowerCase)
    Quote = ie.Document.getElementByID(id).InnerText
    ie.Quit
End Function 

有更好的方法可以停止执行(请参阅Windows Sleep API),但如果您需要更细粒度的控制,我将把它留给您。

此外,如果你想在页面生成后测试是否存在特定的id,你可以在IE中手动加载页面,并添加一个包含以下内容的书签作为URL:

javascript:void((function() {var a = document.getElementById(prompt('Please enter an id to test','dt1_NGU12_open')); if (a) {alert('Element found');} else {alert('Element not found')};})())