等到加载特定元素

时间:2018-12-24 09:24:32

标签: excel vba selenium-webdriver web-scraping

我正在尝试抓取一个网站,并且我正在处理许多要素。我需要等待元素被加载。

这是我到目前为止的尝试,但我等待了很长时间,有时会出错。

.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 :(得分:3)

您可以尝试循环播放元素,直到它们可用为止。

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

如果由于某种原因网页挂起,我还将考虑在计时器中添加一个计时器-如果是这种情况,则可以重新加载网页或执行其他错误处理操作。

答案 1 :(得分:1)

您可以将其缩短为

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将为零。

如果id是动态的并且您有一个恒定的子字符串(仅在页面上的一个id属性中出现(为了安全起见-可能不是必需的),则可以在CSS中使用^,*,$运算符)。例如,如果起始字符串在页面之间是恒定的,则将CSS选择器更改为

[id^='theBttnbobjid']

如果发生多次,并且索引在页面之间保持不变,则可以稍后使用索引进行交互。

.FindElementsByCss("[id^='theBttnbobjid']")(2)