package com.framework.site.config; import com.framework.asserts.CheckPointCollector; import com.framework.asserts.CheckPointFactory; import com.framework.asserts.CheckpointAssert; import com.framework.asserts.JAssertion; import com.framework.config.Configurations; import com.framework.config.FrameworkConfiguration; import com.framework.driver.event.HtmlDriver; import com.framework.driver.event.HtmlElement; import com.framework.site.pages.core.HomePage; import com.framework.utils.conversion.Converter; import com.framework.utils.error.PreConditions; import org.apache.commons.lang3.math.NumberUtils; import org.openqa.selenium.Capabilities; import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.logging.Logs; import org.openqa.selenium.remote.SessionId; import org.openqa.selenium.remote.UnreachableBrowserException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URL; import java.util.Locale; import java.util.Set; /** * Created with IntelliJ IDEA ( LivePerson : www.liveperson.com ) * * Package: com.framework.site.config * * Name : SiteSession * * User : solmarkn / Dani Vainstein * * Date : 2015-01-22 * * Time : 11:39 * */ public class SiteSessionManager implements CheckPointFactory { //region SiteSessionManager - Variables Declaration and Initialization Section. private final Logger logger = LoggerFactory.getLogger( SiteSessionManager.class ); private static volatile SiteSessionManager instance = null; private String lastWindowHandle; //private boolean highLightOnClick = true; //todo: documentation //private boolean highLightOnHover = true; private final FrameworkConfiguration configuration = Configurations.getInstance(); private String hstValue; private long implicitlyWaitMillis; private long pageLoadTimeoutMillis; private long scriptExecutionTimeoutMillis; private HtmlDriver webDriver = null; private CheckPointCollector collector = new CheckPointCollector(); private boolean lastTestCaseFailed = true; //endregion //region SiteSessionManager - Constructor Methods Section private SiteSessionManager() { // } public synchronized static SiteSessionManager get() { if ( instance == null ) { instance = new SiteSessionManager(); } return instance; } //endregion //region SiteSession - Service Methods Section public void closeSession() { try { if( getWindowHandles().size() == 1 ) { getDriver().quit(); this.webDriver = null; } else { getDriver().close(); } } catch ( UnreachableBrowserException ubEx ) { this.webDriver = null; } } public void endSession() { try { if( null != getDriver() ) { getDriver().quit(); this.webDriver = null; } } catch ( UnreachableBrowserException ubEx ) { this.webDriver = null; } } public void startSession() { if( null == webDriver ) { setWebDriver( Configurations.getInstance().getWebDriverFactory().createWebDriver( configuration ) ); if ( currentScriptExecutionTimeoutMillis() != configuration.defaultPageLoadTimeout() ) { setCurrentPageLoadTimeoutMillis( configuration.defaultPageLoadTimeout() ); } if ( currentImplicitlyWaitMillis() != configuration.defaultImplicitlyWait() ) { setCurrentImplicitlyWaitMillis( configuration.defaultImplicitlyWait() ); } if ( currentPageLoadTimeoutMillis() != configuration.defaultPageLoadTimeout() ) { setCurrentPageLoadTimeoutMillis( configuration.defaultPageLoadTimeout() ); } if ( configuration.cleanAllCookiesOnStartUp() ) { this.deleteAllCookies(); } if ( configuration.maximizeAtStartUp() ) { if( getDriver().getWrappedDriver() instanceof ChromeDriver ) { getDriver().executeScript( "window.resizeTo( 1024, 768);" ); } else { this.window().maximize(); } } } else { throw new WebDriverException( "Session WebDriver was already initialized" ); } } @Override public void assertAllCheckpoints() { PreConditions.checkNotNull( collector, "The collector is empty or null" ); if( null != collector ) { collector.assertAll(); } } @Override public CheckpointAssert createCheckPoint( final String id ) { return new CheckpointAssert( getDriver(), id, collector ); } @Override public CheckpointAssert createCheckPoint( HtmlElement element, final String id ) { return new CheckpointAssert( element, id, collector ); } public FrameworkConfiguration getConfiguration() { return this.configuration; } //endregion //region SiteSessionManager - WebDriver Utility Methods Section public HtmlDriver.Window window() { return getDriver().manage().window(); } public Set<String> getWindowHandles() { return getDriver().getWindowHandles(); } public void deleteAllCookies() { getDriver().manage().deleteAllCookies(); } public Cookie getCookieNamed( final String name ) { return getDriver().manage().getCookieNamed( name ); } public Logs logs() { return getDriver().manage().logs(); } public Capabilities getCapabilities() { return getDriver().getCapabilities(); } public SessionId getSessionId() { return getDriver().getSessionId(); } public HtmlDriver.SessionStorage getSessionStorage() { return getDriver().sessionStorage(); } public JAssertion createAssertion() { return new JAssertion( getDriver() ); } //endregion //region SiteSession - SiteVariables Implementation Section public Locale getCurrentLocale() { return Configurations.getInstance().getLocale(); } public URL getCurrentUrl() { return Converter.toURL( getDriver().getCurrentUrl() ); } public boolean isHomePage() { return getCurrentUrl().equals( getBaseUrl() ); } public boolean isSessionRunning() { return null != getDriver(); } public URL getBaseUrl() { return getConfiguration().baseUrl(); } public String getHstValue() { return hstValue; } public void setHstValue( final String hst ) { this.hstValue = hst; } public HomePage getHomePage() { if( null != getDriver() ) { return new HomePage(); } else { startSession(); return new HomePage(); } } private long currentImplicitlyWaitMillis() { return implicitlyWaitMillis; } private void setCurrentImplicitlyWaitMillis( final long millis ) { final String ERR_MSG = "invalid value < %d >. The millis value should be equal or greater than zero."; PreConditions.checkArgument( millis >= NumberUtils.LONG_ZERO, ERR_MSG, millis ); this.implicitlyWaitMillis = millis; getDriver().manage().timeouts().implicitlyWait( millis ); } private long currentPageLoadTimeoutMillis() { return pageLoadTimeoutMillis; } private void setCurrentPageLoadTimeoutMillis( final long millis ) { final String ERR_MSG = "invalid value < %d >. The millis value should be equal or greater than zero."; PreConditions.checkArgument( millis >= NumberUtils.LONG_ZERO, ERR_MSG, millis ); this.pageLoadTimeoutMillis = millis; getDriver().manage().timeouts().pageLoadTimeout( millis ); } private long currentScriptExecutionTimeoutMillis() { return scriptExecutionTimeoutMillis; } private void setCurrentScriptExecutionTimeoutMillis( final long millis ) { final String ERR_MSG = "invalid value < %d >. The millis value should be equal or greater than zero."; PreConditions.checkArgument( millis >= NumberUtils.LONG_ZERO, ERR_MSG, millis ); this.scriptExecutionTimeoutMillis = millis; getDriver().manage().timeouts().setScriptTimeout( millis ); } public boolean isLastTestCaseFailed() { return lastTestCaseFailed; } public void setLastTestCaseFailed( final boolean lastTestCaseFailed ) { this.lastTestCaseFailed = lastTestCaseFailed; } //endregion public HtmlDriver getDriver() { if( null == webDriver ) return null; logger.debug( "returning an instance of HtmlDriver" ); if( webDriver.getWindowHandles().size() == 2 ) { if( null == lastWindowHandle ) { lastWindowHandle = webDriver.getWindowHandle(); webDriver.switchTo().window( getNewWindowHandle() ); } } return this.webDriver; } private void setWebDriver( final HtmlDriver webDriver ) { this.webDriver = webDriver; } private String getNewWindowHandle() { lastWindowHandle = webDriver.getWindowHandle(); for( String handle : webDriver.getWindowHandles() ) { if( ! handle.equals( lastWindowHandle ) ) { logger.debug( "new window handle is < {} >", handle ); return handle; } } return lastWindowHandle; } }