《SeleniumBasic 3.141.0.0 - 在VBA中操作浏览器》高级技术之四:SeleniumBasic的三种等待方式
我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间。
SeleniumBasic有三种等待方式:
- 强制等待:与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写错:
再次执行上述代码,由于不存在该元素,进入“运行时错误”