在VBA中是否有办法获取由javascript生成的元素?

时间:2012-08-05 22:21:11

标签: javascript html ajax vba

我一直在谷歌侦探工作几个小时(包括搜索StackOverflow),以获得一种技术,允许在VBA中定位JavaScript生成的HTML元素。

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

然而,该方法非常能够在google.com上测试静态页面上查找元素。

我玩简单地从Document.body获取所有InnerText,然后解析文件以获得我想要的TD值,但是当我尝试拆分不同行上的两个值时遇到了障碍。作为说明,Split(..)将以下内容理解为“2040”:

20
40

根据我的理解,getElementById(id)的问题是网页的表是在页面加载后由JavaScript生成的,因此我的VBA代码无法将该JavaScript创建的任何元素作为目标。反正有没有我的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”并且列标题是“开放”,则构建的ID是:“dt1_NGU12_open”,它是包含市场NGU12的“开放”值的TD元素的ID。

1 个答案:

答案 0 :(得分:1)

正如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中手动加载页面并添加包含以下内容的书签:

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')};})())