От EXCEL VBA Нажмите кнопку в Интернете - PullRequest
0 голосов
/ 27 декабря 2018

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

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

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

'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's 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.Не уверен, что я использую правильное имя.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

С 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
0 голосов
/ 27 декабря 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...