Второй выпадающий список в HTML не выбирается через VBA

#html #vba #web-scraping

#HTML #vba #очистка веб-страниц

Вопрос:

Мой код VBA не может выбрать второй выпадающий вариант после выбора первого выпадающего списка. Не уверен, почему загружается один выпадающий список, а второй не отвечает в соответствии с приведенным ниже кодом? Признателен, если вы могли бы помочь исправить это. С уважением

 Dim IE As InternetExplorer

Dim HTMLDoc As HTMLDocument

Dim commodityStr As String
Dim commodityObj As HTMLObjectElement
Dim commodityCodes As IHTMLElementCollection
Dim codeCounter As Long
Dim EDateStr As String
Dim EDateObj As HTMLObjectElement
Dim EdateCodes As IHTMLElementCollection

Dim i As Integer




commodityStr = "MADHYA PRADESH"
EDateStr = "REWA"

Set IE = New InternetExplorer

With IE
    .Visible = True
    .navigate "http://hydro.imd.gov.in/hydrometweb/(S(ryta1dvaec5pg03bdnxa5545))/DistrictRaifall.aspx"
    While .Busy Or .readyState <> READYSTATE_COMPLETE: Wend
    Set HTMLDoc = IE.document
End With

Set commodityObj = HTMLDoc.getElementById("listItems")


For codeCounter = 0 To commodityObj.Length - 1
    If commodityObj(codeCounter).innerText = commodityStr Then
        commodityObj.Value = commodityObj(codeCounter).Value


           commodityObj.Focus
           commodityObj.FireEvent ("onchange")
            While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
       Exit For
 End If
 Next



Set EDateObj = HTMLDoc.getElementById("DistrictDropDownList")


For codeCounter = 0 To EDateObj.Length - 1
    If EDateObj(codeCounter).innerText = EDateStr Then
       EDateObj.Value = EDateObj(codeCounter).Value
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
commodityObj.Focus
commodityObj.FireEvent ("onchange")
     Exit For
End If
Next
  

Ответ №1:

Вам нужен временной цикл, позволяющий выполнить это событие onchange. Кроме того, вы можете использовать селекторы css attribute = value для удаления циклов при нацеливании на элементы. Вероятно, страница выполняет запрос XHR, поэтому проверьте с помощью инструментов разработки, чтобы убедиться, что это так.

 Option Explicit

'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub MakeSelections()
    Dim ie As InternetExplorer, ele As Object, t As Date
    Const MAX_WAIT_SEC As Long = 5
    Dim commodity As String, iDate As String

    commodity = "MADHYA PRADESH"
    iDate = "REWA"

    Set ie = New InternetExplorer

    With ie
        .Visible = True
        .Navigate2 "http://hydro.imd.gov.in/hydrometweb/(S(3qitcijd521egpzhwqq3jk55))/DistrictRaifall.aspx"

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

        .document.querySelector("[value='" amp; commodity amp; "']").Selected = True
        .document.querySelector("[name=listItems]").FireEvent "onchange"
        t = Timer
        Do
            On Error Resume Next
            Set ele = .document.querySelector("[value='" amp; iDate amp; "']")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While ele Is Nothing

        If Not ele Is Nothing Then
            ele.Selected = True
            .document.querySelector("#GoBtn").Click
        Else
            Exit Sub
        End If
        Stop
        .Quit
    End With
End Sub
  

Комментарии:

1. Отличный QHarr! Большое спасибо за ваши усилия по исправлению этого.

2. Но моя конечная цель этого кодирования — не нацеливаться на какие-либо конкретные элементы. Но для запуска циклов и извлечения данных всех элементов в форму Excel. Если бы вы могли мне помочь, это было бы очень полезно!. Еще раз большое спасибо за ваше время и усилия.

3. Например, поместите ваши переменные в массивы и выполните циклическое присвоение идентификатору и товару в этих циклах.

4. Спасибо QHarr! Это отличный вклад для меня.