使用 vba 从网页的下拉列表中选择值

Selecting value from a dropdown list on a webpage using vba

this site 上,我可以从下拉菜单中 select 国家和语言,但是当我单击 "Complete new application form" 按钮时。它说字段是空的。

如有任何帮助,我们将不胜感激。

Sub Test()

strURL = "https://visa.kdmid.ru/PetitionChoice.aspx"

  With ie
    .Visible = True
    .navigate strURL

    While .Busy
        DoEvents
    Wend

    Set html = .document

    'Country where you will apply for visa.
    Set ctY = html.getElementById("ctl00$phBody$Country")
    For i = 1 To ctY.Options.Length
        If ctY.Options(i).Text = "NETHERLANDS" Then
            ctY.selectedIndex = i
            Exit For
        End If
    Next i

    'Select Language
    Set lnG = html.getElementById("ctl00$phBody$ddlLanguage")
    For i = 1 To lnG.Options.Length
        If lnG.Options(i).Text = "ENGLISH" Then
            lnG.selectedIndex = i
            Exit For
        End If
    Next i

    'Click I have read instructions check box
    html.getElementById("ctl00$phBody$cbConfirm").Click


    'Click apply button
    Set btnGo = html.forms(0).all("ctl00$phBody$btnNewApplication") 
    btnGo.Click

  End With

  End Sub

所以你是在正确的轨道上,但如果你查看网站的 HTML,实际上有两个元素与国家选择 - 你得到了第一个,'ctl00_phBody_Country',但是这个实际上只是下拉菜单,实际选择的值存储在 'ctl00_phBody_cddCountry_ClientState' 中...语言部分具有类似的结构。最后,可接受的值不仅仅是您在下拉列表中看到的国家/地区名称,它实际上是下拉列表中的国家/地区代码和国家/地区名称的组合....

示例代码见下方:

Public Sub Test()
Dim IE As InternetExplorer
Dim HTMLDoc As HTMLDocument

Dim countryStr As String
Dim countryObj As HTMLObjectElement
Dim countryCodes As IHTMLElementCollection
Dim codeCounter As Long
Dim languageStr As String
Dim languageObj As HTMLObjectElement
Dim languageCodes As IHTMLElementCollection

countryStr = "Netherlands"
languageStr = "English"

Set IE = New InternetExplorer

With IE
    .Visible = False
    .Navigate "https://visa.kdmid.ru/PetitionChoice.aspx?AspxAutoDetectCookieSupport=1"
    While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Wend
    Set HTMLDoc = IE.document
End With

Set countryObj = HTMLDoc.getElementById("ctl00_phBody_cddCountry_ClientState")
Set countryCodes = HTMLDoc.getElementById("ctl00_phBody_Country").getElementsByTagName("option")
For codeCounter = 0 To countryCodes.Length - 1
    If countryCodes(codeCounter).innerText = UCase(countryStr) Then
        countryObj.Value = countryCodes(codeCounter).Value & ":::" & countryCodes(codeCounter).innerText & ":::"
        While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
        Exit For
    End If
Next

Set languageObj = HTMLDoc.getElementById("ctl00_phBody_cddLanguage_ClientState")
Set languageCodes = HTMLDoc.getElementById("ctl00_phBody_ddlLanguage").getElementsByTagName("option")
For codeCounter = 0 To languageCodes.Length - 1
    If languageCodes(codeCounter).innerText = UCase(languageStr) Then
        languageObj.Value = languageCodes(codeCounter).Value & ":::" & languageCodes(codeCounter).innerText & ":::"
        While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
        Exit For
    End If
Next

HTMLDoc.getElementById("ctl00$phBody$cbConfirm").Click
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
HTMLDoc.getElementById("ctl00_phBody_btnNewApplication").Click      'Launch Form

IE.Quit
Set IE = Nothing
End Sub