IE Web Automation - Как автоматически выбрать значение из поля со списком, используя Excel VBA / XML Macro - PullRequest
0 голосов
/ 29 апреля 2018

Я новичок в VBA, и мне не удалось автоматически выбрать название страны в поле со списком веб-страниц или в списке в электронной таблице Excel. Мой код вводит только название страны, но не выбирает его. Как я могу изменить этот код, чтобы он мог выбрать название страны из моей электронной таблицы Excel и выбрать тот же в веб-поле со списком в качестве цикла. Номер паспорта, DOB и национальность указаны в моем коде. Если вы будете использовать вручную, вы можете найти номер разрешения на работу, который мне нужно записать в моей таблице. Снимок экрана Chrome Inspect Element прилагается.

Screenshot

Мой код выглядит следующим образом:

Sub MOL()
    Dim IE As New SHDocVw.InternetExplorer
    Dim Doc As MSHTML.HTMLDocument
    Dim Buttons As MSHTML.IHTMLElementCollection
    Dim Button As MSHTML.IHTMLElement
    Dim HTMLInput As MSHTML.IHTMLElement
    Dim Tags As MSHTML.IHTMLElement
    Dim HTMLTables As MSHTML.IHTMLElementCollection
    Dim HTMLTable As MSHTML.IHTMLElement
    Dim HTMLRow As MSHTML.IHTMLElement
    Dim HTMLCell As MSHTML.IHTMLElement
    Dim Alltext As IHTMLElementCollection

Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
'Application.EnableEvents = False

On Error Resume Next

    IE.Visible = True
    IE.navigate "https://eservices.mol.gov.ae/SmartTasheel/Complain/IndexLogin?lang=en-gb"

Do While IE.readyState <> READYSTATE_COMPLETE: Loop

Set Doc = IE.document
Set Buttons = Doc.getElementsByTagName("Button")
Buttons(2).Click
Do While IE.readyState <> READYSTATE_INTERACTIVE = 3: Loop
Set HTMLInputs = Doc.getElementsByTagName("Input")
    HTMLInputs(46).Value = "somevalue"
    HTMLInputs(48).Value = "24/02/1990"
    HTMLInputs(47).Value = "India"
Buttons(21).Click
End Sub

1 Ответ

0 голосов
/ 29 апреля 2018

Решение, которое вы ищете, немного сложно найти. Есть несколько хитростей, чтобы выбрать NATIONALITY из выпадающего списка. Я использовал .querySelector() в скрипте, чтобы сделать его кратким. Тем не менее, он должен служить вашей цели независимо от того, какую страну вы хотите выбрать из выпадающего списка. Дайте ему шанс:

Sub GetInfo()
    Dim IE As New InternetExplorer, HTML As HTMLDocument, post As Object, URL$

    URL = "https://eservices.mol.gov.ae/SmartTasheel/Complain/IndexLogin?lang=en-gb"

    With IE
        .Visible = True
        .navigate URL
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set HTML = .document

        HTML.getElementById("TransactionInfo_WorkPermitNumber").innerText = "2659558"
        HTML.querySelector("button[ng-click='showEmployeeSearch()']").Click

        Application.Wait Now + TimeValue("00:00:03")  ''If for some reason the script fails, make sure to increase the delay

        HTML.getElementById("txtPassportNumber").Value = "J2659558"
        HTML.getElementById("Nationality").Focus
        For Each post In HTML.getElementsByClassName("ng-scope")
            With post.getElementsByClassName("ng-binding")
                For I = 0 To .Length - 1
                    If .item(I).innerText = "INDIA" Then ''you can change the country name here to select from dropdown
                        .item(I).Click
                        Exit For
                    End If
                Next I
            End With
        Next post
        HTML.getElementById("txtBirthDate").Value = "24/02/1990"
        HTML.querySelector("button[onclick='SearchEmployee()']").Click
    End With
End Sub

Ссылка для добавления в библиотеку:

Microsoft Internet Controls
Microsoft HTML Object library

Когда вы выполняете вышеуказанный скрипт, он должен дать вам желаемый результат.

Другой способ - использовать запрос xmlhttp, который намного быстрее, чем IE. Вам необходимо передать аргументы query string parameter в качестве словаря через запрос "POST". Если вы хотите изменить параметр, как в birth date, passport или nationality, просто сделайте это в QueryString. Кстати, параметр Nationality должен быть заполнен value вместо name, как, 100 для INDIA. Вот как должен выглядеть ваш скрипт:

Sub Get_Data()
    Dim res As Variant, QueryString$, ID$, Name$

    QueryString = "{""PersonPassportNumber"":""J2659558"",""PersonNationality"":""100"",""PersonBirthDate"":""24/02/1990""}"

    With New XMLHTTP
        .Open "POST", "https://eservices.mol.gov.ae/SmartTasheel/Dashboard/GetEmployees", False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .setRequestHeader "Content-Type", "application/json"
        .send QueryString
        res = .responseText
    End With

    ID = Split(Split(Split(res, "Employees"":")(1), "ID"":""")(1), """,")(0)
    Name = Split(Split(Split(res, "Employees"":")(1), "OtherData2"":""")(1), """}")(0)

    [A1] = ID: [B1] = Name
End Sub

Ссылка для добавления в библиотеку:

Microsoft XML, V6.0

Запустив вышеуказанный скрипт, вы должны получить NAME и ID требуемого поиска.

...