/* MonkeyTalk - a cross-platform functional testing tool Copyright (C) 2012 Gorilla Logic, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.gorillalogic.agents.html; import java.io.IOException; import java.lang.reflect.Method; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.firefox.internal.ClasspathExtension; import com.gorillalogic.agents.html.browser.BrowserType; import com.gorillalogic.agents.html.processor.SeleniumCommandProcessor; import com.gorillalogic.monkeytalk.agents.MTAgent; import com.gorillalogic.monkeytalk.sender.CommandSender; public class WebDriverAgent extends MTAgent { protected SeleniumCommandProcessor scp; public WebDriverAgent() { super("localhost", 80); } public WebDriverAgent(int port) { super(port); } @Override public String getName() { return "WebDriver"; } @Override protected CommandSender createCommandSender(String host, int port) { return null; /* return new CommandSender(host, port) { @Override public Response play(Command command) { try { return scp.processACommand(command); } catch (IllegalArgumentException ex) { return new Response(HttpStatus.BAD_REQUEST.getCode(), ex.getMessage()); } catch (Exception ex) { ex.printStackTrace(); return new Response(HttpStatus.INTERNAL_ERROR.getCode(), ex.getClass().getName() + ": " + ex.getMessage()); } } @Override public Response play(String componentType, String monkeyId, String action, List<String> args, Map<String, String> modifiers) { return play(new Command(componentType, monkeyId, action, args, modifiers)); } @Override public Response ping(boolean recordOn, String recordHost, int recordPort) { try { WebDriverAgent.this.ping(); } catch (Exception ex) { return new Response(HttpStatus.INTERNAL_ERROR.getCode(), "WebDriver not responding to ping: " + ex.getMessage()); } return new Response(); } }; */ } @Override public void start() { try { ping(); } catch (Exception e) { FirefoxProfile profile = new FirefoxProfile(); try { Method m = FirefoxProfile.class.getDeclaredMethod("addExtension", String.class, org.openqa.selenium.firefox.internal.Extension.class); m.setAccessible(true); // ClasspathExtension extension = new ClasspathExtension(SeleniumCommandProcessor.class, // "/" + SeleniumCommandProcessor.class.getPackage().getName().replace(".", "/") + "/selenium-ide.xpi"); // m.invoke(profile, "selenium-ide", extension); ClasspathExtension extension = new ClasspathExtension(SeleniumCommandProcessor.class, "/" + SeleniumCommandProcessor.class.getPackage().getName().replace(".", "/") + "/monkeytalk-recorder.xpi"); m.invoke(profile, "monkeytalk-recorder", extension); } catch (Exception ex) { throw new IllegalStateException("Unable to install monkeytalk-recorder firefox extension: " + ex.getMessage()); } scp = new SeleniumCommandProcessor(BrowserType.FIREFOX, getHost(), new FirefoxDriver(profile)); } } @Override public void close() { if (scp != null) { scp.driver.close(); } } protected void ping() throws IOException { try { scp.driver.getCurrentUrl(); } catch (Exception e) { throw new IOException("Unable to contact WebDriver"); } } }