如何使用Excel VBA自动化动态更改的网页?

时间:2015-02-20 06:06:48

标签: vba excel-vba excel

自从两周以来,我一直在尝试自动化网页,但在第3页后我无法继续进行。

首先,我通过提供凭据登录登录页面,然后点击第2页的链接。在此之前,我很好;但在那之后我又需要点击第3页上我无法做到的另一个链接,即使我无法阅读该特定页面的正确innerhtmlinnerhtmal与该页面的源代码不同。使用源代码我已经使用id / name来获取元素但没有用。我看到的问题是DOCUMENT对象没有采用第3页的内部细节。当我尝试打印该页面的链接时,它在该页面中打印了一些常用链接,这些链接将在所有页面中可用,而不是打印该特定页面中的所有链接。我想这可能会发生,因为页面框架相对于FromDate&至今。如果我错了,请原谅我。我们是否需要每次改变" ie.document"关于网页导航的对象?因为我认为第一次加载页面时它会坚持不变。

以下是我的代码:

Public Sub Test ()

    Dim shellWins As ShellWindows
    Dim ie As InternetExplorer
    Dim doc As HTMLDocument
    Dim frm As HTMLFrameElement
    Dim frms As HTMLElementCollection
    Dim strSQL As String
    Dim Login As Boolean

    strSQL = "https://website.com"   

    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .Navigate strSQL

        Do Until .ReadyState = 4: DoEvents: Loop
            Set doc = ie.document

            Dim link As Object

        For Each link In doc.Links
            'Debug.Print link.innerText
             If link.innerText = "Click Here" Then
                link.Click
                Exit For
             End If
        Next link                   

           Do While ie.Busy: DoEvents: Loop

Login_Pane:

    For Each link In doc.Links
       If link.innerText = "Leave & Attendance" Then
           'Debug.Print doc.body.innerHTML
           link.Click
           Login = True
          Exit For
         End If
    Next link

      If Login <> True Then
        Application.Wait (Now + TimeValue("00:00:02"))
        Application.SendKeys "<USERNAME>", True
        Application.SendKeys "{TAB}"
        Application.Wait (Now + TimeValue("00:00:02"))
        Application.SendKeys "<PASSWORD>", True
        Application.SendKeys "{ENTER}"
        GoTo Login_Pane
       End If

     Do While ie.Busy: DoEvents: Loop

      Dim link As Object

    For Each link In doc.Links
        Debug.Print link.innerText 

        ' Above line code should print all the links in that page_
          _but unfortunatly it is not displaying as it is in the source code.
        ' instead printing half of the links which are commonly_ _available in all pages. 
        ' This page has three frames

    Next link


      End With
      'IE.Quit
End Sub

我无法发布该页面的图片以使您了解更多,无论如何我会尽力而为。

当我使用下面的代码时,我只能从页面的上半部分获取链接。

设置doc = ie.document          昏暗的文本作为对象           对于每个文本在doc.Links中             Debug.Print text.innerText         下一个文字

在页面的该部分下方,我可以选择输入FromDate&amp; ToDate,通过给这个文本框提供日期,我将能够根据日期查看详细信息(默认情况下,页面显示从当月的第一天到当月的当前日期的详细信息)。

所以,我在这里没有得到链接/或其他细节。我认为这部分的细节不存储在ie.document对象中。 仅此特定部分与主页面具有不同的URL。

感谢。

1 个答案:

答案 0 :(得分:0)

有几点想法:

  1. 对于动态加载的页面,您需要使用Application.Wait(5秒左右)而不是Do Until .ReadyState = 4: DoEvents: Loop。如果你正在执行javascript,后者不起作用。
  2. 应始终避免使用SendKeys,因为它不健壮。请使用DOM资源管理器检查元素以获取ID或名称。