Hello 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设置为no,然后将其重新设置为ie.document,但这也不起作用。
希望有一个简单的命令或语法,我根本不知道。但是对于我的生活,我没有能够在点击第一个链接后让VBA正确引用页面上存在的HTML元素。
提前感谢任何建议!
〜JQN
答案 0 :(得分:2)
您需要使用@Matteo NNZ和@TimWilliams
的组合如果你知道&#34; id&#34;元素的名称更容易使用getElementsByName(&#34; target&#34;)。
如果你不知道&#34; id&#34;然后循环锚元素并搜索正确的文本。这缩小为仅链接或元素。
Set Anchors = IeDoc.getElementsByTagName("a")
然后循环比较.outertext或您需要的任何子字段。
@TimWilliams: 您需要加载找到的URL,然后在循环中设置新加载的IeDoc。设置&#34; ie&#34;反对新的&#34; ie&#34;加载页面,否则&#39; ie&#39;对象将正确保留第一页加载。 当您找到链接时,您需要像以前一样加载新页面。
'' throw away the first page loaded.
ie = nothing
IeDoc = nothing
'' Set the new page loaded.
ie.navigate newHTML
'wait for browser
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
Set IeDoc = ie.Document
对第二页重复上述过程
以下是一些关于在vba中解析HTML的其他资源&#39;: http://www.ozgrid.com/forum/showthread.php?t=184695 Parse HTML content in VBA
答案 1 :(得分:0)
在这种特殊情况下,我能够在HTML方面解决问题,尽管我认为@Matteo NNZ,@ TimWilliams和@durbo发布的答案一般都可以解决Access / VBA方面的问题。再次感谢所有花时间回应的人!