package com.framework.site.pages.bookingengine;
import com.framework.driver.event.ExpectedConditions;
import com.framework.driver.event.HtmlDriverWait;
import com.framework.driver.event.HtmlElement;
import com.framework.driver.extensions.jquery.By;
import com.framework.site.data.DeparturePorts;
import com.framework.site.data.Destinations;
import com.framework.site.data.Ships;
import com.framework.site.data.TripDurations;
import com.framework.site.pages.BaseCarnivalPage;
import com.framework.testing.annotations.DefaultUrl;
import com.framework.utils.datetime.Sleeper;
import com.framework.utils.datetime.TimeConstants;
import com.framework.utils.error.PreConditions;
import com.framework.utils.matchers.JMatchers;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.RandomUtils;
import org.joda.time.DateTime;
import org.openqa.selenium.InvalidElementStateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* Created with IntelliJ IDEA ( LivePerson : www.liveperson.com )
*
* Package: com.framework.site.pages.core
*
* Name : CruiseToPage
*
* User : solmarkn / Dani Vainstein
*
* Date : 2015-01-10
*
* Time : 01:17
*/
@DefaultUrl( value = "/find-a-cruise", matcher = "endsWith()" )
public class FindACruisePage extends BaseCarnivalPage
{
//region FindACruisePage - Variables Declaration and Initialization Section.
private static final Logger logger = LoggerFactory.getLogger( FindACruisePage.class );
private static final String LOGICAL_NAME = "Find a Cruise Page";
public enum NumberOfTravelers{ ONE, TWO, THREE, FOUR, FIVE, MULTIPLE }
// ------------------------------------------------------------------------|
// --- WEB-OBJECTS DEFINITIONS --------------------------------------------|
// ------------------------------------------------------------------------|
// ------------------------------------------------------------------------|
// --- WEB-OBJECTS CACHING ------------------------------------------------|
// ------------------------------------------------------------------------|
private List<HtmlElement> loaders = Lists.newArrayList();
private HtmlElement check_list;
//endregion
//region FindACruisePage - Constructor Methods Section
public FindACruisePage()
{
super( LOGICAL_NAME );
validatePageInitialState();
}
//endregion
//region FindACruisePage - Initialization and Validation Methods Section
@Override
protected void validatePageInitialState()
{
logger.debug( "validating static elements for: <{}>, name:<{}>...", getQualifier(), getLogicalName() );
loaders = getDriver().findElements( By.cssSelector( "i.loader" ) );
HtmlDriverWait.wait10( getDriver() ).until(
ExpectedConditions.visibilityOfAll( loaders, false ) );
}
//endregion
//region StateRoomsPage - Service Methods Section
private void doSelectFromDropDown( HtmlElement selectDD, HtmlElement target )
{
HtmlElement toggle = selectDD.findElement( By.className( "toggle" ) );
HtmlElement menu = selectDD.findElement( By.className( "menu" ) );
toggle.click();
selectDD.waitAttributeToMatch( "class", JMatchers.endsWith( "active" ), TimeConstants.FIVE_SECONDS );
menu.waitToBeDisplayed( true, TimeConstants.THREE_SECONDS );
HtmlElement scrollDown = selectDD.findElement( By.cssSelector( "a.scroller.scroll-down" ) );
while( ! target.isDisplayed() )
{
scrollDown.click();
Sleeper.pauseFor( 100 );
}
target.click();
HtmlDriverWait.wait10( getDriver() ).until(
ExpectedConditions.visibilityOfAll( loaders, false ) );
}
private void doSelectCheckbox( HtmlElement he, boolean check )
{
String className = he.getAttribute( "class" );
if( "selected".equals( className ) && ( ! check ) )
{
he.click();
he.waitAttributeToMatch( "class", JMatchers.is( "" ), TimeConstants.TWO_SECONDS );
}
else if( className.equals( "" ) && check )
{
he.click();
he.waitAttributeToMatch( "class", JMatchers.is( "selected" ), TimeConstants.TWO_SECONDS );
}
}
//endregion
//region FindACruisePage - Business Methods Section
public String selectNumberOfTravelers( NumberOfTravelers travelers )
{
PreConditions.checkNotNull( travelers, "NumberOfTravelers argument port cannot be null" );
logger.info( "Selecting \"Number of Travelers\" < {} >", travelers );
String dataId = null;
switch( travelers )
{
case ONE:
dataId = "1";
break;
case TWO:
dataId = "2";
break;
case THREE:
dataId = "3";
break;
case FOUR:
dataId = "4";
break;
case FIVE:
dataId = "5";
break;
case MULTIPLE:
dataId = "99";
}
HtmlElement he = findTravelerAnchor( dataId );
he.click();
he.waitAttributeToMatch( "class", JMatchers.is( "selected" ), TimeConstants.FIVE_SECONDS );
return dataId;
}
public String selectNumberOfTravelers()
{
List<HtmlElement> anchors = findTravelersAnchors();
int selected = RandomUtils.nextInt( 0, anchors.size() - 1 );
logger.info( "Selecting random number of \"Number of Travelers\" < {} >", selected );
HtmlElement he = anchors.get( selected );
he.click();
he.waitAttributeToMatch( "class", JMatchers.is( "selected" ), TimeConstants.FIVE_SECONDS );
return he.getAttribute( "data-id" );
}
public String selectSailTo( Destinations destinations )
{
PreConditions.checkNotNull( destinations, "Destinations argument port cannot be null" );
logger.info( "Selecting \"Sail To\" < {} >", destinations.name() );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='dest']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( ".menu li a[data-id='" + destinations.getId() + "']" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectSailTo( int index )
{
logger.info( "Selecting \"Sail To\" index < {} >", index );
PreConditions.checkArgument( index > 0, "The index must be greater than 0" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='dest']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "li:nth-child(" + index + ")" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectSailTo()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='dest']" ) );
List<HtmlElement> targets = selectDD.findElements( By.tagName( "li" ) );
int selected = RandomUtils.nextInt( 1, targets.size() - 1 );
logger.info( "Selecting a random \"Sail To\". selected index is < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public String selectDateFrom( DateTime dte )
{
PreConditions.checkNotNull( dte, "DateTime argument port cannot be null" );
String dataId = dte.toString( "MMddyyyy" );
logger.info( "Selecting \"Date From\" < {} >", dataId );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='datFrom']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "a[data-id='" + dataId + "']" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectDateFrom()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='datFrom']" ) );
List<HtmlElement> targets = selectDD.findElements( By.cssSelector( "div.menu .overview a" ) );
int selected = RandomUtils.nextInt( 1, targets.size() );
logger.info( "Selecting a random \"Date From\", selected index < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public String selectDateTo( DateTime dte )
{
PreConditions.checkNotNull( dte, "DateTime argument port cannot be null" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='datTo']" ) );
String className = selectDD.getAttribute( "class" );
PreConditions.checkState( ! className.endsWith( "disabled" ), "Select Date To is currently disabled" );
String dataId = dte.toString( "MMddyyyy" );
logger.info( "Selecting \"Date To\" < {} >", dataId );
HtmlElement target = selectDD.findElement( By.cssSelector( "a[data-id='" + dataId + "']" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectDateTo()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='datTo']" ) );
String className = selectDD.getAttribute( "class" );
PreConditions.checkState( ! className.endsWith( "disabled" ), "Select Date To is currently disabled" );
List<HtmlElement> targets = selectDD.findElements( By.cssSelector( "div.menu .overview a" ) );
int selected = RandomUtils.nextInt( 1, targets.size() );
logger.info( "Selecting a random \"Date To\", selected index < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public boolean isDurationAvailable( TripDurations duration )
{
Sleeper.pauseFor( 1000 );
HtmlElement toggle = getDriver().findElement( By.cssSelector( ".toggle-buttons[data-param='dur']" ) );
HtmlElement target = toggle.findElement( By.cssSelector( "a[data-Id='" + duration.getId() + "']" ) );
boolean disabled = target.getAttribute( "class" ).endsWith( "disabled" );
boolean enabled = ! disabled;
logger.info( "Determine if duration < {} > is available < {} >", duration.name(), enabled );
return enabled;
}
public String selectCruiseLength( TripDurations duration )
{
PreConditions.checkNotNull( duration, "TripDurations argument port cannot be null" );
logger.info( "Selecting \"Cruise Length\" < {} >", duration.name() );
HtmlElement toggle = getDriver().findElement( By.cssSelector( ".toggle-buttons[data-param='dur']" ) );
HtmlElement target = toggle.findElement( By.cssSelector( "a[data-Id='" + duration.getId() + "']" ) );
if( target.getAttribute( "class" ).endsWith( "disabled" ) )
{
throw new InvalidElementStateException( "The trip duration " + duration.getTitle() + " is disabled" );
}
Sleeper.pauseFor( 500 );
target.click();
target.waitAttributeToMatch( "class", JMatchers.is( "selected" ), TimeConstants.FIVE_SECONDS );
return duration.getId();
}
public String selectCruiseLength()
{
HtmlElement toggle = getDriver().findElement( By.cssSelector( ".toggle-buttons[data-param='dur']" ) );
int selected = RandomUtils.nextInt( 0, 2 );
TripDurations duration = TripDurations.values()[ selected ];
logger.info( "Selecting a random \"Cruise Length\" < {} >", duration.name() );
HtmlElement target = toggle.findElement( By.cssSelector( "a[dataId='" + duration.getId() + "']" ) );
target.click();
target.waitAttributeToMatch( "class", JMatchers.is( "selected" ), TimeConstants.FIVE_SECONDS );
return duration.getId();
}
public String selectSailFrom( DeparturePorts port )
{
PreConditions.checkNotNull( port, "DeparturePorts argument port cannot be null" );
logger.info( "Selecting \"Sail From\" length < {} >", port.name() );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='port']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( ".menu li a[data-id='" + port.getId() + "']" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectSailFrom( int index )
{
logger.info( "Selecting \"Sail From\" index < {} >", index );
PreConditions.checkArgument( index > 0, "The index must be greater than 0" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='port']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "li:nth-child(" + index + ")" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectSailFrom()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='port']" ) );
List<HtmlElement> targets = selectDD.findElements( By.tagName( "li" ) );
int selected = RandomUtils.nextInt( 1, targets.size() - 1 );
logger.info( "Selecting a random \"Sail From\". selected index is < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public String selectCruiseShip( Ships ship )
{
PreConditions.checkNotNull( ship, "Ships argument port cannot be null" );
logger.info( "Selecting \"Cruise Ship\" < {} >", ship.name() );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='shipCode']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( ".menu li a[data-id='" + ship.getId() + "']" ) );
String id = target.getAttribute( "data-id" );
doSelectFromDropDown( selectDD, target );
return id;
}
public String selectCruiseShip( int index )
{
logger.info( "Selecting \"Cruise Ship\" index < {} >", index );
PreConditions.checkArgument( index > 0, "The index must be greater than 0" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='shipCode']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "li:nth-child(" + index + ")" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectCruiseShip()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='shipCode']" ) );
List<HtmlElement> targets = selectDD.findElements( By.tagName( "li" ) );
int selected = RandomUtils.nextInt( 1, targets.size() - 1 );
logger.info( "Selecting a random \"Cruise Ship\". selected index is < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public String selectPerformer( int index )
{
logger.info( "Selecting \"Performer\" index < {} >", index );
PreConditions.checkArgument( index > 0, "The index must be greater than 0" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='event']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "li:nth-child(" + index + ")" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectPerformer()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='event']" ) );
List<HtmlElement> targets = selectDD.findElements( By.tagName( "li" ) );
int selected = RandomUtils.nextInt( 1, targets.size() - 1 );
logger.info( "Selecting a random \"Performer\". selected index is < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public String selectState( int index )
{
logger.info( "Selecting \"State\" index < {} >", index );
PreConditions.checkArgument( index > 0, "The index must be greater than 0" );
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='StateCode']" ) );
HtmlElement target = selectDD.findElement( By.cssSelector( "li:nth-child(" + index + ")" ) );
doSelectFromDropDown( selectDD, target );
return target.getAttribute( "data-id" );
}
public String selectState()
{
HtmlElement selectDD = getDriver().findElement( By.cssSelector( "div.select-dd[data-param='StateCode']" ) );
List<HtmlElement> targets = selectDD.findElements( By.tagName( "li" ) );
int selected = RandomUtils.nextInt( 1, targets.size() - 1 );
logger.info( "Selecting a random \"State\". selected index is < {} >", selected );
doSelectFromDropDown( selectDD, targets.get( selected ) );
return targets.get( selected ).getAttribute( "data-id" );
}
public void selectOver55( boolean check )
{
HtmlElement he = getDriver().findElement( By.cssSelector( "a.alt-info[data-param='Senior']" ) );
doSelectCheckbox( he, check );
}
public void selectMilitary( boolean check )
{
HtmlElement he = getDriver().findElement( By.cssSelector( "a.alt-info[data-param='Military']" ) );
doSelectCheckbox( he, check );
}
public void selectVifpClub( boolean check )
{
HtmlElement he = getDriver().findElement( By.cssSelector( "a.alt-info[data-param='PastGuest']" ) );
HtmlElement guest_number = getDriver().findElement( By.id( "past-guest-number" ) );
HtmlElement guest_submit = getDriver().findElement( By.id( "past-guest-submit" ) );
doSelectCheckbox( he, check );
guest_number.waitToBeDisplayed( true, TimeConstants.THREE_SECONDS );
guest_submit.waitToBeDisplayed( true, TimeConstants.THREE_SECONDS );
}
public CruiseSearchPage clickSearchCruises()
{
HtmlElement search = getDriver().findElement( By.cssSelector( "a.search.red-cta" ) );
search.click();
return new CruiseSearchPage();
}
//endregion
//region FindACruisePage - Element Finder Methods Section
private HtmlElement findTravelerAnchor( String dataId )
{
String PATTERN = "ul.toggle-buttons[data-id='numGuests'] li > a[data-param='%s']";
return getDriver().findElement( By.cssSelector( String.format( PATTERN, dataId ) ) );
}
private List<HtmlElement> findTravelersAnchors()
{
String PATTERN = "ul.toggle-buttons[data-id='numGuests'] li > a";
return getDriver().findElements( By.cssSelector( "ul.toggle-buttons[data-param='numGuests'] li > a" ) );
}
private HtmlElement findCheckList()
{
if( null == check_list )
{
check_list = getDriver().findElement( By.cssSelector( "ul.check-list" ) );
}
return check_list;
}
//endregion
}