package com.framework.site.objects.body; import com.framework.asserts.JAssertion; import com.framework.driver.event.HtmlElement; import com.framework.driver.extensions.jquery.By; import com.framework.driver.objects.AbstractWebObject; import com.framework.site.data.DeparturePorts; import com.framework.site.data.Destinations; import com.framework.site.data.ItinerarySail; import com.framework.site.data.Ships; import com.framework.site.objects.body.interfaces.Itinerary; import com.framework.utils.datetime.TimeConstants; import com.framework.utils.error.PreConditions; import com.framework.utils.matchers.JMatchers; import com.framework.utils.string.ToLogStringStyle; import com.google.common.base.Optional; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.util.List; /** * Created with IntelliJ IDEA ( LivePerson : www.liveperson.com ) * * Package: com.framework.site.objects.body * * Name : ItineraryObject * * User : solmarkn / Dani Vainstein * * Date : 2015-03-13 * * Time : 15:34 * */ public class ItineraryObject extends AbstractWebObject implements Itinerary { //region ItineraryObject - Variables Declaration and Initialization Section. private static final Logger logger = LoggerFactory.getLogger( ItineraryObject.class ); static final String LOGICAL_NAME = "Itinerary Card"; private String itineraryId = StringUtils.EMPTY; private String sailingEventCode = StringUtils.EMPTY; String title = null; private BigDecimal price = null; private DeparturePorts port = null; private String portString = null; private String itinCloseId; // ------------------------------------------------------------------------| // --- WEB-OBJECTS CACHING ------------------------------------------------| // ------------------------------------------------------------------------| private HtmlElement itin_close_id, itin_select, itin_details_h4; //endregion //region ItineraryObject - Constructor Methods Section public ItineraryObject( final HtmlElement rootElement ) { super( rootElement, LOGICAL_NAME ); itineraryId = getRoot().getAttribute( "data-itinid" ); PreConditions.checkNotNullNotBlankOrEmpty( itineraryId, "itinerary id is currently null, empty or blank" ); sailingEventCode = StringUtils.defaultString( getRoot().getAttribute( "sailingeventcode" ), StringUtils.EMPTY ); itin_close_id = getRoot().findElement( By.cssSelector( "div.right-side > a" ) ); itinCloseId = itin_close_id.getAttribute( "data-itincloseid" ); initWebObject(); } //endregion //region ItineraryObject - Initialization and Validation Methods Section @Override protected void initWebObject() { logger.info( "validating static elements for web object id: <{}>, name:<{}>...", getQualifier(), getLogicalName() ); final String REASON = "assert that element \"%s\" exits"; JAssertion assertion = getRoot().createAssertion(); Optional<HtmlElement> es = getRoot().childExists( By.className( "wrapper" ), TimeConstants.FIVE_SECONDS ); assertion.assertThat( String.format( REASON, ".wrapper" ), es.isPresent(), JMatchers.is( true ) ); es = getRoot().childExists( By.cssSelector( ".wrapper.second-row" ), TimeConstants.THREE_SECONDS ); assertion.assertThat( String.format( REASON, ".wrapper.second-row" ), es.isPresent(), JMatchers.is( true ) ); es = getRoot().childExists( By.className( "alt-content" ), TimeConstants.THREE_SECONDS ); assertion.assertThat( String.format( REASON, ".alt-content" ), es.isPresent(), JMatchers.is( true ) ); title = getTitle(); price = getPrice(); port = getDeparturePort(); } //endregion //region ItineraryObject - Service Methods Section private HtmlElement getRoot() { return getBaseRootElement(); } @Override public String toString() { return new ToStringBuilder( this, ToLogStringStyle.LOG_LINE_STYLE ) .append( "itinerary Id", null == itineraryId ? "N/A" : itineraryId ) .append( "sailing Event Code", null == sailingEventCode ? "N/A" : sailingEventCode ) .append( "title", null == title ? "N/A" : title ) .append( "price", null == price ? "N/A" : price ) .append( "port", null == port ? "N/A" : port.name() ) .toString(); } //endregion //region ItineraryObject - Itinerary Implementation Section @Override public String itineraryId() { return itineraryId; } @Override public String sailEventCode() { return sailingEventCode; } @Override public void ShowHideDates( boolean show ) { logger.info( "{} itinerary dates for itinerary < {} >...", show ? "Showing " : "Hiding ", itineraryId ); String className = itin_close_id.getAttribute( "class" ); if( show && ( ! className.endsWith( "active" ) ) ) { HtmlElement span = getRoot().findElement( By.cssSelector( "div.right-side > a > span" ) ); itin_close_id.click(); span.waitTextToMatch( JMatchers.is( "Hide Dates" ), TimeConstants.THREE_SECONDS ); } else if( ! show && className.endsWith( "active" ) ) { HtmlElement span = getRoot().findElement( By.cssSelector( "div.right-side > a > span" ) ); itin_close_id.click(); span.waitTextToMatch( JMatchers.is( "Show Dates" ), TimeConstants.THREE_SECONDS ); } } @Override public HtmlElement getImage() { logger.info( "returning itinerary < {} > image ...", itineraryId ); return getRoot().findElement( By.cssSelector( "a.itin-img > img" ) ); } @Override public void compare() { } @Override public void addToFavorites() { } @Override public List<ItinerarySail> getSailings() { List<HtmlElement> uls = getRoot().findElements( By.cssSelector( "div.content .sailings ul" ) ); logger.info( "Returning a list of < {} > sailings for itinerary < {} >", uls.size(), itineraryId ); List<ItinerarySail> sailings = Lists.newArrayListWithCapacity( uls.size() ); for( HtmlElement ul : uls ) { sailings.add( new ItinerarySail( ul ) ); } return sailings; } @Override public ItinerarySail getTopBestPrice() { HtmlElement he = getRoot().findElement( By.className( ".top-best-price ul" ) ); return new ItinerarySail( he ); } @Override public String getTitle() { if( null != title ) return title; if( null == itin_select ) { itin_select = getRoot().findElement( By.cssSelector( "a.itin-select:not(.itin-img)" ) ); } String text = itin_select.getText(); logger.info( "Return itinerary title < {} > for itinerary id < {} >", text, itineraryId ); return text; } @Override public DeparturePorts getDeparturePort() { if( port != null ) return port; HtmlElement he = findItinDetailsH4(); String text = he.getText().replace( "from", "" ); DeparturePorts port = DeparturePorts.convert( text.trim() ); logger.info( "Returning departure port < {} > for itinerary is < {} >", port.name(), itineraryId ); return port; } @Override public String getDeparturePortAsString() { if( portString != null ) return portString; HtmlElement he = findItinDetailsH4(); portString = he.getAttribute( "textContent" ); return portString; } @Override public List<Destinations> getDestinations() { return null; } @Override public Ships getShip() { HtmlElement he = getRoot().findElement( By.cssSelector( "a.ship-lightbox" ) ); String text = he.getText().replace( "Carnival ", "" ); Ships ship = Ships.valueByName( text ); logger.info( "Returning ship < {} > for itinerary id < {} >", ship.name(), itineraryId ); return ship; } @Override public BigDecimal getPrice() { if( null != price ) return price; HtmlElement he = getRoot().findElement( By.cssSelector( "div.right-side strong" ) ); String text = he.getText().replace( "$", "" ).replace( "£", "" ); logger.info( "Returning price < {} > for itinerary id < {} >", text, itineraryId ); return new BigDecimal( text ); } @Override public void clickLearMore() { } //endregion //region ItineraryObject - Inner Classes Implementation Section private HtmlElement findArrowContainerLi() { return getRoot().findElement( By.cssSelector( "li.arrow-container a" ) ); } private HtmlElement findItinDetailsH4() { if( null == itin_details_h4 ) { itin_details_h4 = getRoot().findElement( By.cssSelector( ".itin-details h4" ) ); } return itin_details_h4; } //endregion }