Selenium Webdriver(VBA):显式等待

5

我正在浏览一个Web应用程序,如果在元素可以交互之前尝试单击该元素,则往往会出现错误。

使用Selenium WebDriver(Java)时,我可以很容易地解决这个问题:

 WebDriverWait wait = new WebDriverWait(driver, 15);

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

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

webdriver.wait

我听说尽可能避免使用VBA,因此希望有人能够指导我如何将我的Java代码翻译成VBA,或提供其他解决方案,非常感谢。


请查看此链接以找到Selenium VBA绑定中“显式等待”问题的解决方案:https://stackoverflow.com/questions/50238062/unable-to-check-for-availability-of-any-element-removing-hardcoded-delay - MITHU
如果您展示相关的HTML代码,将会更容易为您提供可能的解决方案建议。 - QHarr
如果您需要,我可以为VBA添加一个可等待的方法,以在浏览器中执行JS。 - QHarr
5个回答

7
你可以尝试循环,直到元素被正确设置,并设置超时以确保不会进入无限循环。接受答案的危险在于如果没有找到,就没有逃脱循环的方法。
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编写了一个可通过Selenium Basic执行的js等待可点击函数。在这个SO答案中有示例。

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

1
在vba中,您可以使用隐式等待 "driver.Timeouts.ImplicitWait = 10 '时间单位'秒",如果元素在设置的时间内找到,则会等待最大限制,然后继续处理。

你好,@Prashant Mallick。在VBA中,如何捕获10秒后未找到元素的情况?你能帮忙吗? - Jacek Antek

1
你可以使用与Internet Explorer使用的旧等待系统中的变化。
Do While SeDriver.FindElementById("Id").IsDisplayed = False
    DoEvents
Loop

只需根据需要将 "IsDisplayed" 替换为 "IsPresent"。该方法引入了一种人工隐式等待,非常适合等待由 AJAX 请求生成的元素。


-1
通常情况下,使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接