org.fluentlenium.core.wait.FluentWait Maven / Gradle / Ivy
package org.fluentlenium.core.wait;
import org.fluentlenium.core.FluentControl;
import org.fluentlenium.core.FluentPage;
import org.fluentlenium.core.conditions.FluentConditions;
import org.fluentlenium.core.conditions.FluentListConditions;
import org.fluentlenium.core.conditions.wait.WaitConditionProxy;
import org.fluentlenium.core.domain.FluentWebElement;
import org.fluentlenium.utils.SupplierOfInstance;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import java.time.Duration;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* A wait object wrapping default selenium {@link org.openqa.selenium.support.ui.FluentWait} object into a more
* complete API, allowing to wait for any condition to be verified.
*/
public class FluentWait
implements FluentWaitFunctional, FluentWaitConditions, FluentWaitConfiguration {
private final org.openqa.selenium.support.ui.FluentWait wait;
private final WebDriver driver;
private boolean useDefaultException;
private boolean messageDefined;
private boolean defaultExceptionsRegistered;
/**
* Creates a new fluent wait.
*
* @param control control interface
*/
public FluentWait(FluentControl control) {
wait = new org.openqa.selenium.support.ui.FluentWait<>(control);
wait.withTimeout(Duration.ofSeconds(5));
driver = control.getDriver();
useDefaultException = true;
}
@Override
public org.openqa.selenium.support.ui.FluentWait getWait() {
return wait;
}
@Override
public FluentWait atMost(Duration duration) {
wait.withTimeout(duration);
return this;
}
@Override
public FluentWait pollingEvery(Duration duration) {
wait.pollingEvery(duration);
return this;
}
@Override
public FluentWait ignoreAll(Collection> types) {
wait.ignoreAll(types);
return this;
}
@Override
public FluentWait ignoring(Class exceptionType) {
wait.ignoring(exceptionType);
return this;
}
@Override
public FluentWait ignoring(Class firstType, Class secondType) {
wait.ignoring(firstType, secondType);
return this;
}
@Override
public FluentWait withMessage(Supplier message) {
wait.withMessage(message);
messageDefined = true;
return this;
}
@Override
public FluentWait withNoDefaultsException() {
useDefaultException = false;
return this;
}
private void updateWaitWithDefaultExceptions() {
if (useDefaultException & !defaultExceptionsRegistered) {
defaultExceptionsRegistered = true;
wait.ignoring(NoSuchElementException.class);
wait.ignoring(StaleElementReferenceException.class);
}
}
/**
* Check if a message is defined.
*
* @return true if this fluent wait use a custom message, false otherwise
*/
public boolean hasMessageDefined() {
return messageDefined;
}
@Override
public void untilPredicate(Predicate predicate) {
updateWaitWithDefaultExceptions();
wait.until(predicate::test);
}
@Override
public void until(Supplier booleanSupplier) {
updateWaitWithDefaultExceptions();
wait.until(new Function