От EXCEL VBA Нажмите кнопку в Интернете

Я использую VBA в Excel, и я пытаюсь получить доступ к веб-странице, а затем нажмите на ссылку, чтобы вызвать загрузку CSV на моем ПК.

С VBA я могу открыть IE и получить доступ к необходимой веб-странице. Но после проверки HTML-кода страницы (F12) и использования getElementsByClassName и других методов я не могу создать кликабельный объект, который инициирует загрузку из моего кода.

Sub Automate_IE_Enter_Data() 'Это загрузит веб-страницу в IE. Dim я As Long Dim URL-адрес как строка Dim IE как объект Dim objElement как объект Dim objCollection как объект Dim HWNDSrc As Long

'Create InternetExplorer Object
Set IE = CreateObject("InternetExplorer.Application")

'Set IE.Visible = True to make IE visible, or False for IE to run in the background
IE.Visible = True

'Define URL
'URL = "https://www.automateexcel.com/excel/vba"
URL = "https://www.barchart.com/futures/quotes/ZWF9|530P/price-history/historical"

'Navigate to URL
IE.Navigate URL

' Statusbar let user know website is loading
Application.StatusBar = URL & " is loading. Please wait..."

' Wait while IE loading...
'IE ReadyState = 4 signifies the webpage has loaded (the first loop is set to avoid inadvertantly skipping over the second loop)
'Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop

'Webpage Loaded
Application.StatusBar = URL & " Loaded"

'Get Window ID for IE so we can set it as activate window
HWNDSrc = IE.hWnd
'Set IE as Active Window
SetForegroundWindow HWNDSrc

Set IEAppColl = IE.Document.getElementsByClassName("bc-glyph-download")(0)

IEAppColl.Click

Application.Wait Now + TimeValue ("00:00:10")

SetForegroundWindow HWNDSrc

Application.Wait Now + TimeValue ("00:00:05")

End Sub

Ожидается: 1) Откройте в IE следующий URL: https://www.barchart.com/futures/quotes/ZWF9|530P/price-history/historical 2) Нажмите ссылку "max" в разделе ежедневных цен, чтобы загрузить CSV файл

1) в порядке 2) выдает ошибку: объект не поддерживает это свойство или метод.

Я не знаю, как повторить нажатие ссылки "max" в моем коде VBA. Не уверен, что я использую правильное имя.

+1
источник поделиться
4 ответа

Этот сайт не позволит вам загрузить CSV, если вы не вошли в систему. Указанный вами класс связан с jQuery, который проверяет ваш статус входа и выдает ошибку, если вы этого не делаете. Чтобы скачать его через Excel, вам сначала нужно зайти на сайт и создать учетную запись, затем написать код для входа в систему, затем загрузить CSV, и это должно работать. Я не знаю точного синтаксиса для этого, но, надеюсь, это укажет вам правильное направление.

Также я бы порекомендовал попробовать Selenium. Это популярное программное обеспечение для веб-сканирования, поэтому легко найти помощь в этом.

+1
источник

С IE - вы можете просто использовать следующее, чтобы начать загрузку при условии, что вход в систему не запрошен.

ie.document.querySelector("[data-ref=historical]").Click

Более длинная версия логина:

Хорошо, что вырвало ужас за ужасом как с IE, так и с Selenium, включая данные для входа, не принятые (для IE), которые были обнаружены как бот, страницы не найдены, ошибки, сгенерированные после входа в систему, устаревшие ссылки на элементы, элемент не активируется... ужасная война, которую я успешно вел, чтобы получить загрузку. Утром я посмотрю, смогу ли я найти лучший путь.

Option Explicit
Public Sub Download()
    Dim d As WebDriver
    Set d = New ChromeDriver
    Const URL = "https://www.barchart.com/futures/quotes/ZWF9%7C530P/price-history/historical"
    Const JS_WAIT_CLICKABLE = _
    "var target = this, endtime = Date.now() + arguments[0];" & _
    "(function check_clickable() {" & _
    "  var r = target.getBoundingClientRect(), x = r.left+r.width/2, y = r.top+r.height/2;" & _
    "  for (var e = document.elementFromPoint(x , y); e; e = e.parentElement)" & _
    "    if (e === target){ callback(target); return; }" & _
    "  if (Date.now() > endtime) { callback(target); return; }" & _
    "  setTimeout(check_clickable, 60);" & _
    "})();"                                      'by @florentbr

    With d
        .Start "Chrome"
        .get URL, timeout:=100000
        .FindElementByCss("[data-ref=historical]").Click

        With .FindElementsByCss("input.form-input")
            .item(1).SendKeys "name"
            .item(2).SendKeys "password"
        End With
        .FindElementByCss("[value=GO]").Click
        .GoBack
        .GoBack
        Application.Wait Now + TimeSerial(0, 0, 5)
        With .FindElementByCss("[data-ref=historical]")
            .ExecuteAsyncScript(JS_WAIT_CLICKABLE, 10000) _
        .Click
        End With
        .Quit
    End With
End Sub
+1
источник

Уже будучи авторизованным на Сайте, мы решили первую проблему. Таким образом, код открывает веб-сайт ОК и не запрашивает логин, поскольку он регистрируется автоматически. Тогда код также теперь нажимает синюю ссылку "max" (в разделе ЕЖЕДНЕВНЫЕ ЦЕНЫ).

Оставшаяся проблема: после нажатия появляется подсказка: "Хотите открыть или сохранить filename.csv с Barchart.com?"

Я хочу, чтобы код выбирал SAVE, но не уверен, как это сделать... использование SendKey не помогает! Я также изменил настройки безопасности в IE, так как это приглашение кажется вызвано браузером, а не веб-сайтом... идеи, пожалуйста? благодарю вас

0
источник

[! [Веб-приглашение после нажатия максимальной ссылки

Пожалуйста, смотрите прикрепленную картинку, которая показывает подсказку оранжевым цветом после того, как мой код нажмет на макс. Ссылку. (рядом с диапазоном) Мне нужно пропустить этот шаг и сохранить непосредственно... спасибо] 1 ] 1

Пожалуйста, смотрите прикрепленную картинку, которая показывает подсказку оранжевым цветом после того, как мой код нажмет на макс. Ссылку. (рядом с диапазоном) Мне нужно пропустить этот шаг и сохранить непосредственно... спасибо

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос