《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写错:

 

再次执行上述代码,由于不存在该元素,进入“运行时错误”

 

posted @ 2020-09-20 11:25  ryueifu  阅读(4513)  评论(4编辑  收藏  举报