强制等待:与Selenium无关的一种堵塞线程的延时方法,固定毫秒数
隐式等待:设置一个等待时间,如果在这个等待时间内,网页加载完成,则执行下一步;否则一直等待时间截止,然后再执行下一步。这样也就会有个弊端,程序会一直等待整个页面加载完成,直到超时,但有时候我需要的那个元素早就加载完成了,
显式等待:程序每隔一定时间检查一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
SeleniumBasic的Utility类提供了一个Sleep方法,用于实现强制等待。
WD.New_ChromeDriver Service:=Service, Options:=Options
WD.URL = "https://www.baidu.com"
Dim form As SeleniumBasic.IWebElement
Dim keyword As SeleniumBasic.IWebElement
Dim button As SeleniumBasic.IWebElement
Set form = WD.FindElementById("form")
Set keyword = form.FindElementById("kw")
Dim U As Utility
Set U = New SeleniumBasic.Utility
keyword.SendKeys "好看视频"
U.Sleep 3000
keyword.Clear
以上程序,在输入框中键入“好看视频”,过3秒后清空文本框内容。
SeleniumBasic有一个ITimeouts类,下面有3个成员,其中ImplicitWait就是隐式等待,这是一个可写属性。图中把隐式等待时间设置为5秒。
显式等待,是在查找定位某个元素之前,设置一下最大等待时间。在规定的时间内容如果找到了该元素,则提前继续往下执行程序。如果未找到元素则出现“运行时错误”。
VB.NET中实现显式等待的代码是:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim d As IWebDriver
Dim w As WebDriverWait
Dim su As IWebElement
d = New Chrome.ChromeDriver
d.Url = "https://www.baidu.com/"
w = New WebDriverWait(driver:=d, timeout:=TimeSpan.FromSeconds(4))
su = w.Until(Function(x As IWebDriver) x.FindElement(By.Id("su")))
su.Click()
d.Quit()
Exit Sub
End Sub
由于VBA语言中使用New关键字创建类实例时不许传递参数。因此在SeleniumBasic中,Set WDW =New WebDriverWait这句没有实际效果,必须调用自定义方法Create让该对象与IWebDriver关联。
下面的代码首先打开百度首页,然后设置一个显式等待对象WDW,等待时间是5秒钟。然后调用Until方法查找ID为su的元素。
Private WD As SeleniumBasic.IWebDriver
Sub Baidu()
On Error GoTo Err1
Set WD = New SeleniumBasic.IWebDriver
WD.New_ChromeDriver
WD.URL = "https://www.baidu.com"
Dim button As SeleniumBasic.IWebElement
Dim WDW As WebDriverWait
Set WDW = New WebDriverWait
WDW.Create driver:=WD, timeout:=5
Set button = WDW.Until(attributeName:="Id", attributeValue:="su")
If button Is Nothing = False Then
MsgBox button.GetAttribute("value"), vbInformation
End If
Debug.Print WD.Title, WD.URL
WD.Quit
Exit Sub
Err1:
MsgBox Err.Description, vbCritical
WD.Quit
End Sub
如果定位到了,在VBA中返回该元素的value属性“百度一下”
假设,故意把Id写错:
再次执行上述代码,由于不存在该元素,进入“运行时错误”