Как разместить фокус и нажать кнопку «Отправить» с помощью VBA в Excel? - PullRequest
1 голос
/ 01 мая 2020

Я новичок в веб-скребинге и VBA, но хочу учиться дальше. Я имею в виду небольшой проект и делаю это постепенно, по одному шагу за раз. У меня есть небольшой кусок кода в модуле Excel, который почти работает. Я просто не могу заставить его отправить текст в поле поиска. У меня в основном есть пример имени лошади в ячейке A2 в моей рабочей таблице Excel. Код открывает сайт, а также вводит текст в поле поиска. Я просто не могу заставить его нажать кнопку Go. Буду признателен за любую помощь и объяснение того, что я делаю неправильно, поэтому я могу избежать этого снова!

При проверке кнопки Go на сайте, HTML выглядит следующим образом:

Мой код:

Sub HorseSearch()

    'define objIE
    Dim objIE As InternetExplorer
    'create an instance objIE
    Set objIE = New InternetExplorer
    'make web page visible
    objIE.Visible = True

    'navigate objIE to this web page
    objIE.navigate "https://www.britishhorseracing.com/racing/horses/racehorse-search-results/"

    'wait here a few seconds while the browser is busy
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    'in the search box put cell "A2" value which holds a horse name Tiger Roll
    objIE.document.getElementById("text-search").Value = Sheets("Sheet1").Range("A2").Value

    'place focus on the Go button
    objIE.document.getElementById("Submit").Focus

    'click the 'go' button
    objIE.document.getElementById("Submit").Click

End Sub

1 Ответ

1 голос
/ 01 мая 2020

Улучшение вашего кода

Ваша проблема в том, что при нажатии кнопки «Отправить» она не активируется. Вы должны включить это. Если вы наблюдаете это, кнопка отправки становится активной, когда вы вручную вставляете текст в поле ввода длиной более 3 символов. Ваш код вставляет текст, изменяющий атрибут значения поля ввода, но он не вызывает событие «onchange». Используя инструменты веб-разработчика в Chrome, я увидел, что поведение формы (поле ввода и кнопка отправки) встроено в jQuery.

Одним из возможных решений может быть использование objIE.Document.parentWindow.ExecScript "jQuery(""#text-search"").trigger(""change"")" после вставки значения и перед нажатием на кнопку отправки.

Вот полный код:

Sub HorseSearch()

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

    Dim obJe As InternetExplorer
    Set objIE = New InternetExplorer
    'make web page visible
    objIE.Visible = True

    'navigate objIE to this web page
    objIE.navigate "https://www.britishhorseracing.com/racing/horses/racehorse-search-results/"

    'wait here a few seconds while the browser is busy
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    'in the search box put cell "A2" value which holds a horse name Tiger Roll

    objIE.Document.getElementById("text-search").Value = Sheets("Sheet1").Range("A2").Value
    On Error Resume Next
    objIE.Document.parentWindow.ExecScript "jQuery(""#text-search"").trigger(""change"")"
    On Error GoTo 0

    'click the 'go' button
    objIE.Document.getElementById("Submit").Click


End Sub

Другое решение

Зачем использовать форму, когда мы можем прямо go на страницу результатов? Страница результатов выглядит примерно так: https://www.britishhorseracing.com/racing/horses/racehorse-search-results/#!?pagenum=1&q=tiger%20roll&rated=false

, где значение параметра q - это текст, который вы вводите в поле ввода. Мы могли бы перейти непосредственно к этой странице (используя значение из ячейки A22 для параметра q в URL).

Sub HorseSearch()

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

    Dim obJe As InternetExplorer
    Set objIE = New InternetExplorer
    'make web page visible
    objIE.Visible = True

    'navigate objIE to this web page
    objIE.navigate "https://www.britishhorseracing.com/racing/horses/racehorse-search-results?pagenum=1&q=" & Sheets("Sheet1").Range("A2").Value & "&rated=false"

    'wait here a few seconds while the browser is busy
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    'You have loaded the result page :)

End Sub
...