.ReadyState & .Busy не ждет загрузки страницы IE - PullRequest
0 голосов
/ 06 июня 2019

У меня есть какой-то VBA для запуска интранет-сайта компании, который приведет меня непосредственно к документу, который я ищу. Мне нужно дождаться окончания загрузки страницы, а затем нажать кнопку «Печать», которая откроет документ на вкладке IE, поддерживаемой Adobe Reader, и оттуда я сохраню его в формате PDF на диске.

Моя проблема в том, что цикл, который я должен ждать до загрузки веб-страницы, не ожидает должным образом. Проведя некоторое исследование SO, я обнаружил, что это известная проблема с более новыми версиями IE. С тех пор я пытался поиграть с некоторыми XMLHTTP методами, но я не знаком с ними, и мои попытки с ним также не увенчались успехом (не уверен, как перейти на следующую страницу, нажав ссылку «Печать» с помощью XMLHTTP).

Мой текущий VBA выглядит следующим образом, а ieApp равен New InternetExplorerMedium.

    Set objShell = CreateObject("Shell.Application")
    IE_Count = 0
    IE_Count = objShell.Windows.Count
    For x = 0 To (IE_Count - 1)
        On Error Resume Next
        my_url = ""
        my_title = ""
        my_url = objShell.Windows(x).Document.Location
        my_title = objShell.Windows(x).Document.Title

        If my_url Like "http://ctdayppv002/Home/DocViewer?" & "*" Then
            Set ie = objShell.Windows(x)
            Do While ieApp.ReadyState <> 4 And ie.Busy
                DoEvents
            Loop
            For Each ee In ie.Document.getElementsByTagName("a")
                If ee.ID = "printDocLink" Then
                 ee.Click: DoEvents: Sleep 1500
                    Do While ie.ReadyState <> 4 And ie.Busy
                        DoEvents
                    Loop
                 Exit For
                End If
            Next ee
            Exit For
        Else
        End If
    Next

Если я добавлю кучу Sleep времени, то он будет ждать, пока не появится документ, превышающий время, которое я сказал ему Sleep, так что, очевидно, это не надежное решение.

Используя следующие вопросы для справки, я попытался использовать XMLHTTP, но также заметил комментарии о том, что этот метод может не работать с сайтами JavaScript.

VBA висит на ie.byy и готовность проверить

просмотр веб-страниц с использованием vba с использованием XMLHTTP

Одна из моих попыток с XMLHTTP:

Public ieApp As MSXML2.XMLHTTP60
Set ieApp = New MSXML2.XMLHTTP60

    With ieApp

        .Open "GET", urlString, False
        .send

        While ieApp.ReadyState <> 4
            DoEvents
        Wend

        Dim HTMLDoc As MSHTML.HTMLDocument
        Dim HTMLBody As MSHTML.HTMLBody

        Set HTMLDoc = New MSHTML.HTMLDocument
        Set HTMLBody = HTMLDoc.body
        HTMLBody.innerHTML = ieApp.responseText
        Debug.Print HTMLBody.innerHTML

    End With

В полученном HTMLBody.innerHTML я не вижу элемента "printDocLink".

К вашему сведению - я отправил электронное письмо представителю компании, которая создала базу данных веб-сайта, и они не верят, что существует вызов API, который может напрямую экспортировать в формате PDF, который, как я надеялся, будет доступен для пропуска " Кнопка «Печать» целиком.

1 Ответ

0 голосов
/ 07 июня 2019

Следуя советам Тима Уильямса и QHarr, я нашел решение, которое работает для меня.

Я добавил Do Until, а также таймер на 6 секунд:

            t = Now + TimeValue("0:00:6")
            Do Until .Document.getElementById("printDocLink") <> 0
                DoEvents: Sleep 1000
                If Now > t Then
                    Call Not_Found_PPV(N, searchitem)
                    .Quit
                    Set ieApp = Nothing
                    GoTo NxtInv
                End If
            Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...