package com.smash.revolance.ui.materials.mock.webdriver.browser;
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Revolance-UI-Materials-Mock-Webdriver-Service
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Copyright (C) 2012 - 2013 RevoLance
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
import org.apache.commons.exec.OS;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.remote.DriverCommand;
import org.openqa.selenium.remote.ErrorCodes;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* User: wsmash
* Date: 29/09/13
* Time: 13:47
*/
public class MockedBrowserController implements JSonWireListener
{
private MockedBrowser browser;
@Override
public synchronized void notify(JSonWireEvent event)
{
String name = (String) event.getProp( "command.name" );
String path = (String) event.getProp( "command.path" );
String elementId = (String) event.getProp( "command.elementId" );
String htmlAttribute = (String) event.getProp( "command.elementHtmlAttribute" );
String cssAttribute = (String) event.getProp( "command.elementCssAttribute" );
System.out.println( "Receiving command: " + name + " with path: " + path );
Map<String, Object> commandPayload = (Map<String, Object>) event.getProp( "command.payload" );
// Just the value part in the payload
Map<String, Object> resultPayload = new HashMap<String, Object>();
if ( isCommand( event, DriverCommand.NEW_SESSION ) )
{
browser = new MockedBrowser();
resultPayload.put( "browserName", this.getClass().getSimpleName() );
resultPayload.put( "browserPlatform", OS.isFamilyUnix() ? "LINUX" : "WINDOWS" );
resultPayload.put( "browserVersion", "0.0.1-SNAPSHOT" );
}
if ( isCommand( event, DriverCommand.SET_WINDOW_SIZE ) )
{
browser.setSize( (Integer) commandPayload.get( "width" ), (Integer) commandPayload.get( "height" ) );
}
if ( isCommand( event, DriverCommand.GET_WINDOW_SIZE ) )
{
Dimension dim = browser.getDimension();
resultPayload.put( "width", dim.getWidth() );
resultPayload.put( "height", dim.getHeight() );
}
if ( isCommand( event, DriverCommand.SET_WINDOW_POSITION ) )
{
browser.setLocation( (Integer) commandPayload.get( "x" ), (Integer) commandPayload.get( "y" ) );
}
if ( isCommand( event, DriverCommand.GET_WINDOW_POSITION ) )
{
Point location = browser.getLocation();
resultPayload.put( "x", location.getX() );
resultPayload.put( "y", location.getY() );
}
if ( isCommand( event, DriverCommand.GET_CURRENT_URL ) )
{
resultPayload.put( "url", browser.getUrl() );
}
if ( isCommand( event, DriverCommand.GET ) )
{
try
{
browser.goToUrl( (String) commandPayload.get( "url" ) );
}
catch (Exception e)
{
System.err.println( e );
}
}
if ( isCommand( event, DriverCommand.EXECUTE_SCRIPT ) )
{
resultPayload.put( "value",
browser.executeJavaScript( (String) commandPayload.get( "script" ), (Object[]) commandPayload.get( "args" ) ) );
}
if ( isCommand( event, DriverCommand.GET_ALERT_TEXT ) )
{
resultPayload.put( "alertStatusCode", ErrorCodes.NO_ALERT_PRESENT );
resultPayload.put( "alertMessage", "No alert is present" );
}
if ( isCommand( event, DriverCommand.GET_TITLE ) )
{
resultPayload.put( "title", browser.getTitle() );
}
if ( isCommand( event, DriverCommand.SCREENSHOT ) )
{
resultPayload.put( "screenshot", browser.takeScreenshot() );
}
if ( isCommand( event, DriverCommand.FIND_ELEMENTS ) )
{
List<String> elements = browser.findElements( (String) commandPayload.get( "value" ) );
resultPayload.put( "elementList", buildElementList( elements ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_LOCATION ) )
{
Point location = browser.getElementLocation( elementId );
resultPayload.put( "elementX", String.valueOf( location.getX() ) );
resultPayload.put( "elementY", String.valueOf( location.getY() ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_SIZE ) )
{
Dimension dim = browser.getElementSize( elementId );
resultPayload.put( "elementW", String.valueOf( dim.getWidth() ) );
resultPayload.put( "elementH", String.valueOf( dim.getHeight() ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_TAG_NAME ) )
{
resultPayload.put( "elementTagName", browser.getElementTag( elementId ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_TEXT ) )
{
resultPayload.put( "elementText", browser.getElementText( elementId ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_ATTRIBUTE ) )
{
resultPayload.put( "elementHtmlAttributeValue", browser.getElementHtmlAttribute( elementId, htmlAttribute ) );
}
if ( isCommand( event, DriverCommand.IS_ELEMENT_DISPLAYED ) )
{
resultPayload.put( "isElementDisplayed", browser.isElementDisplayed( elementId ) );
}
if ( isCommand( event, DriverCommand.GET_ELEMENT_VALUE_OF_CSS_PROPERTY ) )
{
resultPayload.put( "elementCssAttributeValue", browser.getElementCssAttribute( elementId, cssAttribute ) );
}
event.setProp( "command.value", resultPayload );
notifyAll();
}
private boolean isCommand(JSonWireEvent event, String cmd)
{
return ( (String) event.getProp( "command.name" ) ).contentEquals( cmd );
}
private String buildElementList(java.util.List<String> elementIds)
{
StringBuilder str = new StringBuilder();
str.append( "[" );
for ( String elementId : elementIds )
{
str.append( "{" );
str.append( "\"ELEMENT\":\"{" ).append( elementId ).append( "}\"" );
str.append( "}" );
if ( isLastElement( elementId, elementIds ) )
{
str.append( "," );
}
}
str.append( "]" );
return str.toString();
}
private boolean isLastElement(String elementId, List<String> elementIds)
{
return !elementIds.get( elementIds.size() - 1 ).contentEquals( elementId );
}
}