你好 StackOverflow 社区,
我有一个关于使用 Access VBA 操作 IE 的问题。
本质上,我正在尝试编写代码,使用 IE 打开特定网页,在该页面中搜索特定链接(目标链接的名称将取决于用户的情况),通过以编程方式单击该链接导航到新页面链接,然后通过在生成的新页面上查找特定链接/元素来重复该过程。
最终目标链接的显示文本始终相同,但其所在的页面在每种情况下都会不同。
我的问题是以编程方式搜索第二级页面中驻留的元素...即使在浏览器加载了新链接之后,我的结果仍然只提供第一级页面中的元素。
如果到目前为止我在描述问题的背景方面做得不好,我深表歉意。
我的代码本质上如下:
Dim ie As Object, ieDoc As HTMLDocument
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
strHTML = "http://targetsite.com/first-level_page"
ie.navigate strHTML
'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
'define first-level target link and search for it and then "click" it
Dim i As Integer
Dim txt As String, link As String, p As String
Set ieDoc = ie.Document
txt = "First-Level Target"
Do Until link = txt Or i >= 1000
i = i + 1
link = ieDoc.Links(i).outerText
Loop
'I know the above loop is not exactly ideal in its current form, but it does give me a working first attempt at the functionality I'm trying to build.
ieDoc.Links(i).Click
到目前为止,一切都很好。上面的代码按预期工作。在所有情况下,它都能正确导航到所需的第二级页面。当我尝试在二级页面中搜索最终目标元素时,我会出错:
'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
'Search for final target element (which always has the same name and anchor text on all second-level pages)
ieDoc.getElementsByName("final-target-name").Item.Click
如果我尝试在第一级页面上使用上面的行(基于 .getElementsByName),则效果很好。但一旦我导航到任何二级页面,它就什么也不做。我还尝试将其替换为上面搜索第一级页面上的链接的循环的修改版本。相同的结果。
作为故障排除步骤,我还用 debug.print 命令替换了该行,以简单地命名第二级页面上的所有元素,并且这始终返回第一页中的元素名称。
我认为很明显,在我点击第一个链接后,我无法正确更新或重新定义我的 HTML 文档。我已将 ieDoc 设置为空,然后将其重新设置为 ie.document,但这也不起作用。
希望有一个我根本不知道的简单命令或语法。但在我的一生中,我一直无法让 VBA 在单击第一个链接后正确引用页面上存在的 HTML 元素。
预先感谢您的任何建议!
~JQN