/*
* 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.remoting.chatroom.test.webdriver;
//import static junit.framework.Assert.assertTrue;
import org.jboss.seam.example.common.test.webdriver.AjaxWebDriverFactory;
import org.jboss.seam.example.common.test.webdriver.AjaxWebDriverTest;
import org.jboss.seam.example.common.test.webdriver.AjaxWebElement;
import org.jboss.seam.example.common.test.webdriver.AjaxWebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.testng.annotations.Test;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertNull;
import static org.testng.Assert.fail;
/**
* This class tests functionality of remoting/chatroom example.
* The test opens two browsers and tests communication between users.
*
* @author Martin Gencur
*
*/
public class WebDriverChatroomTest extends AjaxWebDriverTest
{
public static int timeout = 16000;
public static final String NAME1 = "Martin";
public static final String NAME2 = "Jozef";
public static final String MESSAGE_FROM_MARTIN = "Hello";
public static final String MESSAGE_FROM_JOZEF = "Good evening";
public static final String HOME_PAGE = "/chatroom.seam";
public static final String HOME_PAGE_TITLE = "Chat Room Example";
public static final By NAME_INPUT = By.id("username");
public static final By CONNECT_BUTTON = By.id("btnConnect");
public static final By DISCONNECT_BUTTON = By.id("btnDisconnect");
public static final By CONNECT_BUTTON_DISABLED = By.xpath("//input[@id='btnConnect'][@disabled]");
public static final By DISCONNECT_BUTTON_DISABLED = By.xpath("//input[@id='btnDisconnect'][@disabled]");
public static final By MESSAGE_INPUT = By.id("messageText");
public static final By CHAT_AREA = By.id("channelDisplay");
public static final By MARTIN_CONNECTED = By.xpath("//div[@id='channelDisplay']/span[contains(text(),'Martin connected.')]");
public static final By MARTIN_LISTED = By.xpath("//div/select[@id='userList']/option[contains(text(),'Martin')]");
public static final By JOZEF_CONNECTED = By.xpath("//div[@id='channelDisplay']/span[contains(text(),'Jozef connected.')]");
public static final By JOZEF_LISTED = By.xpath("//div/select[@id='userList']/option[contains(text(),'Jozef')]");
public static final By JOZEF_DISCONNECTED = By.xpath("//div[@id='channelDisplay']/span[contains(text(),'Jozef disconnected.')]");
public static final By MARTIN_GT = By.xpath("//div[@id='channelDisplay']/span[contains(text(),'Martin>')]");
public static final By HELLO = By.xpath("//div[@id='channelDisplay']/text()[contains(.,'"+ MESSAGE_FROM_MARTIN +"')]");
public static final By JOZEF_GT = By.xpath("//div[@id='channelDisplay']/span[contains(text(),'Jozef>')]");
public static final By GOOD_MORNING = By.xpath("//div[@id='channelDisplay']/text()[contains(.,'" + MESSAGE_FROM_JOZEF + "')]");
protected AjaxWebDriver driver2;
@BeforeMethod
public void setUp()
{
startSecondBrowser();
driver.get(serverURL + contextPath + HOME_PAGE);
driver2.get(serverURL + contextPath + HOME_PAGE);
}
@AfterMethod
public void tearDown()
{
stopSecondBrowser();
}
@Test
public void homePageLoadTest()
{
assertTrue("Unexpected page title.", driver.getTitle().contains(HOME_PAGE_TITLE));
}
@Test(dependsOnMethods={"homePageLoadTest"})
public void connectAndChatTest()
{
/*connect user to chat*/
connect();
/*verify that user is connected and is seen by other users*/
verifyConnecting();
/*exchange several messages*/
chat();
/*disconnect user from chat*/
disconnect();
/*verify that user is disconnected and is not in a list of users anymore*/
verifyDisconnecting();
}
public void connect()
{
driver.findElement(NAME_INPUT).clearAndSendKeys(NAME1, Keys.TAB);
driver.setWaitTime(timeout);
//more reliable than simple click
driver.findElement(CONNECT_BUTTON).clearAndSendKeys(Keys.RETURN);
try
{
Thread.sleep(timeout);
}
catch (InterruptedException e)
{
}
}
public void verifyConnecting()
{
driver.findElement(MARTIN_LISTED);
driver2.setWaitTime(timeout);
driver2.findElement(NAME_INPUT).clearAndSendKeys(NAME2);
driver2.findElement(CONNECT_BUTTON).clickAndWait();
driver2.findElement(JOZEF_LISTED);
driver2.findElement(MARTIN_LISTED);
driver.findElement(JOZEF_CONNECTED);
driver.findElement(JOZEF_LISTED);
}
public void disconnect()
{
driver2.findElement(DISCONNECT_BUTTON).clickAndWait();
}
public void verifyDisconnecting()
{
AjaxWebElement el = null;
try
{
el = driver2.findElement(JOZEF_LISTED);
}
catch (NoSuchElementException e)
{
}
assertNull("Jozef should not be listed in second browser window", el);
driver2.findElement(DISCONNECT_BUTTON_DISABLED);
driver.findElement(JOZEF_DISCONNECTED);
AjaxWebElement el2 = null;
try
{
el2 = driver.findElement(JOZEF_LISTED);
}
catch (NoSuchElementException e)
{
}
assertNull("Jozef should not be listed in first browser window", el2);
driver.findElement(DISCONNECT_BUTTON).clickAndWait();
AjaxWebElement el3 = null;
try
{
el3 = driver.findElement(MARTIN_LISTED);
}
catch (NoSuchElementException e)
{
}
assertNull("Martin should not be listed in first browser window", el3);
driver.findElement(DISCONNECT_BUTTON_DISABLED);
}
public void chat()
{
/*first user is sending a message*/
driver.findElement(MESSAGE_INPUT).clearAndSendKeys(MESSAGE_FROM_MARTIN);
driver.findElement(MESSAGE_INPUT).sendKeys(Keys.RETURN);
try
{
Thread.sleep(timeout);
} catch (InterruptedException e)
{
}
driver.findElement(MARTIN_GT);
driver.findElement(HELLO);
driver2.findElement(MARTIN_GT);
driver2.findElement(HELLO);
driver2.findElement(MESSAGE_INPUT).clearAndSendKeys(MESSAGE_FROM_JOZEF, Keys.RETURN);
try
{
Thread.sleep(timeout);
} catch (InterruptedException e)
{
}
driver2.findElement(JOZEF_GT);
driver2.findElement(GOOD_MORNING);
driver.findElement(JOZEF_GT);
driver.findElement(GOOD_MORNING);
}
public void startSecondBrowser()
{
try
{
this.driver2 = AjaxWebDriverFactory.getDriver(this.browser);
}
catch (IllegalArgumentException e)
{
fail("Unable to instantiate browser of type: " + this.browser + ", available browsers are: " + AjaxWebDriverFactory.availableBrowsers());
}
catch (NullPointerException e)
{
fail("Unable to instantiate browser of type: " + this.browser + ", available browsers are: " + AjaxWebDriverFactory.availableBrowsers());
}
}
public void stopSecondBrowser()
{
driver2.close();
}
}