用于HTML集成的Excel VBA程序参考登录后的登录屏幕

用于HTML集成的Excel VBA程序参考登录后的登录屏幕,html,excel,vba,web-scraping,Html,Excel,Vba,Web Scraping,我有一个网站,我正试图通过Excel与VBA集成。我关闭了登录过程,但在程序登录后,它仍然会引用登录屏幕,例如,当我查找所有“div”标记名时。这似乎是因为网站没有传统意义上的负载;无论单击什么,地址都是相同的,如果您运行: Do DoEvents Loop Until ie.readystate = 4 单击按钮登录后,第一次迭代将点击4 在一个似乎与此相关的问题中,登录后的操作会很好地引用登录屏幕的HTML文本。这是我的密码: Sub WebpageFiller() Dim ie As S

我有一个网站,我正试图通过Excel与VBA集成。我关闭了登录过程,但在程序登录后,它仍然会引用登录屏幕,例如,当我查找所有“div”标记名时。这似乎是因为网站没有传统意义上的负载;无论单击什么,地址都是相同的,如果您运行:

Do
DoEvents
Loop Until ie.readystate = 4
单击按钮登录后,第一次迭代将点击4

在一个似乎与此相关的问题中,登录后的操作会很好地引用登录屏幕的HTML文本。这是我的密码:

Sub WebpageFiller()
Dim ie As SHDocVw.InternetExplorer
Set ie = New SHDocVw.InternetExplorer
ie.Visible = True
ie.navigate "(website here)"
Do
DoEvents
Loop Until ie.readyState = 4
'varUsername = InputBox("Username?")
'varPassword = InputBox("Password?")
varUsername = "(username)"
varPassword = "(password)"
Call ie.document.getElementById("txtUsername").setAttribute("value", varUsername)
Call ie.document.getElementById("txtPassword").setAttribute("value", varPassword)
Call ie.document.getElementById("btnLogin").Click

Application.Wait (Now + TimeValue("00:00:05"))
Do
DoEvents
Loop Until ie.readyState = 4
ie.Refresh
Debug.Print ("refresh passed")
Do
DoEvents
Loop Until ie.readyState = 4
Application.Wait (Now + TimeValue("00:00:05"))

Dim i As Integer
i = 0
Set divElements = ie.document.getElementsByTagName("div")
Do Until divElements(i).Title = "Collapse menu"
i = i + 1
Loop
divElements(i).Click

End Sub
第一部分(通过单击“btnLogin”)工作得很好,但即使我等待几秒钟,远比加载下一个页面所需的时间长,divElements循环也会引用登录页面的HTML。此外,“ie.Refresh”命令甚至不起作用。不知何故,它只工作了一次,当它工作时,它刷新了页面,其他一切都进行得很顺利

如果我以令人困惑的方式询问或格式化此内容,我深表歉意。这是我的第一篇帖子,我会积极主动地回答问题和编辑内容,让一切变得更加清晰。任何帮助都将不胜感激

以下是登录后的HTML片段:

[页面标题]
文件。写(“”);
文件。写(“”);
$(文档).ready(函数(){
storeSecurityProfile({
methodName:'GetSecurityLevel当前用户'
,视图字段:“SecurityViewText”
,levelField:'SecurityLevel'
});
var params=getQueryStringParameters();
$.each(参数,函数(参数名,参数值){
params[paramName.toLowerCase()]=paramValue;
});
var path=params.p;
删除params.p;
var controlName=params.uc;
删除params.uc;
var loadType=params.loadType;
删除params.loadtype;
var title=replaceAll(参数title,'%20','';
var numload=0;
$('#ucHeader').fetchSmartControl({
onLoad:function(){
numload++;
onLoad();
}
});
$(“#菜单”).fetchSmartControl({
onLoad:function(){
numload++;
onLoad();
}
});
$('#ucFooter').fetchSmartControl({
onLoad:function(){
numload++;
onLoad();
}
});
函数onLoad(){
如果(numload==3){
Layout.fixContentHeight();
if(路径和控制名){
//gkb 04/22/16-仅在动态异步加载菜单时相关
//如果(IsMenuLoaded的类型==='function'){
////检查n次(以x为间隔)以查看动态菜单是否已完成加载
////-如果在n次尝试中加载菜单,请尝试加载传入的路径/控件名的菜单项
////-如果在n次尝试中未加载菜单,或者如果在加载的菜单中未找到路径/控件名,请使用路径/控件名加载ucMainContent
//var numatempts=0;
//var=5;
//var区间=500;
//var menuLoaded;
//TryLoadMenuItem();
//}
//否则{
//LoadMainContent();
//}
TryLoadMenuItem();
函数TryLoadMenuItem(){
setTimeout(函数(){
//gkb 04/22/16-仅在动态异步加载菜单时相关
//menuLoaded=IsMenuLoaded();
menuLoaded=true;
numtempts++;
if(menuLoaded){
var pageLoaded=LoadMenuItem(路径、控制名、{
params:params
,loadType:loadType
});
如果(!pageLoaded){
LoadMainContent();
}
}
else if(numtempts
所以我似乎找到了解决这个问题的方法,这很奇怪。当我登录到这个网站时,会打开第二个版本的IE,可以在Tas中看到
Dim i As Variant
i = 0
Dim Get_IE_Window2 As SHDocVw.InternetExplorer
Set Get_IE_Window2 = Nothing
Dim newIe As Object
Dim Shell As Object
Set Shell = CreateObject("Shell.Application")
Debug.Print (Shell.Windows.Count)
While i < Shell.Windows.Count And Get_IE_Window2 Is Nothing
    Set newIe = Shell.Windows.Item(i)
    If Not newIe Is Nothing Then
        Debug.Print newIe.LocationURL, newIe.LocationName
        If TypeName(newIe) = "IWebBrowser2" Then
            If TypeOf newIe Is SHDocVw.InternetExplorer And newIe.LocationURL <> "[login page url]" And InStr(newIe.LocationURL, "file://") <> 1 Then
                Set Get_IE_Window2 = newIe
            End If
        End If
    End If
    i = i + 1
Wend
Set ie = Get_IE_Window2