/**
* Sahi - Web Automation and Test Tool
*
* Copyright 2006 V Narayan Raman
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.sahi.command;
import java.util.Properties;
import net.sf.sahi.config.Configuration;
import net.sf.sahi.playback.FileScript;
import net.sf.sahi.playback.SahiScript;
import net.sf.sahi.playback.ScriptFactory;
import net.sf.sahi.report.LogViewer;
import net.sf.sahi.report.ResultType;
import net.sf.sahi.request.HttpRequest;
import net.sf.sahi.response.HttpFileResponse;
import net.sf.sahi.response.HttpResponse;
import net.sf.sahi.response.NoCacheHttpResponse;
import net.sf.sahi.response.SimpleHttpResponse;
import net.sf.sahi.nashorn.NashornScriptRunner;
import net.sf.sahi.session.Session;
import net.sf.sahi.session.Status;
import net.sf.sahi.test.ProcessHelper;
import net.sf.sahi.util.Utils;
import org.apache.log4j.Logger;
public class Player {
private Logger logger = Logger.getLogger(Player.class);
public void stepWisePlay(final HttpRequest request) {
startPlayback(request.session(), false, "1");
}
public void start(final HttpRequest request) {
startPlayback(request.session(), true, "1");
}
public void stop(final HttpRequest request) {
Session session = request.session();
if (session.getRecorder() != null) session.getRecorder().stop();
if (session.getScriptRunner() != null) session.getScriptRunner().stop();
}
public void setScriptFile(final HttpRequest request) {
Session session = request.session();
String dir = request.getParameter("dir");
String fileName = request.getParameter("file");
session.setIsWindowOpen("1".equals(request.getParameter("manual")));
String filePath = Utils.concatPaths(dir, fileName);
setScript(session, filePath);
}
public void setScriptUrl(final HttpRequest request) {
Session session = request.session();
String url = request.getParameter("url");
session.setIsWindowOpen("1".equals(request.getParameter("manual")));
setScript(session, url);
}
public void resetScript(final HttpRequest request) {
Session session = request.session();
String scriptPath = session.getVariable("sahi_scriptPath");
stop(request);
setScript(session, scriptPath);
}
private void setScript(Session session, String scriptPath) {
SahiScript script = new ScriptFactory().getScript(scriptPath);
NashornScriptRunner scriptRunner = new NashornScriptRunner(script);
session.setScriptRunner(scriptRunner);
startPlayback(session, true, "1");
}
private void startPlayback(final Session session, final boolean resetConditions, String paused) {
if (resetConditions) {
session.removeVariables(".*");
}
NashornScriptRunner scriptRunner = session.getScriptRunner();
scriptRunner.setStatus(Status.RUNNING);
session.setIsPlaying(true);
// session.setVariable("sahi_play", "1");
session.setVariable("sahi_paused", paused);
session.setVariable("sahi_controller_tab", "playback");
session.setVariable("sahi_scriptPath", scriptRunner.getScriptFilePath());
scriptRunner.execute();
}
public HttpResponse isPlaying(final HttpRequest request) {
Session session = request.session();
return new SimpleHttpResponse(session.isPlaying() ? "1" : "0");
}
public HttpResponse getCurrentStep(final HttpRequest request) {
Session session = request.session();
NashornScriptRunner scriptRunner = session.getScriptRunner();
if (scriptRunner == null) return new SimpleHttpResponse("{'type':'WAIT'}");
String derivedName = request.getParameter("derivedName");
String windowName = request.getParameter("windowName");
String windowTitle = request.getParameter("windowTitle");
String domain = request.getParameter("domain");
String wasOpened = request.getParameter("wasOpened");
logger.debug("scriptRunner=" + scriptRunner);
return new SimpleHttpResponse(scriptRunner.getStepJSON(derivedName, windowName, windowTitle, domain, wasOpened));
}
public void markStepDone(final HttpRequest request) {
Session session = request.session();
NashornScriptRunner scriptRunner = session.getScriptRunner();
String failureMessage = request.getParameter("failureMsg");
String type = request.getParameter("type");
scriptRunner.markStepDone(request.getParameter("stepId"), ResultType.getType(type), failureMessage);
session.set204(false);
// try{
// new TestReporter().logTestResult(request);
// }catch(Exception e){
// e.printStackTrace();
// }
}
public HttpResponse check204(final HttpRequest request) {
Session session = request.session();
return new SimpleHttpResponse("" + session.is204());
}
public void markStepInProgress(final HttpRequest request) {
Session session = request.session();
NashornScriptRunner scriptRunner = session.getScriptRunner();
String type = request.getParameter("type");
scriptRunner.markStepInProgress(request.getParameter("stepId"), ResultType.getType(type));
}
public HttpResponse currentScript(final HttpRequest request) {
Session session = request.session();
SahiScript script = getScript(session);
if (script != null) {
return new Script().view(script.getFilePath());
} else {
return new SimpleHttpResponse(
"No Script has been set for playback.");
}
}
private SahiScript getScript(Session session) {
NashornScriptRunner scriptRunner = (NashornScriptRunner) session.getScriptRunner();
return scriptRunner.getScript();
}
public HttpResponse currentBrowserScript(final HttpRequest request) {
Session session = request.session();
HttpResponse httpResponse;
if (session.getScriptRunner() != null && getScript(session) != null) {
httpResponse = new SimpleHttpResponse(LogViewer.highlight(getScript(session).getBrowserJS(), -1));
} else {
httpResponse = new SimpleHttpResponse(
"No Script has been set for playback.");
}
return httpResponse;
}
public HttpResponse currentParsedScript(final HttpRequest request) {
Session session = request.session();
HttpResponse httpResponse;
if (getScript(session) != null) {
httpResponse = new SimpleHttpResponse("<pre>" + getScript(session).modifiedScript().replaceAll("\\\\r",
"").replaceAll("\\\\n", "<br>") + "</pre>");
} else {
httpResponse = new SimpleHttpResponse(
"No Script has been set for playback.");
}
return httpResponse;
}
public HttpResponse script(final HttpRequest request) {
Session session = request.session();
NashornScriptRunner scriptRunner = session.getScriptRunner();
String s = null;
if (scriptRunner != null) {
if (scriptRunner.getScript() != null) {
s = scriptRunner.getScript().getBrowserJS(); // Sahi Script
} else {
s = scriptRunner.getBrowserJS(); // Other drivers
}
}
if (s == null) s = "";
return new NoCacheHttpResponse(s);
}
public HttpResponse auto2(final HttpRequest request) {
ProcessHelper.setProcessStarted();
Session session = request.session();
String fileName = request.getParameter("file");
final String scriptFileWithPath;
scriptFileWithPath = fileName;
NashornScriptRunner scriptRunner = new NashornScriptRunner(new FileScript(scriptFileWithPath));
session.setScriptRunner(scriptRunner);
session.setIsPlaying(true);
String startUrl = request.getParameter("startUrl");
session.setIsWindowOpen(false);
startPlayback(session, true, "0");
return proxyAutoResponse(startUrl, session.id());
}
public HttpResponse auto(final HttpRequest request) {
ProcessHelper.setProcessStarted();
Session session = request.session();
String startUrl = request.getParameter("startUrl");
session.setIsWindowOpen(false);
session.setIsPlaying(true);
session.setVariable("isSingleSession", request.getParameter("isSingleSession"));
return proxyAutoResponse(startUrl, session.id());
}
public HttpResponse autoJava(final HttpRequest request) {
ProcessHelper.setProcessStarted();
Session session = request.session();
String startUrl = request.getParameter("startUrl");
session.setIsWindowOpen(false);
session.removeVariables(".*");
session.setIsReadyForDriver(false); // will be toggled in Driver_initialized
return proxyAutoResponse(startUrl, session.id());
}
public void setRetries(final HttpRequest request) {
NashornScriptRunner scriptRunner = request.session().getScriptRunner();
if (scriptRunner != null)
scriptRunner.setBrowserRetries(Integer.parseInt(request.getParameter("retries")));
}
public HttpResponse getRetries(final HttpRequest request) {
NashornScriptRunner scriptRunner = request.session().getScriptRunner();
return new SimpleHttpResponse(scriptRunner != null ? "" + scriptRunner.getBrowserRetries() : "-1");
}
public HttpResponse hasErrors(final HttpRequest request) {
NashornScriptRunner scriptRunner = request.session().getScriptRunner();
return new SimpleHttpResponse("" + scriptRunner.hasErrors());
}
public void xsuccess(final HttpRequest request) {
Session session = request.session();
session.touch();
SessionState state = new SessionState();
state.setVar("sahi_retries", "0", session);
state.setVar("sahi_not_my_win_retries", "0", session);
}
private HttpResponse proxyAutoResponse(final String startUrl, final String sessionId) {
Properties props = new Properties();
props.setProperty("startUrl", startUrl);
props.setProperty("sessionId", sessionId);
return new NoCacheHttpResponse(new HttpFileResponse(Configuration.getHtdocsRoot() + "spr/auto.htm", props, false, true));
}
}