VBA:访问加载了AngularJS的div内的元素

时间:2016-06-03 18:20:32

标签: javascript html angularjs vba automation

我被卡住了,在VBA中我想访问使用AngularJS的页面上的HTML元素,

所有这些元素都“存在”,因为我在使用IE调试工具时看到它们。它们都在父div中,类叫做“cont”。

问题:

当我查看网站的源代码时,此div为空。我只能看到结构,即:

 <div 
        class="cont"
        data-ng-controller=".."
        ..
        data-ng-init="initApplication()">
</div>

但内部没什么..它可能是在角度之后加载的。

因此,当我尝试访问此div中的按钮时,例如:

Set IE = CreateObject("InternetExplorer.Application")
IE.document.getElementsById("submitBtn").click

然后我得到一个错误,说该对象不存在..

所以我之前尝试添加:

' wait until IE and the page are ready
Do While .Busy Or Not .readyState = 4: DoEvents: Loop
' wait until the DOM is ready
Do Until .document.readyState = "complete": DoEvents: Loop

但没有任何作用,我根本不明白,是否可以访问此div内的HTML元素?为什么我在调试工具中看到evthg?

任何想法??

更新

我发现div的内容位于.js文件中,有数百万的东西,但有:

angular.module("cont").factory("applicationService",["$rootScope","ngDialog","webService",
function(a,b,c){
    "use strict";
     var d={},
     e="home";
     d.initApplication=function(){
          return c.initContact()
     }

还有:

angular.module("cont").run(["$templateCache",function(a){"use     strict";
a.put("Application",'ALL THE CONTENT IS HERE (with an HTLM element I would like to click)!!!!!'

1 个答案:

答案 0 :(得分:0)

源代码中不存在元素,因为它们尚未由javascript创建。您可以使用F12看到它们,因为当您在页面上使用调试器工具时,javascript已运行并创建了元素。

考虑这个javascript片段:

var btn = document.createElement("BUTTON");

在javascript运行之前,页面没有按钮。代码运行后,元素存在,您将能够与它进行交互。我怀疑你的代码试图让submitBtn在创建该按钮的javascript之前运行。

如果没有看到创建按钮的脚本,我最好的建议是Do While .Busy Or Not .readyState = 4: DoEvents: Loop就像你已经做过的那样,但是然后开始测试是否存在这样的按钮(不可否认的是不优雅的方法):

'Declare Sleep at the top of you code module
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds as Long)

Sub mySub()
    Dim objButton as Object
    'Code creating nd automating IE here
    Do While .Busy Or Not .readyState = 4: DoEvents: Loop
    'May possibly need On Error Resume Next here
:TryAgain
    Set objButton = IE.document.getElementsById("submitBtn")
    If objButton Is Nothing Then 
        Sleep 1000 'Wait for 1 second
        GoTo TryAgain
    End If
    'On Error GoTo 0 if you needed resume next
    'At this point objButton is something, so let's try clicking it
    objButton.Click
End Sub

不幸的是,当javascript运行时,没有一个事件被触发,所以我们不得不等待它完成。

如果javascript不会运行,除非你做某事(例如,点击,移动鼠标,按键等),你可以使用.execScript强制脚本运行regalrdless 。有关详细信息,请参阅此SO帖子:How to call javascript function in VBA