为什么我只能以编程方式访问第一个加载的页面?

时间:2014-06-04 01:50:26

标签: vba internet-explorer webautomation

我对一些VBA代码有一个非常奇怪的问题。代码是InternetExplorer自动化,它非常简单:我只需要加载页面,输入凭据并单击另一页上的按钮(成功登录后)。

但是......我的代码无效(但仅限于我在AWS上的某台机器上)。在我的本地机器上,这段代码工作正常。

奇怪的是它接缝我只能访问第一个加载页面的Document属性(我需要输入登录名/密码)。我的意思是从MyBrowser.Document属性我可以在加载起始页时看到所有INPUT字段。但成功登录后(IE窗口可见),我会看到来自INPUT属性的相同 MyBrowser.Document字段!另外(正如我所说)我对这个代码在另一个机器上没有任何问题。

禁用IE保护模式(这是IE 11)。我认为这是某种安全问题,但我不能自己找到它......

这是我的代码:

'MyBrowser is IE instanse 
'Here I'm loading start page and input login/password
'Next the browser show me another page where I need to click a button
'But Debug messages show me input fields for the first Form!

Application.Wait (Now + TimeValue("0:00:05"))
    Do
    DoEvents
    Loop Until MyBrowser.ReadyState = READYSTATE_COMPLETE

Set HTMLDoc = MyBrowser.Document
For Each myHTML_Element In HTMLDoc.getElementsByTagName("INPUT")
If myHTML_Element.Type = "submit" And myHTML_Element.Name = "BUTTONNEWJOBS" Then myHTML_Element.Click: Exit For
Debug.Print myHTML_Element.Name
Next

更新 我不知道为什么,但我的浏览器对象总是Busy,这就是我得到旧页面HTML的原因。我试着.Stop但没有运气。

2 个答案:

答案 0 :(得分:1)

我没有IE11自动化的答案,只是提示您选择行走的路径。

另一个Stack Overflow问题Getting source of a page after it's rendered in a templating engine?提供了一些浏览器自动化选项。

由于IE11的行为改变,上述工具之一目前已经破坏了对IE11的支持,请参阅http://docs.seleniumhq.org/about/platforms.jsp#browsers。阻止问题有some configuration hints您可能会觉得有用。

在我看来,从渲染兼容性,可编程性甚至不同版本的自动化问题的角度来看,Internet Explorer始终是最不可靠的工具。虽然多年来它已经有所改进,但是从程序员的角度来看,仍然可以避免使用Internet Explorer。今天幸运的是它不是唯一可用的工具。

因此,如果您只是需要完成工作,可以使用其他浏览器或类似浏览器的工具。

如果你必须使用IE,那么你应该在Internet Explorer Dev Center → Community → Developer forums

得到答案

编辑(评论后)

根据您问题中的症状,由于某些对话框(可能是安全提示)正在向用户显示,因此浏览器对象看起来很忙。谷歌的一些链接可能有所帮助:

重写~1000行代码以使用另一个自动化界面(或浏览器)并在Microsoft的Internet Explorer开发中心寻求帮助是IMO仍然有效的选项

答案 1 :(得分:0)

基于您的以下陈述

  

我在MyBrowser.Document属性中看到了相同的INPUT字段!

看起来页面还没有完全加载。也许它是通过AJAX加载数据并单击提交按钮显示完全相同的页面(这可以解释为什么你看到相同的INPUT字段),同时等待来自服务器的响应。

测试此方法的一种简单方法是等待更长的时间(例如30秒)并忽略浏览器ReadyState的值。然而,更好的方法是循环,直到您在成功页面上找到不在第一页上的元素,可能超时可能为30秒。

我已经使用Selenium做了一些自动化并遇到了类似的问题而不得不求助于使用Implicit Waits但是我不确定VBA是否是这样的功能(因为我不知道VBA)< / p>