package com.algocrafts.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.UnhandledAlertException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.interactions.Actions;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import static org.apache.commons.io.FileUtils.copyFile;
import static org.openqa.selenium.OutputType.FILE;
public interface Actionable<T extends WebDriver> extends WebDriver,
CachedWebDriverSupplier<T> {
default void accept() {
try {
switchTo().alert().accept();
} catch (Exception e) {
logger.info("Failed to click OK", e);
}
}
default void cancel() {
try {
switchTo().alert().dismiss();
} catch (Exception e) {
logger.info("Failed to click Cancel", e);
}
}
default void frame(int i) {
switchTo().frame(i);
}
default void defaultContent() {
switchTo().defaultContent();
}
default void mouseOver(Element element) {
new Actions(get()).moveToElement(element).perform();
}
default void dragAndDrop(By from, By to) {
new Actions(get()).dragAndDrop(findElement(from), findElement(to)).perform();
}
default void save(String title) {
T driver = get();
if (driver instanceof TakesScreenshot) {
logger.info("Saving screenshot [title={}]", title);
File scrFile = null;
try {
TakesScreenshot camera = (TakesScreenshot) driver;
scrFile = camera.getScreenshotAs(FILE);
copyFile(scrFile, new File("target/screenshots/" + title + new Date().getTime() + ".png"));
scrFile.delete();
} catch (UnhandledAlertException e) {
logger.info("Failed to copy screenshot.", e);
} catch (IOException e) {
try {
copyFile(scrFile, new File("target/screenshots/" + new Date().getTime() + ".png"));
} catch (IOException e1) {
logger.info("Failed to copy screenshot.", e1);
}
}
} else {
logger.info("Taking screenshot is not supported");
}
}
}