Дождитесь загрузки определенных элементов - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь почистить веб-сайт, и есть много элементов, с которыми я имею дело.Мне нужно дождаться загрузки элементов.

Это моя попытка до сих пор, но я долго жду, и иногда я получаю ошибки.

.FindElementById("ContentPlaceHolder1_Button1").Click
.Wait 2000
GoBack1:
Set elePrint = .FindElementById("IconImg_CrystalReportViewer1_toptoolbar_print", timeout:=20000, Raise:=False)
If elePrint Is Nothing Then
    Application.Wait Now() + TimeValue("00:00:01"): GoTo GoBack1
Else
    elePrint.Click
End If
GoBack2:
Set eleExport = .FindElementById("theBttnbobjid_1545642213647_dialog_submitBtn", timeout:=20000, Raise:=False)
If eleExport Is Nothing Then
    Application.Wait Now() + TimeValue("00:00:01"): GoTo GoBack2
Else
    eleExport.Click
End If

Есть ли лучший способ дляделать это?

Это HTML-часть

<tbody><tr valign="middle"><td height="21" width="5" style="background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px 0px;"></td><td id="theBttnCenterImgbobjid_1545656314367_dialog_submitBtn" align="center" class="wizbutton" style="padding-left:3px;padding-right:3px;background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px -42px;"><nobr><a id="theBttnbobjid_1545656314367_dialog_submitBtn" href="javascript:void(0)" class="wizbutton" role="button">Export</a></nobr></td><td height="21" width="5" style="background-image:url('aspnet_client/system_web/4_0_30319/crystalreportviewers13/js/crviewer/../dhtmllib/images/skin_standard/button.gif');background-position:0px -21px;"></td></tr></tbody>

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Вы можете сократить это значение до

Do 
Loop While .FindElementsByCss("#theBttnbobjid_1545642213647_dialog_submitBtn").Count = 0 

Хотя вы должны установить тайм-аут

Const MAX_WAIT_SEC As Long = 10
Dim t 
t = Timer
Do 
    If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While .FindElementsByCss("#theBttnbobjid_1545642213647_dialog_submitBtn").Count = 0 

Не будет ошибки и нет необходимости давать контроль.Если элемент не найден, .Count будет равен нулю.

Если идентификатор является динамическим, и у вас есть постоянная подстрока (которая встречается только для одного атрибута идентификатора на странице (быть безопасным - может бытьнеобходимо использовать операторы ^, *, $ в css).Например, если начальная строка постоянна на всех страницах, измените селектор css на

[id^='theBttnbobjid']

Если встречается более одного раза, а индекс постоянен на всех страницах, используйте индекс для взаимодействия позже, например

.FindElementsByCss("[id^='theBttnbobjid']")(2)
0 голосов
/ 24 декабря 2018

Вы можете попробовать зациклить ваши элементы, пока они не станут доступны.

On Error Resume Next
Do While .FindElementById("theBttnbobjid_1545642213647_dialog_submitBtn") Is Nothing
    DoEvents
Loop
On Error Goto 0

Я бы также подумал о добавлении таймера в ваш цикл, если по какой-то причине веб-страница зависает - что, если это так, вы могли быперезагрузите веб-страницу или выполните другую операцию обработки ошибок.

...