【问题标题】:Selenium Webdriver (VBA): Explicit WaitSelenium Webdriver (VBA):显式等待
【发布时间】:2016-06-22 00:55:41
【问题描述】:

我正在浏览一个 Web 应用程序,如果在与之交互之前尝试单击一个元素,该应用程序通常会引发错误。

使用 Selenium WebDriver (java) 时,我可以轻松解决该问题:

 WebDriverWait wait = new WebDriverWait(driver, 15);

 wait.until(ExpectedConditions.elementToBeClickable(By.id("element")));

但是,我正在尝试使用 Selenium 类型库在 VBA 中编写脚本,尽管尝试了许多不同的方法,但我唯一的成功是:

webdriver.wait

我被告知应该尽可能避免。如果有人可以建议如何将我的 java 翻译成 VBA,或提供任何其他解决方案,我将非常感激。

【问题讨论】:

  • 查看 this link 以在 selenium v​​ba 绑定中找到 Explicit Wait 的解决方案。
  • 如果您展示了相关的 HTML,它将更容易就可能的解决方案提供建议。
  • 如果你愿意,我可以为 vba 添加一个等待点击方法,在浏览器中执行 is js?

标签: excel vba selenium webdriver


【解决方案1】:

您可以尝试循环,直到元素设置正确并设置超时,以确保您不会进入无限循环。接受答案的危险在于,如果找不到,就无法逃脱循环。

Dim t As Date, ele As Object
t = Timer
Do
    DoEvents
    On Error Resume Next
    Set ele = .FindElementById("element")
    On Error GoTo 0
    If Timer - t = 10 Then Exit Do '<==To avoid infinite loop
Loop While ele Is Nothing

注意:用户 @florentbr 编写了一个 js 等待可点击函数以通过 Selenium Basic 执行。此SO answer 中的示例。

【讨论】:

    【解决方案2】:

    VBA 的 selenium 插件是非官方的,不支持此功能。

    您可以通过使用 onError 重试产生错误的操作直到它成功或超时来解决此问题:

    Sub test
        OnError GoTo Retry
            webDriver.findElementById("element")
        Exit Sub
    
        Dim i as integer
        :Retry
            webDriver.Wait(500)
            i = i + 1
            if i = 20 then onerror go to 0
        Resume
    end sub
    

    【讨论】:

      【解决方案3】:

      在 vba 中,您可以使用隐式等待 "driver.Timeouts.ImplicitWait = 10 'Timeunits 'seconds" 如果在设置的时间之前找到元素,它将等待最大限制,它将进一步处理。

      【讨论】:

      • 你好@Prashant Mallick。如果在 VBA 中 10 秒后未找到元素,您如何捕捉?你能帮忙吗?
      【解决方案4】:

      您可以在 Internet Explorer 中使用旧等待系统的变体。

      Do While SeDriver.FindElementById("Id").IsDisplayed = False
          DoEvents
      Loop
      

      只需根据需要将“IsDisplayed”替换为“IsPresent”即可。此方法引入了人为的隐式等待,如果您需要等待由 AJAX 请求生成的元素,则非常适合。

      【讨论】:

        【解决方案5】:

        通常有一些现场元素可以立即被 selenium 找到但不能与之交互,通常当我们在这个阶段调试并从那里运行代码时,一切正常。我使用的解决方案是添加等待。

        Sub Pause_for_2_seconds()
        
            Application.Wait (Now + TimeValue("00:00:02"))
        
        End Sub
        

        如果你觉得元素需要一些时间,只需添加

        Call Pause_for_2_seconds 
        

        在你的实际子中

        示例见下文

            chr.SendKeys (Keys.Tab)
            Call Pause_for_2_seconds
            
            chr.SendKeys (Keys.Tab)
            
            chr.SendKeys (Date + 52)
            chr.SendKeys (Keys.Tab)
            Call Pause_for_2_seconds
            
            chr.SendKeys (Keys.Tab)
            chr.SendKeys (Keys.Enter)
        

        【讨论】:

          猜你喜欢
          • 2013-12-03
          • 1970-01-01
          • 2013-05-28
          • 1970-01-01
          • 2018-01-24
          • 2017-04-19
          • 1970-01-01
          • 2012-05-11
          相关资源
          最近更新 更多