Я экспериментирую с веб-автоматизацией и немного пытаюсь использовать раскрывающийся список.
Мой код работает до момента поиска названия компании и нажатия «перейти». На новой странице я не могу найти правильный код, который выбирает группу элементов, представляющих раскрывающийся список. Затем я хочу выбрать «100» записей, но я даже не могу захватить узлы, представляющие этот список.
Я просматривал несколько разных страниц в stackoverflow, на которых рассказывается о селекторах CSS, и просматривал учебные пособия, но, похоже, это тоже не помогает. Либо я ничего не получаю, либо то, что я захватываю, не может использовать метод getElementsByTagName, который в конечном итоге я пытаюсь развернуть в узлах td и select. Пока не знаю, что с ними делать, но я даже не могу их взять. Мысли?
(обратите внимание, что линия остановки — это просто строка, на которой я использую точку останова, чтобы остановить свой код)
Вспомогательный сайт CSS: https://www.w3schools.com/cssref/trysel.asp
Код:
Option Explicit
Sub test()
On Error GoTo ErrHandle
Dim ie As New InternetExplorer
Dim doc As New HTMLDocument
Dim ws As Worksheet
Dim stopLine As Integer
Dim oSearch As Object, oSearchButton As Object
Dim oForm As Object
Dim oSelect As Object
Dim list As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
ie.Visible = True
ie.navigate "https://www.sec.gov/edgar/searchedgar/companysearch.html"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set oSearch = doc.getElementById("companysearchform")
Set oSearchButton = oSearch.getElementsByTagName("input")(1)
Set oSearch = oSearch.getElementsByTagName("input")(0)
oSearch.Value = "Summit Midstream Partners, LP"
oSearchButton.Click
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set doc = ie.Document
Set list = doc.querySelectorAll("td select")
stopLine = 1
Exit Sub
ErrHandle:
MsgBox Err.Number & " - " & Err.Description, vbCritical
Exit Sub
End Sub
Вы оставили достаточно долго ждать? Выполнить построчно с F8
разве это не то, для чего предназначен второй набор цикла «выполнить события»? После того, как я нажимаю «Поиск», он ждет, пока следующая веб-страница будет готова, правильно?


td select вернет один узел, поэтому вам нужен только querySelector. У узла есть идентификатор, поэтому вы можете использовать более быстрый querySelector("#count") для нацеливания на родителя select. Чтобы изменить параметр, вы можете использовать SelectedIndex для родительского выбора или выбрать дочерний параметр по его атрибуту valuequerySelector("[value='100']").Selected = True. Затем вам может потребоваться прикрепить и вызвать change/onchange htmlevent к родителю select, чтобы зарегистрировать изменение.
Однако я бы просто извлек CIK компании из текущей страницы, а затем объединил параметр count=100 с URL-адресом и .Navigate2, используя следующий формат:
https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001549922&type=&dateb=&owner=include&count=100&search_text=
Вы можете извлечь CIK после того, как первоначальная поисковая компания нажмет и дождется загрузки страницы, с помощью:
Dim cik As String
cik = ie.document.querySelector("[name=CIK]").value
ie.Navigate2 "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK = " & cik & "&type=&dateb=&owner=include&count=100&search_text = "
Учитывая, что несколько параметров оставлены пустыми, вы, вероятно, можете сократить до:
"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK = " & cik & "&owner=include&count=100"
Если вы не можете получить первоначальный выбор родителя, вам, вероятно, понадобится цикл по времени, ожидающий появления этого элемента после нажатия кнопки поиска. Пример показан здесь в ответе StackOverflow.
таймер, казалось, исправил это - спасибо!. просто из любопытства, в чем разница между событиями и таймером? Теоретически я бы предположил, что они являются почти избыточными функциями, при этом doevents более надежны, потому что они фактически ожидают состояния от объекта ie, а не просто ждут произвольное количество времени, пока объект не будет равен ничему.
Таймер связан с циклом до тех пор, пока не будут выполнены указанные вами условия выхода. DoEvents- Обеспечивает выполнение, чтобы операционная система могла обрабатывать другие события. У вас должны быть условия ожидания загрузки страницы Whilst ie.Busy или Ie.ReadyState <> 4. Для динамических страниц это не гарантирует загрузку всего содержимого.
Set list = doc.querySelector("#count"), похоже, ничего не возвращает, когда я смотрю на окно местных жителей в Excel.