Run Selenium automation tests on LambdaTest cloud grid
Perform automation testing on 3000+ real desktop and mobile devices online.
package com.codeborne.selenide.impl;
import com.codeborne.selenide.DownloadsFolder;
import com.codeborne.selenide.proxy.SelenideProxyServer;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.events.WebDriverEventListener;
import org.openqa.selenium.support.events.WebDriverListener;
import javax.annotation.CheckReturnValue;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
@ParametersAreNonnullByDefault
public interface WebDriverContainer {
void addListener(WebDriverEventListener listener);
void addListener(WebDriverListener listener);
void removeListener(WebDriverEventListener listener);
void removeListener(WebDriverListener listener);
void setWebDriver(WebDriver webDriver);
void setWebDriver(WebDriver webDriver, @Nullable SelenideProxyServer selenideProxy);
void setWebDriver(WebDriver webDriver, @Nullable SelenideProxyServer selenideProxy, DownloadsFolder browserDownloadsFolder);
void resetWebDriver();
@CheckReturnValue
@Nonnull
WebDriver getWebDriver();
@CheckReturnValue
@Nullable
SelenideProxyServer getProxyServer();
void setProxy(@Nullable Proxy webProxy);
@CheckReturnValue
@Nonnull
WebDriver getAndCheckWebDriver();
@CheckReturnValue
@Nonnull
DownloadsFolder getBrowserDownloadsFolder();
void closeWindow();
void closeWebDriver();
boolean hasWebDriverStarted();
void clearBrowserCache();
@CheckReturnValue
@Nonnull
String getPageSource();
@CheckReturnValue
@Nonnull
String getCurrentUrl();
@CheckReturnValue
@Nonnull
String getCurrentFrameUrl();
}
package uk.co.evoco.webdriver.configuration.driver;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.support.events.EventFiringWebDriver;
import uk.co.evoco.webdriver.WebDriverListener;
import uk.co.evoco.webdriver.configuration.TestConfigHelper;
import java.io.File;
import java.io.IOException;
public interface ConfiguredDriver {
WebDriver getLocalDriver() throws IOException;
WebDriver getRemoteDriver() throws IOException;
<T> T getOptions() throws IOException;
/**
*Ã
* @param screenshotPath path to store screenshots
* @return configured EventFiringWebDriver
* @throws IOException if log directory doesn't exist
*/
default EventFiringWebDriver getDriver(File screenshotPath) throws IOException {
WebDriver webDriver;
switch (TestConfigHelper.get().getRunType()) {
case LOCAL:
webDriver = getLocalDriver();
break;
case GRID:
case SAUCELABS:
webDriver = getRemoteDriver();
break;
default:
throw new WebDriverException("Must set runType to either LOCAL or GRID in configuration file");
}
return configureEventFiringWebDriver(webDriver, screenshotPath);
}
/**
*
* @param webDriver active WebDriver instance
* @param screenshotDirectory path to store screenshots
* @return configured options object for target browser driver
*/
default EventFiringWebDriver configureEventFiringWebDriver(
WebDriver webDriver, File screenshotDirectory) {
EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(webDriver);
WebDriverListener eventListener = new WebDriverListener();
eventListener.setScreenshotDirectory(screenshotDirectory);
eventFiringWebDriver.register(eventListener);
return eventFiringWebDriver;
}
/**
* @throws IOException if the log directory cannot be created
*/
default void createLogDirectory() throws IOException {
FileUtils.forceMkdir(new File("./logs"));
}
/**
*
* @param path runtime browser files download directory path
* @return Absolute file download path
* @throws IOException if the required directory cannot be created
*/
default String createFileDownloadDirectory(String path) throws IOException {
String canonicalPath = new File(path).getCanonicalPath();
FileUtils.forceMkdir(new File(canonicalPath));
return canonicalPath;
}
}
package framework.utility;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener;
import org.slf4j.Logger;
/**
* The listener interface for receiving webDriver events.
* The class that is interested in processing a webDriver
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addWebDriverListener<code> method. When
* the webDriver event occurs, that object's appropriate
* method is invoked.
*
* @see WebDriverEvent
*/
public class WebDriverListener implements WebDriverEventListener {
private static final Logger LOG = LogFactory.getLogger(WebDriverListener.class);
@Override
public void beforeNavigateRefresh(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void afterNavigateRefresh(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void beforeChangeValueOf(WebElement element, WebDriver driver,
CharSequence[] keysToSend) {
// TODO Auto-generated method stub
}
@Override
public void afterChangeValueOf(WebElement element, WebDriver driver,
CharSequence[] keysToSend) {
LOG.info("Element " + element + " value was changed");
}
@Override
public void beforeClickOn(WebElement element, WebDriver driver) {
}
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
LOG.info("Element " + getElementXpath(element) + " was clicked");
}
@Override
public void beforeNavigateTo(String url, WebDriver driver) {
}
@Override
public void afterNavigateTo(String url, WebDriver driver) {
LOG.info("Was navigated to url: " + url);
}
@Override
public void beforeNavigateBack(WebDriver driver) {
}
@Override
public void afterNavigateBack(WebDriver driver) {
}
@Override
public void beforeNavigateForward(WebDriver driver) {
}
@Override
public void afterNavigateForward(WebDriver driver) {
}
@Override
public void beforeFindBy(By by, WebElement element, WebDriver driver) {
}
@Override
public void afterFindBy(By by, WebElement element, WebDriver driver) {
}
@Override
public void beforeScript(String script, WebDriver driver) {
}
@Override
public void afterScript(String script, WebDriver driver) {
LOG.info(script + " script was executed");
}
@Override
public void onException(Throwable throwable, WebDriver driver) {
LOG.info("WebDriver Exception thrown:", throwable.getMessage());
}
private String getElementXpath(WebElement element) {
String elementStringRepresentation = element.toString();
if (elementStringRepresentation.contains("xpath:")) {
String substringElementStringRepresentation =
elementStringRepresentation.substring(
elementStringRepresentation.indexOf("xpath: "),
elementStringRepresentation.length());
if (substringElementStringRepresentation.contains("-> xpath:")) {
return substringElementStringRepresentation.replaceAll(" -> xpath: ", "/");
} else return substringElementStringRepresentation;
}
return "";
}
@Override
public void beforeAlertAccept(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void afterAlertAccept(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void afterAlertDismiss(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void beforeAlertDismiss(WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void beforeSwitchToWindow(String windowName, WebDriver driver) {
// TODO Auto-generated method stub
}
@Override
public void afterSwitchToWindow(String windowName, WebDriver driver) {
// TODO Auto-generated method stub
}
}
import java.io.File;
import java.io.IOException;
import java.util.TimerTask;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
// Create a class extends with TimerTask
public class TakeScreenShot extends TimerTask {
public static String screenTitle;
public TakeScreenShot(String screenTitle){//constructor to initialize screenTitle
this.screenTitle=screenTitle;
}
// Add your task here
public void run() {
if(screenTitle.equals(driver.getTitle().trim())){
//do nothing; // as long as we are on same page dont take screenshot again.
}else{
screenTitle=driver.getTitle().trim();//if page changes then, take screenshot
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(scrFile, new File("C:\\"+screenTitle+".png"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
WebDriver driver = new FirefoxDriver();
//create an object of EventFiringWebDriver and pass the driver instance
EventFiringWebDriver wd = new EventFiringWebDriver(driver);
//create an object of class WebDriverListener and pass the driver instance
WebDriverListener eventListener = new WebDriverListener(driver);
wd.register(eventListener);
String title=""; //initially keep title empty
//will automatically be called after click on an element
public void afterClickOn(WebElement element, WebDriver driver) {
//title is not equal to previous page title
if(driver.getTitle()!=title){
//take screenshot
//assign the current title to string title
title=driver.getTitle();
}
}
Accelerate Your Automation Test Cycles With LambdaTest
Leverage LambdaTest’s cloud-based platform to execute your automation tests in parallel and trim down your test execution time significantly. Your first 100 automation testing minutes are on us.