使用 Selenium 和 Java 创建循环以在执行时重新加载页面

Create a loop to reload page while execution using Selenium and Java

我有一个页面,在某些时候,它不会在 selenium 中加载。如果我在打开 selenium 的页面上单击 'Reload' 按钮,有时会加载页面。此页面是遗留系统,我们无法更改它。

然后我需要创建一个条件,像这样:

我正在使用 Selenium Java。

我建议实施自定义 ExpectedCondition,例如:

import org.openqa.selenium.support.ui.ExpectedCondition

public static ExpectedCondition<Boolean> elementToBeVisibleWithRefreshPage(By element, int waitAfterPageRefreshSec) {
    return new ExpectedCondition<Boolean>() {
        private boolean isLoaded = false;

        @Override
        public Boolean apply(WebDriver driver) {
            List elements = driver.findElements(element);
            if(!elements.isEmpty()) {
                isLoaded = elements.get(0).isDisplayed();
            }
            if(!isLoaded) {
                driver.navigate().refresh();
                // some sleep after page refresh
                Thread.sleep(waitAfterPageRefreshSec * 1000);
            }
            return isLoaded;
        }
    };

}

用法:

By element = By.id("xxx");

new WebDriverWait(driver, Duration.ofSeconds(30)).until(elementToBeVisibleWithRefreshPage(element, 10));

这将等待 30 秒,直到元素可见,如果元素不可见,将刷新页面并暂停 10 秒。

潜在的 sleep 可能会被其他 WebDriver wait 代替,但这也应该有效。

最简单的方法是将代码块包装在 try-catch{} 块中以连续执行,如下所示:

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

try  
{  
    WebElement element = new WebDriverWait(driver, Duration.ofSeconds(20)).until(ExpectedConditions.visibilityOfElementLocated(By.id("elementID")));
    // other lines of code of continius execution
}  
catch(TimeoutException e)  
{  
    driver.navigate().refresh();  
}