VBA Automation не работает на новой вкладке IE - PullRequest
0 голосов
/ 26 марта 2020

Это мой первый вопрос, и я новичок в VBA.

Я пытался запустить макрос для автоматизации некоторых процедур на IE. Мой макрос работал очень хорошо при открытии на другом windows, но когда я пытался запустить тот же макрос на вкладках, он не работал. Кажется (возможно) макрос не распознает фактическую вкладку. Кто-нибудь может мне помочь, пожалуйста?

Sub Test1()

    Dim IE As Object
    Dim doc As HTMLDocument
    Set IE = CreateObject("InternetExplorer.Application")

    For intRow = 1 To 3

    If intRow = 1 Then

        With IE
            .Visible = True
            .navigate "https://gru.inpi.gov.br/pePI/jsp/patentes/PatenteSearchBasico.jsp"

        Do While IE.Busy Or IE.readyState <> 4
            Application.Wait DateAdd("s", 1, Now)
        Loop

        Set doc = IE.document

            IE.document.getElementById("principal").Children(4). _
                getElementsByTagName("tbody")(0).getElementsByTagName("tr")(5). _
                getElementsByTagName("td")(1).getElementsByTagName("font")(0). _
                getElementsByTagName("input")(0).Value = "intRow"

                Application.Wait DateAdd("s", 2, Now)


        End With
    Else
        With IE
            .Visible = True
            .navigate "https://gru.inpi.gov.br/pePI/jsp/patentes/PatenteSearchBasico.jsp", 2048&

        Do While IE.Busy Or IE.readyState <> 4
            Application.Wait DateAdd("s", 1, Now)
        Loop

            .document.getElementById("principal").Children(4). _
                getElementsByTagName("tbody")(0).getElementsByTagName("tr")(5). _
                getElementsByTagName("td")(1).getElementsByTagName("font")(0). _
                getElementsByTagName("input")(0).Value = "intRow"

                Application.Wait DateAdd("s", 2, Now)

        End With    
    End If
    Next
End Sub

1 Ответ

0 голосов
/ 26 марта 2020

Судя по вашему коду и веб-сайту, вам нужно открыть несколько вкладок (с одним и тем же URL), а затем ввести значение в текстовое поле. Следует обратить внимание на следующий момент:

  1. Как получить доступ к элементам веб-страницы.
  2. Как переключать вкладки и фокусироваться на новой вкладке.

Чтобы получить доступ к элементам веб-страницы, из ресурса веб-страницы (используйте инструменты разработчика F12, чтобы проверить это), я заметил, что таблица содержит 6 строк, но последняя строка не содержит элемент ввода. Итак, используя ваш код, я не могу найти элемент ввода. Я обнаружил, что входные элементы содержат свойство класса. Итак, я предлагаю вам использовать метод getElementsByClassName для поиска элемента.

Чтобы переключить вкладку IE в браузере, мы могли бы l oop просмотреть открытые вкладки и сравнить URL, а затем установить фокус на соответствующей вкладке.

Более подробные шаги, пожалуйста, проверьте следующий пример кода:

 Sub Test1()

    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")

    Dim intRow As Integer
    For intRow = 1 To 3

    If intRow = 1 Then

        With IE
            .Visible = True
            .navigate "https://gru.inpi.gov.br/pePI/jsp/patentes/PatenteSearchBasico.jsp"

        Do While IE.Busy Or IE.readyState <> 4
            Application.Wait DateAdd("s", 1, Now)
        Loop

        Set doc = IE.document

            IE.document.getElementsByClassName("basic")(0).Value = "intRow" & intRow

            Application.Wait DateAdd("s", 3, Now)


        End With
    Else
        With IE
            .Visible = True
            .navigate "https://gru.inpi.gov.br/pePI/jsp/patentes/PatenteSearchBasico.jsp", 2048&

        Do While IE.Busy Or IE.readyState <> 4
            Application.Wait DateAdd("s", 1, Now)
        Loop

            Application.Wait DateAdd("s", 3, Now)
            Set IE = GetIE("https://gru.inpi.gov.br/pePI/jsp/patentes/PatenteSearchBasico.jsp")

            Application.Wait DateAdd("s", 3, Now)
            IE.document.getElementsByClassName("basic")(0).Value = "intRow" & intRow


        End With
    End If
    Next
End Sub


Function GetIE(sLocation As String) As Object

        Dim retVal As Object
        Dim my_url As String, my_title As String
        Set objShell = CreateObject("Shell.Application")
        IE_count = objShell.Windows.Count

        'loop through the window and find the tab


        For x = 0 To (IE_count - 1)
            On Error Resume Next
            'get the location and title
            my_url = objShell.Windows(x).document.Location
            my_title = objShell.Windows(x).document.Title

            'debug to check the value
            Debug.Print x
            Debug.Print my_url
            'find the special tab based on the title.
            If my_url Like sLocation Then
                Set retVal = objShell.Windows(x)
                'IE.Quit 'call the Quit method to close the tab.
                'Exit For   'exit the for loop
            Else
            End If
        Next

    Set GetIE = retVal

End Function

После запуска вышеуказанного скрипта откроются три вкладки и заполнится значение в тексте ввода Login. См. Следующий снимок экрана:

enter image description here

Ссылка:

Общие методы и свойства VBA, используемые в веб-автоматизации

...