我被卡住了,在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)!!!!!'
答案 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