• 强制等待:与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写错:

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