package com.bddinaction.flyinghigh.jbehave.pages; import com.google.common.base.Function; import net.thucydides.core.pages.PageObject; import net.thucydides.core.pages.WebElementState; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.Select; import java.util.ArrayList; import java.util.List; import static ch.lambdaj.Lambda.extract; import static ch.lambdaj.Lambda.on; public class BookingPage extends PageObject { @FindBy(id = "welcome-message") private WebElement welcomeMessage; @FindBy(css = ".typeahead li") private List<WebElement> typeaheadEntries; WebElement from; WebElement to; @FindBy(id="depart") WebElement departField; @FindBy(id="return") WebElement returnField; WebElement search; public String getWelcomeMessage() { return welcomeMessage.getText(); } public List<String> getFeaturedDestinations() { List<WebElement> featuredDestinationTitles = getDriver().findElements(By.cssSelector(".featured .destination-title")); return extract(featuredDestinationTitles, on(WebElement.class).getText()); } public void setFlightType(String flightType) { find(By.cssSelector("input[name='flightType'][value='" + flightType + "']")).click(); } public BookingPage setFrom(String fromCity) { from.sendKeys(fromCity); return this; } public String getFrom() { return from.getAttribute("value"); } public BookingPage setTo(String toCity) { to.sendKeys(toCity); return this; } public String getTo() { return to.getAttribute("value"); } public BookingPage setDepart(DateTime departDate) { departField.sendKeys(departDate.toString("dd/MM/yyyy")); return this; } public DateTime getDepart() { return DateTime.parse(departField.getAttribute("value"), DateTimeFormat.forPattern("dd/MM/yyyy")); } public void setTravelClass(String travelClass) { WebElement travelClassElt = getDriver().findElement(By.id("travel-class")); new Select(travelClassElt).selectByVisibleText(travelClass); } public List<String> getTypeaheadEntries() { List<String> entries = new ArrayList<String>(); for(WebElement typeaheadElement : typeaheadEntries) { entries.add(typeaheadElement.getText()); } return entries; } public List<String> getFromTypeaheads() { waitForRenderedElementsToBePresent(By.cssSelector(".typeahead")); List<String> menuEntries = new ArrayList<String>(); for(WebElement menuEntry : $("#main-navbar").thenFindAll("li")) { menuEntries.add(menuEntry.getText()); } return extract(typeaheadEntries, on(WebElement.class).getText()); } public Function<WebDriver, WebElement> typeaheadIsReady(WebDriver driver) { return new Function<WebDriver, WebElement>() { public WebElement apply(WebDriver driver){ return driver.findElement(By.className("typeahead")); } } ; } public Function<WebDriver, Boolean> typeaheadIsNotEmpty() { return new Function<WebDriver, Boolean>() { public Boolean apply(WebDriver driver){ return driver.findElements(By.cssSelector(".typeahead li")).size() > 0; } } ; } public WebElementState searchButton() { return $(search); } public void search() { search.click(); } public void waitUntilDisplayed() { waitForPresenceOf("#book"); } }