package com.smash.revolance.ui.materials.mock.webdriver;
import com.smash.revolance.ui.materials.JsonHelper;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* User: wsmash
* Date: 03/10/13
* Time: 20:02
*/
public class WebPageDataExtractor
{
private String url;
public WebPageDataExtractor(String url)
{
this.url = url;
}
public void extractToFile(File file) throws Exception
{
WebDriver browser = new FirefoxDriver();
browser.navigate().to( url );
List<WebElement> elements = browser.findElements( By.xpath( "//body//*" ) );
String caption = takeScreenshot( browser );
int w = getWidth( browser );
int h = getHeight( browser );
MockedWebPage page = new MockedWebPage();
page.setUrl( browser.getCurrentUrl() );
page.setTitle( browser.getTitle() );
page.setH( h );
page.setW( w );
page.setCaption( caption );
List<MockedWebElement> content = new ArrayList<MockedWebElement>();
for ( WebElement element : elements )
{
MockedWebElement mockedElement = new MockedWebElement( UUID.randomUUID().toString() );
Dimension dim = element.getSize();
mockedElement.setW( dim.getWidth() );
mockedElement.setH( dim.getHeight() );
if ( dim.getHeight() * dim.getWidth() != 0 )
{
Point location = element.getLocation();
mockedElement.setX( location.getX() );
mockedElement.setY( location.getY() );
mockedElement.setTag( element.getTagName() );
mockedElement.setText( element.getText() );
mockedElement.setClazz( element.getAttribute( "class" ) );
mockedElement.setId( element.getAttribute( "id" ) );
mockedElement.setHref( element.getAttribute( "href" ) );
mockedElement.setType( element.getAttribute( "type" ) );
mockedElement.setBg( element.getCssValue( "background-image" ) );
mockedElement.setDisabled( element.getCssValue( ":disabled" ).contentEquals( "true" ) ? true : false );
mockedElement.setDisplayed( element.isDisplayed() );
content.add( mockedElement );
}
}
page.setContent( content );
browser.quit();
if ( content.isEmpty() )
{
throw new Exception( "Content page is empty for url: " + url );
} else
{
String data = JsonHelper.getInstance().map( page );
FileUtils.writeStringToFile( file, data );
}
}
private String takeScreenshot(WebDriver browser)
{
try
{
return ( (TakesScreenshot) browser ).getScreenshotAs( OutputType.BASE64 );
}
catch (Exception e)
{
sleep( 1 );
return takeScreenshot( browser );
}
}
private static void sleep(long duration)
{
int count = 0;
while ( count < duration )
{
try
{
Thread.sleep( 1000 );
count++;
}
catch (InterruptedException e)
{
// Ignore gently !
}
}
}
private int getHeight(WebDriver driver) throws Exception
{
Object o = runJS( driver, "var D = document; return Math.max(D.body.scrollHeight, D.documentElement.scrollHeight,D.body.offsetHeight, D.documentElement.offsetHeight,D.body.clientHeight, D.documentElement.clientHeight);" );
return Integer.parseInt( String.valueOf( (Long) o ) );
}
private int getWidth(WebDriver driver) throws Exception
{
Object o = runJS( driver, "var D = document; return Math.max(D.body.scrollWidth, D.documentElement.scrollWidth,D.body.offsetWidth, D.documentElement.offsetWidth,D.body.clientWidth, D.documentElement.clientWidth);" );
return Integer.parseInt( String.valueOf( (Long) o ) );
}
public Object runJS(WebDriver driver, String script) throws Exception
{
try
{
JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript( script );
}
catch (Exception e)
{
return null;
}
}
}