Есть ли лучший способ выполнить sh этот l oop? - PullRequest
0 голосов
/ 18 февраля 2020

Я довольно новичок в VBA, но я старался составить программу для своей команды. Этот кусок кода работает большую часть времени, но иногда зависает. Я не могу понять, почему он иногда зависает и работает прекрасно в большинстве случаев, поэтому сейчас я пытаюсь найти лучший способ выполнить sh этот oop. Я знаю, что этот метод зацикливания не лучший способ сделать что-то, но не уверен, как выполнить задачу.

Моя веб-страница работает в веб-приложении PEGA, а собственные индикаторы состояния готовности IE всегда «готовы», поэтому я должен использовать маркеры состояния готовности веб-приложения.

Кто-нибудь может мне помочь?

Public Sub WaitingForRS()
' FIND THE C360 WINDOW
        Marker = 0
        Set objShell = CreateObject("Shell.Application")
        IE_count = objShell.Windows.Count
        For x = 0 To (IE_count - 1)
            On Error Resume Next
            my_url = objShell.Windows(x).Document.Location
            my_title = objShell.Windows(x).Document.title

            If my_title Like "Coverage User" & "*" Then
                Set C360Window = objShell.Windows(x)
                Marker = 1
                Exit For
            Else
            End If
        Next

        If Marker = 0 Then
            MsgBox ("C360 window is not found. Please ensure C360 is open in Internet Explorer and try again")
        Else
        End If

'FIND THE READY STATE INDICATOR
    RSIndicatorDocMarker = 0
    RSIndicatorDataMarker = 0
    Set RSIndicatorPage = C360Window.Document
    Set RSIndicatorClass = RSIndicatorPage.getelementsbyclassname("document-statetracker")(0)

RSIndicatorCheck:
'CHECK THE READY STATE DOC STATUS
    If RSIndicatorClass.getattribute("data-state-doc-status") = "ready" Then
        RSIndicatorDocMarker = 1
        Else: RSIndicatorDocMarker = 0
    End If

'CHECK THE READY STATE
    If RSIndicatorClass.getattribute("data-state-busy-status") = "none" Then
        RSIndicatorDataMarker = 1
        Else: RSIndicatorDataMarker = 0
    End If

'Compare the RSIndicators
    If RSIndicatorDataMarker = 1 And RSIndicatorDocMarker = 1 Then

    Else: GoTo RSIndicatorCheck
    End If
End Sub

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Возможно, попробуйте использовать OnTime вместо жесткого l oop, который у вас есть:

Public Sub WaitingForRS()

    Dim win As Object
    Dim w As Object, el, ready As Boolean, idle As Boolean

    For Each w In CreateObject("Shell.Application").Windows
        If w.Name Like "*Internet*" Then
            If w.Title Like "Coverage user*" Then
                Set win = w
                Exit For
            End If
        End If
    Next

    If Not win Is Nothing Then

        Set el = win.document.getelementsbyclassname("document-statetracker")(0)
        ready = (el.getattribute("data-state-doc-status") = "ready")
        idle = (el.getattribute("data-state-busy-status") = "none")

        If ready And idle Then
            ProceedWithNextSteps win 'do whatever comes next: pass in the window
        Else
            'wait for a while then try again
            Application.OnTime Now + TimeSerial(0, 0, 1), "WaitingForRS"
        End If

    Else
        MsgBox "Window not found!"
    End If

End Sub

Возможно, вы захотите добавить ограничение по времени, чтобы оно не повторялось бесконечно, если страница не " готов".

0 голосов
/ 18 февраля 2020

Ознакомьтесь с моим ответом на этот пост. Excel VBA. Отправка данных через IE в онлайн-формах MS не работает

@ Подзаголовок Idea 5. Функция WaitForLoadSETx () имеет ручное превышение времени и двойное значение l oop, чтобы помочь определить состояние.

Это было лучшее, что я мог сделать в VBA с объектом IE. В идеале вы хотите изучить Selenium, Phantom JS или Puppeteer для реальных манипуляций с браузером. Есть, конечно, классные приложения, которые в дополнение к этим библиотекам были созданы людьми (регистратор кукловодов chrome add in)

Или, чтобы сохранить вещи в Excel, используйте простой объект XMLHTTPRequest, чтобы вырезать браузер из уравнение, и иметь дело исключительно с запросом / ответом с веб-страницы. Это хорошая альтернатива, поскольку она позволяет сосредоточиться на извлечении содержимого html в текстовом виде без Javascript или в ожидании загрузки страницы.

...