package net.sf.sahi.command; import java.util.Properties; import net.sf.sahi.config.Configuration; import net.sf.sahi.nashorn.NashornScriptRunner; import net.sf.sahi.request.HttpRequest; import net.sf.sahi.response.HttpFileResponse; import net.sf.sahi.response.HttpModifiedResponse2; import net.sf.sahi.response.HttpResponse; import net.sf.sahi.response.SimpleHttpResponse; import net.sf.sahi.session.Session; import net.sf.sahi.session.Status; import net.sf.sahi.test.BrowserLauncher; import net.sf.sahi.util.BrowserType; import net.sf.sahi.util.BrowserTypesLoader; import net.sf.sahi.util.Utils; import org.apache.log4j.Logger; /** * Sahi - Web Automation and Test Tool * <p/> * Copyright 2006 V Narayan Raman * <p/> * 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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. */ public class Driver { private static Logger logger = Logger.getLogger(Driver.class); private Boolean useSystemProxy = false; public static final String INITIALIZE_CALL = "/_s_/dyn/Driver_initialized"; public void setControllerMode(final HttpRequest request) { String mode = request.getParameter("mode"); Configuration.setControllerMode(mode); } public void launchAndRecord(final HttpRequest request) throws Exception { launchBrowser(request); record(request); } public void launchAndPlayback(final HttpRequest request) throws Exception { launchBrowser(request); } private void launchBrowser(final HttpRequest request) throws Exception { String browser = request.getParameter("browser"); String browserOption = request.getParameter("browserOption"); String browserProcessName = request.getParameter("browserProcessName"); launch(browser, browserProcessName, browserOption, "true".equals(request.getParameter("useSystemProxy")), request); } public void launchPreconfiguredBrowser(final HttpRequest request) throws Exception { BrowserTypesLoader browserLoader = new BrowserTypesLoader(); BrowserType browserType = browserLoader.getBrowserType(request); // launches browser with pre configured browser settings if (browserType != null) { launch(browserType.path(), browserType.processName(), browserType.options(), browserType.useSystemProxy(), request); } } private void launch(String browser, String browserProcessName, String browserOption, boolean useProxy, HttpRequest request) throws Exception { Session session = request.session(); String startUrl = request.getParameter("startUrl"); if (startUrl == null) startUrl = ""; // if (useProxy) { // this.useSystemProxy = true; // enableIEProxy(request); // } // final BrowserLauncher launcher = new BrowserLauncher(browser, browserProcessName, browserOption, useProxy); String url = "http://" + Configuration.getCommonDomain() + "/_s_/dyn/Driver_start" + "?sahisid=" + session.id() + "&startUrl=" + Utils.encode("http://" + Configuration.getCommonDomain() + INITIALIZE_CALL + "?startUrl=" + Utils.encode(startUrl)); launcher.openURL(url); session.setLauncher(launcher); } public void kill(final HttpRequest request) { Session session = request.session(); BrowserLauncher launcher = session.getLauncher(); if (launcher != null) { launcher.kill(); // if (useSystemProxy){ // disableIEProxy(request); // } } } public HttpResponse start(final HttpRequest request) { Session session = request.session(); session.setScriptRunner(new NashornScriptRunner()); return new Player().autoJava(request); } public void restart(final HttpRequest request) { Session session = request.session(); session.setScriptRunner(new NashornScriptRunner()); session.setIsPlaying(true); session.setIsReadyForDriver(true); } public HttpResponse initialized(final HttpRequest request) { Session session = request.session(); session.setIsPlaying(true); session.setIsReadyForDriver(true); String startUrl = request.getParameter("startUrl"); Properties properties = new Properties(); if (startUrl == null) startUrl = ""; properties.setProperty("startUrl", Utils.replaceLocalhostWithMachineName(startUrl)); HttpFileResponse httpFileResponse = new HttpFileResponse(Configuration.getHtdocsRoot() + "spr/initialized.htm", properties, false, true); HttpModifiedResponse2 response = new HttpModifiedResponse2(httpFileResponse, false, "htm"); // response.addFilter(new ChunkedFilter()); return response; } public HttpResponse isReady(final HttpRequest request) { return new SimpleHttpResponse("" + request.session().isReadyForDriver()); } public void setStep(final HttpRequest request) { String step = request.getParameter("step"); setStep(request, step); } public void setBrowserJS(final HttpRequest request) { Session session = request.session(); String browserJS = request.getParameter("browserJS"); session.getScriptRunner().setBrowserJS(browserJS); } public HttpResponse getVariable(final HttpRequest request) { String key = request.getParameter("key"); logger.debug("key="+key); Session session = request.session(); String val = session.getVariable(key); logger.debug("val="+val); return new SimpleHttpResponse(val != null ? val : ""); } public HttpResponse doneStep(final HttpRequest request) { Session session = request.session(); NashornScriptRunner scriptRunner = session.getScriptRunner(); if (scriptRunner == null) { return new SimpleHttpResponse("error:Playback session not started. Verify that proxy is set on the browser."); } boolean done = scriptRunner.doneStep("") || scriptRunner.isStopped(); if (done) { Status status = scriptRunner.getStatus(); String browserException = scriptRunner.getBrowserException(); if (browserException == null) browserException = ""; if (status == Status.ERROR) { return new SimpleHttpResponse("error:" + browserException); } else if (status == Status.FAILURE) { return new SimpleHttpResponse("failure:" + browserException); } } return new SimpleHttpResponse("" + done); } public SimpleHttpResponse getRecordedSteps(final HttpRequest request) { return new StepWiseRecorder().getSteps(request); } public void setLastIdentifiedElement(final HttpRequest request) { Session session = request.session(); session.setVariable("__sahi__lastIdentifiedElement", request.getParameter("element")); } public SimpleHttpResponse getLastIdentifiedElement(final HttpRequest request) { Session session = request.session(); String val = session.getVariable("__sahi__lastIdentifiedElement"); session.setVariable("__sahi__lastIdentifiedElement", null); return new SimpleHttpResponse(val == null ? "" : val); } public SimpleHttpResponse getAllRecordedSteps(final HttpRequest request) { return new StepWiseRecorder().getAllSteps(request); } public void startRecording(final HttpRequest request) { record(request); request.session().setIsWindowOpen(true); if (!"true".equals(request.getParameter("fromBrowser"))) setStep(request, "_sahi.openController()"); } private void record(final HttpRequest request) { Session session = request.session(); session.setIsRecording(true); new StepWiseRecorder().start(request); session.setIsPlaying(false); } public void stopRecording(final HttpRequest request) { new StepWiseRecorder().stop(request); Session session = request.session(); session.setIsWindowOpen(false); if (!"true".equals(request.getParameter("fromBrowser"))) setStep(request, "_sahi.closeController()"); session.setIsRecording(false); session.setIsPlaying(true); } public SimpleHttpResponse isRecording(final HttpRequest request) { return new SimpleHttpResponse("" + request.session().isRecording()); } private void setStep(final HttpRequest request, String step) { Session session = request.session(); session.getScriptRunner().setStep(step, ""); } public void setSpeed(final HttpRequest request) { try { String speed = request.getParameter("speed"); logger.debug("setTimeBetweenSteps to " + speed); Configuration.setTimeBetweenSteps(Integer.parseInt(speed)); } catch (Exception e) { e.printStackTrace(); } } }