package com.softwaremill.common.test.web.selenium.screenshots;
import com.thoughtworks.selenium.CommandProcessor;
import com.thoughtworks.selenium.HttpCommandProcessor;
/**
* SML processor capable doing screenshots when something goes wrong
*
* User: szimano
*/
public class ScreenshotHttpCommandProcessor implements CommandProcessor {
private boolean capturingScreenshot = false;
private Screenshotter screenshotter;
private final CommandProcessor delegate;
public ScreenshotHttpCommandProcessor(CommandProcessor delegate, Screenshotter screenshotter) {
this.delegate = delegate;
ScreenshotHttpCommandProcessor.this.screenshotter = screenshotter;
}
public ScreenshotHttpCommandProcessor(String serverHost, int serverPort, String browserStartCommand,
String browserURL, Screenshotter screenshotter) {
this(new HttpCommandProcessor(serverHost, serverPort, browserStartCommand, browserURL), screenshotter);
}
@Override
public String doCommand(String commandName, String[] args) {
try {
String result = delegate.doCommand(commandName, args);
capturingScreenshot = false;
return result;
}
catch (RuntimeException e) {
if (!capturingScreenshot) {
//Prevent infinite loop, when
// screenshotter.doScreenshot() throws exception
capturingScreenshot = true;
// create screenshot
screenshotter.doScreenshot();
}
capturingScreenshot = false;
// and rethrow
throw e;
}
}
public String getRemoteControlServerLocation() {
return delegate.getRemoteControlServerLocation();
}
public void setExtensionJs(String extensionJs) {
delegate.setExtensionJs(extensionJs);
}
public void start() {
delegate.start();
}
public void start(String optionsString) {
delegate.start(optionsString);
}
public void start(Object optionsObject) {
delegate.start(optionsObject);
}
public void stop() {
delegate.stop();
}
public String getString(String commandName, String[] args) {
return delegate.getString(commandName, args);
}
public String[] getStringArray(String commandName, String[] args) {
return delegate.getStringArray(commandName, args);
}
public Number getNumber(String commandName, String[] args) {
return delegate.getNumber(commandName, args);
}
public Number[] getNumberArray(String commandName, String[] args) {
return delegate.getNumberArray(commandName, args);
}
public boolean getBoolean(String commandName, String[] args) {
return delegate.getBoolean(commandName, args);
}
public boolean[] getBooleanArray(String commandName, String[] args) {
return delegate.getBooleanArray(commandName, args);
}
}