IE отбирает код VBA, пример поиска информации о рейсе - PullRequest
0 голосов
/ 05 мая 2019

Очень благодарен, если вы можете помочь мне создать / исправить приведенный ниже код для поиска информации о рейсе из https://www.webjet.com.au/flights/ с использованием VBA IE DOM.
Предположим, я ищу рейс 30 мая из Дубая в Лондон.

A) сначала я могу заполнить город, но он не выбран из сохраненного раскрывающегося внутреннего списка
B) как заполнить дату и другую информацию (количество путешественников, класс) из раскрывающегося списка?

Dim ie As SHDocVw.InternetExplorer
Dim htmlInput As MSHTML.IHTMLElement
Dim htmlbuttons As MSHTML.IHTMLElementCollection
Dim htmlbutton As MSHTML.IHTMLElement
Dim htmlAs As MSHTML.IHTMLElementCollection
Dim htmlA  As MSHTML.IHTMLElement
Dim htmldoc As MSHTML.HTMLDocument

Set ie = New SHDocVw.InternetExplorer
ie.Visible = True
ie.Navigate ("https://www.webjet.com.au/flights/")

Do While ie.ReadyState <> READYSTATE_COMPLETE
Loop

Debug.Print ie.LocationName, ie.LocationURL

Set htmldoc = ie.Document

Set htmlInput = htmldoc.getElementById("departure-airport")

htmlInput.Value = "Dubai" 
'     << need help here how input will search for full city and airport name from its drop down list

Set htmlInput = htmldoc.getElementById("destination-airport")
htmlInput.Value = "london" ' << need help here how input will search for full city and airport name from its drop down list

'      ** addional code needed to choose number of passenger, class and date.

For Each htmlA In htmlAs   ' this code to choose one way or two way which is fine..

    If i = 32 Then
        htmlA.Click
        Exit For
    End If

    i = i + 1
Next htmlA

Set htmlbutton = htmldoc.getElementById("search-btn")
htmlbutton.Click

1 Ответ

0 голосов
/ 05 мая 2019

XHR:

Вы можете использовать xhr и имитировать POST-запрос, который делает страница для получения информации о рейсе. Ваш выбор, например количество взрослых, пункт назначения ..... перейти в POST тела. Вы получаете ответ json со всей информацией. Я использую этот парсер json для обработки ответа и генерирования объекта json для работы.

Исследуйте ответ json здесь .

Ниже приведен 1 взрослый и обратно, Дубай, все аэропорты, Лондон, все выбранные аэропорты, эконом. Вы можете объединить значения для ваших критериев поиска.


Сравнение снимков json, возвращенных из запроса POST (показывает часть для первого этапа полета в Лондон через Кигали

enter image description here


Option Explicit
Public Sub GetFlights()
'install code from https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas  to a module in project
'VBE > Tools > References > Add reference to Microsoft Scripting Runtime
    Dim json As Object
    Dim body As String
    body = "{""TripType"":""Return"",""Adults"":""1"",""Children"":""0"","
    body = body & """Infants"":""0"",""Class"":""Economy"","
    body = body & """FlightStops"":[{""CityFromCode"":""DXB"",""CityToCode"":""LON"",""DepartureDate"":""2019-05-30"",""ReturnDate"":""2019-06-01"",""TsaAirportFromCode"":""DXBALL"",""TsaAirportToCode"":""LON""}],"
    body = body & """ShowMixAndMatch"":false,""Locale"":""en-AU""}"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "POST", "https://flights.webjet.com.au/api/HybridSearch/GetFlightSearchResults?instart_disable_injection=true", False
        .setRequestHeader "Accept", "application/json, text/plain, */*"
        .send body
        Set json = JsonConverter.ParseJson(.responseText)
    End With
    Stop
End Sub

Internet Explorer:

Вы можете установить даты с помощью javascript (для сохранения записи)

 Option Explicit    
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub GetPrices()
    Dim ie As New InternetExplorer
    With ie
        .Visible = True
        .Navigate2 "https://www.webjet.com.au/flights/"

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

        With .document
           With .querySelector("#departure-airport")
               .Focus
               .Value = "Dubai, United Arab Emirates - All Airports (DXB)"
           End With

           Application.Wait Now + TimeSerial(0, 0, 1)

           With .querySelector("#destination-airport")
               .Focus
               .Value = "London, United Kingdom - All Airports (LON)"
           End With

           Application.Wait Now + TimeSerial(0, 0, 1)

           With .querySelector("#ft-dates-return")
               .Focus
               .Value = "Thu 30 May 2019 - Tue 4 Jun 2019"
               .FireEvent "onchange"
           End With

           .parentWindow.execScript "document.querySelector('#ft-hidden-check-in-date-return').value = 'Thu 30 May 2019';"
           .parentWindow.execScript "document.querySelector('#ft-hidden-check-out-date-return').value = 'Tue 4 Jun 2019';"
           .parentWindow.execScript "document.querySelector('#ft-hidden-popover-date-return').value = 'Thu 30 May 2019 - Tue 4 Jun 2019';"

           Application.Wait Now + TimeSerial(0, 0, 1)

           .querySelector("#zsl-button-search").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend
        Stop
        .Quit
    End With
End Sub

Со взрослыми, детьми ....

Option Explicit

'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub GetPrices()
    Dim html As HTMLDocument, ie As New InternetExplorer
    Set html = New HTMLDocument
    Const ADULTS As Long = 2
    Const CHILDREN As Long = 2
    Const INFANTS As Long = 1 'infants cannot be greater than number of adults
    With ie
        .Visible = True
        .Navigate2 "https://www.webjet.com.au/flights/"

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

        With .document
           With .querySelector("#departure-airport")
               .Focus
               .Value = "Dubai, United Arab Emirates - All Airports (DXB)"
           End With

           Application.Wait Now + TimeSerial(0, 0, 1)

           With .querySelector("#destination-airport")
               .Focus
               .Value = "London, United Kingdom - All Airports (LON)"
           End With

           Application.Wait Now + TimeSerial(0, 0, 1)

           With .querySelector("#ft-dates-return")
               .Focus
               .Value = "Thu 30 May 2019 - Tue 4 Jun 2019"
               .FireEvent "onchange"
           End With

           .parentWindow.execScript "document.querySelector('#ft-hidden-check-in-date-return').value = 'Thu 30 May 2019';"
           .parentWindow.execScript "document.querySelector('#ft-hidden-check-out-date-return').value = 'Tue 4 Jun 2019';"
           .parentWindow.execScript "document.querySelector('#ft-hidden-popover-date-return').value = 'Thu 30 May 2019 - Tue 4 Jun 2019';"

           Application.Wait Now + TimeSerial(0, 0, 1)

           .querySelector("#button-passengers .zsl-caret-down").Click

           Do
               .querySelector("[aria-label='Increase adult passengers']").Click
           Loop Until .querySelector("#number-of-adults") = ADULTS

           Do
               .querySelector("[aria-label='Increase child passengers 2-11 years old']").Click
           Loop Until .querySelector("#number-of-children") = CHILDREN

           Do
               .querySelector("[aria-label='Increase infant passengers less than 2 years old']").Click
           Loop Until .querySelector("#number-of-infants") = IIf(INFANTS > ADULTS, ADULTS, INFANTS)


           Application.Wait Now + TimeSerial(0, 0, 1)

           .querySelector("#zsl-button-search").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend
        Stop
        .Quit
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...