VBA передать то есть элемент в функцию - PullRequest
1 голос
/ 25 октября 2019

Поскольку у меня возникают трудности с надежной проверкой ie.busy и ie.readystate для проверки загрузки веб-страницы, у меня есть функция, которая проверяет наличие определенного элемента для подтверждения загрузки страницы.

Приведенный ниже код работает, но неуклюже, потому что мне нужно иметь отдельную функцию для каждой вызываемой страницы, которую я хочу проверить. В идеале я хотел бы передать строку "ie.document.getElementsByClassName (" clearfix одного столбца в форме контейнера ") (0) .innerText" в функцию в качестве параметра, чтобы функцию можно было использовать для любой веб-страницы,но я не могу понять, как это сделать.

Большое спасибо

Function checkLoginUrl(ie As Variant, strMessageContent As String, compareString As String) As Boolean

        EndTime = Now + TimeValue("00:00:22")
        Application.Wait (Now + TimeValue("00:00:01")) 'wait a bit to start with as code falls here as too quick

        'get the value of the element we are monitoring
        dd = ie.document.getElementsByClassName("container centered-form single-column clearfix")(0).innerText

        Do While dd = ""
            DoEvents
            'recheck the value we are monitoring
            dd = ie.document.getElementsByClassName("container centered-form single-column clearfix")(0).innerText
            Printlog (Now & " - " & dd & " - and waited 3 secs")
            Application.Wait (Now + TimeValue("00:00:03"))
            If StartTime > EndTime Then
                Printlog ("Tried to log on for 22 seconds without success")
            Exit Do
            End If
        Loop

        'so dd should be populated now so check
        If dd Like "*" & compareString & "*" Then

            Printlog (strMessageContent & " loaded successfully")

            retval = True
        Else
            Printlog (strMessageContent & " failed to load")
            retval = False

        End If

    launchUrl = retval

End Function

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Возможно, ознакомьтесь с css-селекторами , где вы можете указать шаблон для сопоставления с узлом в виде строки, которую вы затем передаете функции. Просто немного воспользуйтесь функцией и убедитесь, что вы используете последовательное именование. В настоящее время вы не возвращаетесь из своей функции из-за того, что переменная конца присваивания имеет другое имя. Для большей гибкости также передайте время ожидания как параметр.

Непосредственными преимуществами является то, что вам не нужно беспокоиться обо всех различных цепочечных методах (getElementsBy ....), и вы используете метод, который современенбраузеры оптимизированы для.

Option Explicit
Public Sub test()
    Dim ie As New InternetExplorer, url As String, result As Boolean
    Dim strMessageContent As String, compareString As String
    Const MAX_WAIT_SEC As Long = 10

    url = "https://example.com"

    With ie
        .Visible = True
        .Navigate2 "url"

        While .Busy Or .readyState < 4: DoEvents: Wend

        cssSelector = ".container.centered-form.single-column.clearfix"

        result = checkLoginUrl(ie, cssSelector, strMessageContent, compareString, MAX_WAIT_SEC) 'you might consider renaming 'result' as 'found' _
                               and move the final If statement out the function and have it following here ......

        Stop
        .Quit
    End With
End Sub

Public Function checkLoginUrl(ByVal ie As Object, ByVal cssSelector As String, ByVal strMessageContent As String, compareString As String, ByVal MAX_WAIT_SEC As Long) As Boolean
    Dim t As Date, ele As Object, dd As String, found As Boolean

    t = Timer
    Do
        On Error Resume Next
        Set ele = ie.document.querySelector(cssSelector)
        dd = ele.innerText
        found = InStr(dd, compareString) > 0
        On Error GoTo 0
        If Timer - t > MAX_WAIT_SEC Then Exit Do
    Loop Until found

    If found Then
        Printlog strMessageContent & " loaded successfully"
    Else
        Printlog "Tried to log on for " & MAX_WAIT_SEC & " seconds without success"
        Printlog strMessageContent & " failed to load"
    End If
    checkLoginUrl = found
End Function
0 голосов
/ 25 октября 2019

Возможно ли сохранить значение ie.document.getElementsByClassName ("clearfix контейнера с центрированной формой в одном столбце") (0) .innerText в переменной и передать строковый аргумент в вашу функциюдобавив еще один строковый параметр в функцию, как показано ниже?

Function checkLoginUrl(ie As Variant, strMessageContent As String, compareString As String, element as string) As Boolean

Дайте мне знать, если я что-то не так понял из вашего описания выше. Я постараюсь исправить себя.

...