net.serenitybdd.screenplay.questions.Visibility Maven / Gradle / Ivy
package net.serenitybdd.screenplay.questions;
import net.serenitybdd.core.pages.WebElementFacade;
import net.serenitybdd.core.pages.WebElementState;
import net.serenitybdd.screenplay.Question;
import net.serenitybdd.screenplay.abilities.BrowseTheWeb;
import net.serenitybdd.screenplay.targets.Target;
import org.openqa.selenium.By;
import java.util.List;
import java.util.stream.Collectors;
import static java.util.Collections.singletonList;
/**
* Is this web element present and visible on the screen
* This method will not throw an exception if the element is not on the screen at all.
* If the element is not visible, the method will wait a bit to see if it appears later on.
*/
public class Visibility {
public static Question of(Target target) {
return Question.about("visibility of " + target.getName()).answeredBy(actor -> matches(target.resolveAllFor(actor)));
}
public static Question of(By byLocator) {
return Question.about("visibility of element located by " + byLocator).answeredBy(actor -> matches(BrowseTheWeb.as(actor).findAll(byLocator)));
}
public static Question of(String locator) {
return Question.about("visibility of " + locator).answeredBy(actor -> matches(BrowseTheWeb.as(actor).findAll(locator)));
}
public static Question> ofEach(Target target) {
return Question.about("visibility of each " + target.getName()).answeredBy(actor -> target.resolveAllFor(actor)
.stream()
.map(element -> matches(singletonList(element)))
.collect(Collectors.toList()));
}
public static Question> ofEach(By byLocator) {
return Question.about("visibility of element located by " + byLocator).answeredBy(actor -> BrowseTheWeb.as(actor).findAll(byLocator)
.stream()
.map(element -> matches(singletonList(element)))
.collect(Collectors.toList()));
}
public static Question> ofEach(String locator) {
return Question.about("visibility of each" + locator).answeredBy(actor -> BrowseTheWeb.as(actor).findAll(locator)
.stream()
.map(element -> matches(singletonList(element)))
.collect(Collectors.toList()));
}
private static boolean matches(List elements) {
return elements.stream()
.findFirst()
.map(WebElementState::isVisible)
.orElse(false);
}
}