/* * JBoss, Home of Professional Open Source * Copyright 2008, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.seam.example.common.test.booking.webdriver; import java.util.ArrayList; import java.util.List; import org.jboss.seam.example.common.test.webdriver.AjaxWebDriverTest; import org.jboss.seam.example.common.test.webdriver.AjaxWebDriver; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.testng.annotations.Test; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import com.thoughtworks.selenium.Wait; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; import static org.testng.Assert.fail; /** * This class tests functionality of conversations in booking-like examples. * * @author Martin Gencur * */ public class ConversationTest extends AjaxWebDriverTest { public int timeout = 5000; private final String DEFAULT_USERNAME = "demo"; private final String DEFAULT_PASSWORD = "demo"; private final int W1 = 0; //first window private final int W2 = 1; //second window public final String MAIN_PAGE = "/main.seam"; public final String HOME_PAGE = "/home.seam"; public final String HOTEL1 = "Hotel Rouge"; public final String HOTEL2 = "Doubletree"; public final String PAGE_TITLE = "JBoss Suites: Seam Framework"; public final String WORKSPACE_BOOKING_TEXT_HOTEL1 = "Book hotel: " + HOTEL1; public final String WORKSPACE_VIEW_TEXT_HOTEL2 = "View hotel: " + HOTEL2; public final By LOGIN_USERNAME_FIELD = By.id("login:username"); public final By LOGIN_PASSWORD_FIELD = By.id("login:password"); public final By LOGIN_SUBMIT = By.id("login:login"); public final By SEARCH_STRING_FIELD = By.id("searchCriteria:searchString"); public final By SPINNER = By.id("searchCriteria:Spinner:connection-working"); public final By SEARCH_RESULT_TABLE = By.xpath("//table[@id = 'searchResults:hotels']/tbody"); public final By NO_HOTELS_FOUND = By.id("searchResults:NoHotelsFoundMessage"); public final By WORKSPACE_LINK_0 = By.id("ConversationListForm:ConversationListDataTable:0:EntryDescriptionLink"); public final By WORKSPACE_LINK_1 = By.id("ConversationListForm:ConversationListDataTable:1:EntryDescriptionLink"); public final By SEARCH_RESULT_TABLE_FIRST_ROW_LINK = By.id("searchResults:hotels:0:viewHotel"); public final By BOOKING_BOOK = By.id("hotel:bookHotel"); public final By BOOKING_CANCEL = By.id("hotel:cancel"); public final By LOGOUT = By.id("logout"); public final By WORKSPACE_TABLE_ROW_COUNT = By.xpath("//table[@id='ConversationListForm:ConversationListDataTable']/tbody/tr"); public List<String> windows = new ArrayList(); @BeforeMethod public void setUp() { //first window is opened automatically so just choose a page to display driver.get(serverURL + contextPath + MAIN_PAGE); //manually open second window with javascript openWindow(driver, serverURL + contextPath + MAIN_PAGE, "window2"); //get window handles so that we are able to access them by index for (String h: driver.getWindowHandles()) { windows.add(h); } } @AfterMethod public void tearDown() { closeWindows(); } @Test public void testConversations() { driver.switchTo().window(windows.get(W1)); if (!isLoggedIn(driver)) { login(driver); } enterSearchQueryUsingAJAX(driver, HOTEL1); pause(timeout); driver.findElement(SEARCH_RESULT_TABLE_FIRST_ROW_LINK).clickAndWait(); driver.findElement(BOOKING_BOOK).click(); driver.switchTo().window(windows.get(W2)); driver.navigate().refresh(); pause(timeout); if (!isLoggedIn(driver)) { login(driver); } pause(timeout); enterSearchQueryUsingAJAX(driver, HOTEL2); driver.findElement(SEARCH_RESULT_TABLE_FIRST_ROW_LINK).clickAndWait(); driver.switchTo().window(windows.get(W1)); driver.navigate().refresh(); pause(timeout); assertEquals("#1 workspace not present in workspace table", WORKSPACE_BOOKING_TEXT_HOTEL1, driver.findElement(WORKSPACE_LINK_0).getText()); assertEquals("#2 workspace not present in workspace table", WORKSPACE_VIEW_TEXT_HOTEL2, driver.findElement(WORKSPACE_LINK_1).getText()); //Switch window 1 to second workspace driver.findElement(WORKSPACE_LINK_1).clickAndWait(); // Switch window 1 back to first workspace driver.findElement(WORKSPACE_LINK_1).clickAndWait(); driver.switchTo().window(windows.get(W2)); // End conversation in window 2 driver.findElement(BOOKING_CANCEL).clickAndWait(); assertTrue("Workspace failure.", driver.findElements(WORKSPACE_TABLE_ROW_COUNT).size() == 1); } public void enterSearchQueryUsingAJAX(final AjaxWebDriver driver, String query) { driver.findElement(SEARCH_STRING_FIELD).clearAndSendKeys(query.substring(0, query.length() - 1)); driver.findElement(SEARCH_STRING_FIELD).sendKeys(query.substring(query.length() - 1)); // wait for javascript to show spinner try { Thread.sleep(3000); } catch (InterruptedException e) { } new Wait() { @Override public boolean until() { return (driver.isElementPresent(SEARCH_RESULT_TABLE) || driver.isElementPresent(NO_HOTELS_FOUND)); } }.wait("Search results not found."); } public boolean login(AjaxWebDriver driver) { return login(driver, DEFAULT_USERNAME, DEFAULT_PASSWORD); } public boolean login(AjaxWebDriver driver, String username, String password) { /*if (isLoggedIn(driver)) { fail("User already logged in."); }*/ driver.get(serverURL + contextPath + HOME_PAGE); pause(timeout); if (!driver.getTitle().equals(PAGE_TITLE)) { return false; } driver.findElement(LOGIN_USERNAME_FIELD).sendKeys(username); driver.findElement(LOGIN_PASSWORD_FIELD).sendKeys(password); driver.findElement(LOGIN_SUBMIT).clickAndWait(); pause(timeout); return isLoggedIn(driver); } public boolean isLoggedIn(AjaxWebDriver driver) { return driver.isElementPresent(LOGOUT); } public void openWindow(AjaxWebDriver driver, String url, String windowName) { ((JavascriptExecutor) driver).executeScript("window.open('"+ url +"','" + windowName +"')"); } public void closeWindows() { for (String h: windows) { driver.switchTo().window(h); driver.close(); } } private void pause(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } } }