我有一个页面,在某些时刻,它不加载硒。如果我点击硒打开页面上的“重新加载”按钮,有时页面会加载。这个页面是一个遗留系统,我们无法更改它。
然后我需要创建一个条件,如下所示:
>
如果Id: xxx可见
如果没有:
我在用硒Java。
我建议实现一个自定义的期望条件
,例如:
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秒刷新页面。
潜在的睡眠可能会被其他WebDriver等待所取代,但这也应该有效。
最简单的方法是将代码块包装起来,以便在try-catch{}
块中连续执行,从而诱发WebDriver等待visibilityOfElementSite(),如下所示:
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();
}