на этой домашней странице "http://www.kpia.or.kr/index.php/year_sugub"
Если вы проверите html, есть 6 идентификаторов от li1 до li6. Первое, что я заметил после первого использования chromedriver, это неэффективность метода ожидания. Поэтому я искал различные способы оптимизировать ожидание после нажатия в Интернете для использования на этой домашней странице. Например, я применил следующие три вида кодирования.
ex1) Приложение. Подождите сейчас + TimeSerial (0, 0, 5)
ex2) .FindElementById("li2", тайм-аут: = 10000) .Click
ex3) 'Do' DoEvents 'При ошибке Возобновить Далее' Установить ele = .FindElementById ("li2") 'При ошибке Перейти к 0 'Если Таймер - t = 10, Затем Выйти Выполнить' ‹== Во избежание бесконечного цикла 'Цикл, пока ele Is Ничего
Однако мы не смогли окончательно найти способ оптимизировать метод ожидания без использования Application.Wait Now + TimeSerial(0, 0, 5). Этот метод загружается не полностью после нажатия li2, но иногда выполняются дополнительные задачи.
Итак, я подумал о формальной логике кодирования, которую я мог бы время от времени использовать для написания аналогичного кода в будущем, и придумал следующую логику. Например, в li2 значение этилена всегда является фиксированным значением со значением результата, поэтому, если вы нажмете на li2, а затем найдете значение «SM», данные будут загружены на лист. Далее, «LDPE» в li3 — это способ вставки данных на лист после завершения загрузки. Итак, я кодирую эту идею и не могу решить ошибку, пока работаю над VBA.
Dim d As WebDriver, ws As Worksheet, clipboard As Object
Set d = New ChromeDriver
Set ws = ThisWorkbook.Worksheets("Sheet3")
Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Const URL = "http://www.kpia.or.kr/index.php/year_sugub"
Dim html As HTMLDocument
Set html = New HTMLDocument
With d
.AddArgument "--headless"
.Start "Chrome"
.get URL, Raise:=False
rep:
.FindElementById("li2", timeout:=10000).Click
Dim Posts As WebElements
Dim elem As WebElements
Dim a1 As Integer
For Each Posts In .FindElementsByClass("bbs")
For Each elem In Posts.FindElementsByCss("td")
If Not elem.Text = "SM" Is Nothing Then
html.body.innerHTML = d.PageSource
Dim tarTable As HTMLTable
Dim hTable As HTMLTable
For Each tarTable In html.getElementsByTagName("table")
If InStr(tarTable.className, "bbs") <> 0 Then
Set hTable = tarTable
End If
Next
clipboard.SetText .FindElementById("table_body").Attribute("outerText")
clipboard.PutInClipboard
else
goto rep
end if
.Quit
End With
Если он находит значение, совпадающее со значением SM, он предполагает, что загрузка завершена, и переходит к передаче соответствующих данных в буфер обмена. Если значение SM не найдено, используйте GOTO для использования .FindElementById (время ожидания "li2": = 10000). Я думал, что смогу исправить это, создав цикл, который перезапускается из .Click.
Я новичок в процессе экономии времени и усердного обучения во время чтения, поэтому я был бы очень признателен, если бы вы могли оказать мне дополнительную помощь.
If Not elem.Text = "SM" Is Nothing Then
должна завершиться ошибкой, потому что только объекты могут иметь значение Nothing, аNot elem.Text = "SM"
— логическое значение. Этот код работает? - person TinMan   schedule 29.11.2018