Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
org.openqa.selenium.By;
org.openqa.selenium.Cookie;
org.openqa.selenium.JavascriptExecutor;
org.openqa.selenium.RenderedWebElement;
org.openqa.selenium.Speed;
org.openqa.selenium.WebDriver;
org.openqa.selenium.WebElement;
import
import
import
import
import
import
import
import
import
import
import
java.awt.*;
java.lang.reflect.InvocationHandler;
java.lang.reflect.InvocationTargetException;
java.lang.reflect.Method;
java.lang.reflect.Proxy;
java.net.URL;
java.util.ArrayList;
java.util.Arrays;
java.util.HashSet;
java.util.List;
java.util.Set;
/**
* A wrapper around an arbitrary {@link WebDriver} instance
* which supports registering of a {@link WebDriverEventListener},
* e.g. for logging purposes.
*
* @author Michael Tamm
*/
public class EventFiringWebDriver implements WebDriver, JavascriptExecutor {
private final WebDriver driver;
private final List<WebDriverEventListener> eventListeners = new ArrayList<We
bDriverEventListener>();
private final WebDriverEventListener dispatcher = (WebDriverEventListener) P
roxy.newProxyInstance(
WebDriverEventListener.class.getClassLoader(),
new Class[] { WebDriverEventListener.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) thr
ows Throwable {
for (WebDriverEventListener eventListener : eventListeners) {
method.invoke(eventListener, args);
}
return null;
}
}
);
public EventFiringWebDriver(final WebDriver driver) {
Class<?>[] allInterfaces = extractInterfaces(driver);
this.driver = (WebDriver) Proxy.newProxyInstance(
WebDriverEventListener.class.getClassLoader(),
allInterfaces,
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) thr
ows Throwable {
try {
return method.invoke(driver, args);
} catch (InvocationTargetException e) {
dispatcher.onException(e.getTargetException(), driver);
throw e.getTargetException();
}
}
}
);
}
private Class<?>[] extractInterfaces(WebDriver driver) {
Set<Class<?>> allInterfaces = new HashSet<Class<?>>();
extractInterfaces(allInterfaces, driver.getClass());
return allInterfaces.toArray(new Class<?>[allInterfaces.size()]);
}
private void extractInterfaces(Set<Class<?>> addTo, Class<?> clazz) {
if (Object.class.equals(clazz)) {
return; // Done
}
Class<?>[] classes = clazz.getInterfaces();
addTo.addAll(Arrays.asList(classes));
extractInterfaces(addTo, clazz.getSuperclass());
}
/**
* @return this for method chaining.
*/
public EventFiringWebDriver register(WebDriverEventListener eventListener) {
eventListeners.add(eventListener);
return this;
}
/**
* @return this for method chaining.
*/
public EventFiringWebDriver unregister(WebDriverEventListener eventListener)
{
eventListeners.remove(eventListener);
return this;
}
/**
* Getter to access the encapsulated WebDriver.
* A typical example for having to use this getter is when this class is
* wrapping a RemoteWebDriver, and we need to perform some queries on it
* (such as calling getCapabilities).
*
* @return the encapsulated WebDriver.
*/
public WebDriver getDriver() {
return driver;
}
public void get(String url) {
dispatcher.beforeNavigateTo(url, driver);
driver.get(url);
dispatcher.afterNavigateTo(url, driver);
}
public String getCurrentUrl() {
return driver.getCurrentUrl();
}
public String getTitle() {
return driver.getTitle();
}
public List<WebElement> findElements(By by) {
dispatcher.beforeFindBy(by, null, driver);
List<WebElement> temp = driver.findElements(by);
dispatcher.afterFindBy(by, null, driver);
List<WebElement> result = new ArrayList<WebElement>(temp.size());
for (WebElement element : temp) {
result.add(createWebElement(element));
}
return result;
}
public WebElement findElement(By by) {
dispatcher.beforeFindBy(by, null, driver);
WebElement temp = driver.findElement(by);
dispatcher.afterFindBy(by, null, driver);
return createWebElement(temp);
}
public String getPageSource() {
return driver.getPageSource();
}
public void close() {
driver.close();
}
public void quit() {
driver.quit();
}
public Set<String> getWindowHandles() {
return driver.getWindowHandles();
}
return element.getAttribute(name);
}
public boolean toggle() {
dispatcher.beforeChangeValueOf(element, driver);
boolean result = element.toggle();
dispatcher.afterChangeValueOf(element, driver);
return result;
}
public boolean isSelected() {
return element.isSelected();
}
public void setSelected() {
element.setSelected();
}
public boolean isEnabled() {
return element.isEnabled();
}
public String getText() {
return element.getText();
}
public WebElement findElement(By by) {
dispatcher.beforeFindBy(by, element, driver);
WebElement temp = element.findElement(by);
dispatcher.afterFindBy(by, element, driver);
return createWebElement(temp);
}
public List<WebElement> findElements(By by) {
dispatcher.beforeFindBy(by, element, driver);
List<WebElement> temp = element.findElements(by);
dispatcher.afterFindBy(by, element, driver);
List<WebElement> result = new ArrayList<WebElement>(temp.size());
for (WebElement element : temp) {
result.add(createWebElement(element));
}
return result;
}
public WebElement getUnderlyingElement() {
return underlyingElement;
}
}
private class EventFiringRenderedWebElement extends EventFiringWebElement im
plements RenderedWebElement {
private final RenderedWebElement delegate;
public EventFiringRenderedWebElement(WebElement element) {
super(element);
delegate = (RenderedWebElement) element;
}
public boolean isDisplayed() {
return delegate.isDisplayed();
}
public Point getLocation() {
return delegate.getLocation();
}
public Dimension getSize() {
return delegate.getSize();
}
public void dragAndDropBy(int moveRightBy, int moveDownBy) {
delegate.dragAndDropBy(moveRightBy, moveDownBy);
}
public void dragAndDropOn(RenderedWebElement element) {
delegate.dragAndDropOn(element);
}
public String getValueOfCssProperty(String propertyName) {
return delegate.getValueOfCssProperty(propertyName);
}
}
private class EventFiringNavigation implements Navigation {
private final WebDriver.Navigation navigation;
EventFiringNavigation(Navigation navigation) {
this.navigation = navigation;
}
public void to(String url) {
dispatcher.beforeNavigateTo(url, driver);
navigation.to(url);
dispatcher.afterNavigateTo(url, driver);
}
public void to(URL url) {
to(String.valueOf(url));
}
public void back() {
dispatcher.beforeNavigateBack(driver);
navigation.back();
dispatcher.afterNavigateBack(driver);
}
public void forward() {
dispatcher.beforeNavigateForward(driver);
navigation.forward();
dispatcher.afterNavigateForward(driver);
}
public void refresh() {
navigation.refresh();
}
}
private class EventFiringOptions implements Options {
private Options options;