package com.algocrafts.pages;
import com.algocrafts.forms.FormControl;
import com.algocrafts.locators.Locators;
import com.algocrafts.selenium.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.slf4j.Logger;
import java.util.List;
import java.util.function.Supplier;
import static com.algocrafts.converters.GetText.TEXT;
import static com.algocrafts.converters.OptionalGetter.GET;
import static com.algocrafts.selectors.ClassName.PAGE_TITLE;
import static org.slf4j.LoggerFactory.getLogger;
public class Page implements FormControl<Page> {
public static final Logger logger = getLogger(Page.class);
private final Browser<?> browser;
private final Clickable clickable;
public Page(Page page) {
this(page.browser, null);
}
public Page(Page page, Clickable clickable) {
this(page.browser, clickable);
}
public Page(Browser<?> browser) {
this(browser, null);
}
public Page(Browser<?> browser, Clickable clickable) {
this.browser = browser;
this.clickable = clickable;
}
public final void open() {
if (clickable != null) {
clickable.click();
}
}
@Override
public List<WebElement> findElements(By by) {
return browser.findElements(by);
}
/**
* Find the first element or throw NoSuchElementException
*
* @param by selector
* @return the first element or throw NoSuchElementException
*/
@Override
public final Element findElement(final By by) {
return browser.findElement(by);
}
@Override
public final void onTimeout() {
if (logger.isDebugEnabled()) {
browser.save(this.getTitle());
}
}
public final void accept() {
browser.accept();
}
public final void cancel() {
browser.cancel();
}
public final void close() {
if (!Boolean.getBoolean("keep.browser.open")) {
browser.close();
quit();
}
}
public final void quit() {
browser.quit();
}
public final Locator<Element, Element> mouseOver() {
return element -> {
browser.mouseOver(element);
return element;
};
}
public final void mouseOver(Element element) {
browser.mouseOver(element);
}
public final void dragAndDrop(Supplier<By> from, Supplier<By> to) {
browser.dragAndDrop(from.get(), to.get());
}
public String getTitle() {
try {
return Locators.<Page>optionalElement(PAGE_TITLE).andThen(GET).andThen(TEXT).locate(this);
} catch (Exception e) {
return "";
}
}
public final Page frame(int i) {
browser.frame(i);
return this;
}
public final Page defaultContent() {
browser.defaultContent();
return this;
}
public void reload() {
browser.navigate().refresh();
}
}