/* * 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.seamdiscs.test.selenium; import java.text.MessageFormat; import org.jboss.seam.example.common.test.selenium.SeamSeleniumTest; import org.testng.annotations.BeforeMethod; import com.thoughtworks.selenium.SeleniumException; import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; /** * * @author Ondrej Skutka * */ public abstract class SeleniumSeamDiscsTest extends SeamSeleniumTest { // TODO final public static String LOGIN = "id=loginlink"; public static String LOGOUT = "id=logout"; public static String LOGIN_USERNAME = "id=login:username"; public static String LOGIN_PASSWORD = "id=login:password"; public static String LOGIN_LOGIN = "id=login:loginbutton"; public static String HOME_URL = "/home.seam"; // public static String SECURITY = "id=security"; // public static String MANAGE_DISCS = "id=manageDiscs"; public static String CREATE_ARTIST_BUTTON = "id=addArtist"; public static String CREATE_BAND_BUTTON = "id=addBand"; public static String ARTIST_FILTER = "//form[1]//input[@type='text']"; public static String ARTIST_NAME = "id=artist:name"; public static String ARTIST_CREATE_DISC_BUTTON = "id=artist:addDisc"; public static String ARTIST_DESCRIPTION = "id=artist:description"; public static String ARTIST_PERSIST = "id=artist:persist"; public static String ARTIST_UPDATE = "id=artist:update"; public static String ARTIST_CANCEL = "id=artist:cancel"; public static String ARTIST_ADD_BAND_MEMBER = "id=artist:addBandMember"; public static String ARTIST_NTH_BAND_MEMBER = "xpath=id(\"artist\")//tr[1]//tr[3]/td[2]//ul/li[{0}]//input[@type=\"text\"]"; public static String ARTIST_LAST_BAND_MEMBER = MessageFormat.format(ARTIST_NTH_BAND_MEMBER, "last()"); public static String ARTIST_NTH_DISC = "xpath=id(\"artist:discs\")/table/tbody/tr/td/table/tbody/tr[{0}]"; public static String ARTIST_NTH_DISC_SHOW_DETAILS = ARTIST_NTH_DISC + "/td[1]/div/a[2]"; public static String ARTIST_NTH_DISC_NAME = ARTIST_NTH_DISC + "/td[2]/input"; public static String ARTIST_NTH_DISC_YEAR = ARTIST_NTH_DISC + "/td[3]//input"; public static String ARTIST_NTH_DISC_DETAIL = ARTIST_NTH_DISC + "/td"; public static String ARTISTS_FIRST_ARTIST_LINK = "xpath=id(\"artists\")//table/tbody/tr/td/table/tbody/tr[2]/td[2]/a"; public static String ARTISTS_NEXT_PAGE_LINK = "xpath=id(\"artists\")//td[1]//td[2]//td[5]/a"; public static String ARTIST_TABLE_ROW_BY_NAME = "xpath=id(\"artists\")//tr[normalize-space(td/a/text())=\"{0}\"]"; // these locators can only be used catenated with ARTIST_TABLE_ROW_BY_NAME public static String ARTIST_TABLE_ROW_LINK = ARTIST_TABLE_ROW_BY_NAME + "/td[2]/a"; public static String MANAGE_ARTISTS = "id=manageArtists"; public static String CREATE_DISC_BUTTON = "id=addDisc"; public static String DISC_DETAIL_TITLE = "xpath=id(\"disc\")//tr//tr[2]/td[2]/input"; public static String DISC_DETAIL_RELEASE_DATE = "xpath=id(\"disc\")//tr//tr[3]/td[2]//input"; public static String DISC_DETAIL_ARTIST = "xpath=id(\"disc\")//tr//tr[4]//select"; public static String DISC_DETAIL_DESCRIPTION = "id=description"; public static String DISC_DETAIL_UPDATE = "id=update"; public static String DISC_DETAIL_PERSIST = "id=persist"; public static String DISC_DETAIL_REMOVE = "id=remove"; public static String DISC_DETAIL_CANCEL = "id=cancel"; public static String DISCS_NEXT_PAGE_LINK = "xpath=id(\"discs\")//td[1]//td[2]//td[5]/a"; public static String DISC_TABLE_ROW_BY_NAME = "xpath=id(\"discs\")//tr[normalize-space(td/a/text())=\"{0}\"]"; // these locators can only be used catenated with DISC_TABLE_ROW_BY_NAME public static String DISC_TABLE_ROW_LINK = DISC_TABLE_ROW_BY_NAME + "/td[2]/a"; public static String EMPTY_DISC_DESCRIPTION = "None known"; public static String DEFAULT_USERNAME = "administrator"; public static String DEFAULT_PASSWORD = "administrator"; @Override @BeforeMethod public void setUp() { super.setUp(); browser.open(CONTEXT_PATH + HOME_URL); login(); } public void login() { login(DEFAULT_USERNAME, DEFAULT_PASSWORD); } public void login(String username, String password) { if (isLoggedIn()) { fail("User already logged in."); } browser.clickAndWait(LOGIN); browser.type(LOGIN_USERNAME, username); browser.type(LOGIN_PASSWORD, password); browser.clickAndWait(LOGIN_LOGIN); } protected boolean isLoggedIn() { return !browser.isElementPresent(LOGIN) && browser.isElementPresent(LOGOUT); } /** * Checks whether specified disc contains expected data. */ protected void checkDisc(int tableRow, String expectedDiscTitle, String expectedReleaseDate, String expectedDescription) { tableRow++; // first row is header String actualDiscTitle = browser.getAttribute(MessageFormat.format(ARTIST_NTH_DISC_NAME, tableRow) + "@value"); assertTrue("This is not expected (" + expectedDiscTitle + ") album (" + actualDiscTitle + ")!", actualDiscTitle.equals(expectedDiscTitle)); String actualReleaseDate = ""; if (browser.isElementPresent(MessageFormat.format(ARTIST_NTH_DISC_YEAR, tableRow))) { try { actualReleaseDate = browser.getAttribute(MessageFormat.format(ARTIST_NTH_DISC_YEAR, tableRow) + "@value"); } catch (SeleniumException ex) { // intentianally left blank } assertTrue("This is not expected (" + expectedReleaseDate + ") release date (" + actualReleaseDate + ")!", actualReleaseDate.equals(expectedReleaseDate)); } browser.clickAndWait(MessageFormat.format(ARTIST_NTH_DISC_SHOW_DETAILS, tableRow)); String actualDescription = browser.getText(MessageFormat.format(ARTIST_NTH_DISC_DETAIL, tableRow + 1)); assertTrue("This is not expected (" + expectedDescription + ") description (" + actualDescription + ")!", actualDescription.equals(expectedDescription)); browser.clickAndWait(MessageFormat.format(ARTIST_NTH_DISC_SHOW_DETAILS, tableRow)); } /** * Checks whether specified disc contains expected data. */ protected void checkDiscDetail(String expectedDiscTitle, String expectedReleaseDate, String expectedDescription, String expectedArtist) { String actualDiscTitle = browser.getAttribute(DISC_DETAIL_TITLE + "@value"); assertTrue("This is not expected (" + expectedDiscTitle + ") album: (" + actualDiscTitle + ")!", actualDiscTitle.equals(expectedDiscTitle)); String actualReleaseDate = ""; if (browser.isElementPresent(DISC_DETAIL_RELEASE_DATE + "/attribute::value")) { actualReleaseDate = browser.getAttribute(DISC_DETAIL_RELEASE_DATE + "@value"); assertTrue("This is not expected (" + expectedReleaseDate + ") release date: (" + actualReleaseDate + ")!", actualReleaseDate.equals(expectedReleaseDate)); } String actualDescription = browser.getText(DISC_DETAIL_DESCRIPTION); assertTrue("This is not expected (" + expectedDescription + ") description: (" + actualDescription + ")!", actualDescription.equals(expectedDescription)); String actualArtist = browser.getSelectedLabel(DISC_DETAIL_ARTIST); assertTrue("This is not expected (" + expectedArtist + ") artist: (" + actualArtist + ")!", actualArtist.equals(expectedArtist)); } /** * Creates new disc. * Expected to be on artist's edit page. * */ protected void createDisc(String title, String year) { browser.clickAndWait(ARTIST_CREATE_DISC_BUTTON); browser.type(MessageFormat.format(ARTIST_NTH_DISC_NAME, "last()"), title); browser.type(MessageFormat.format(ARTIST_NTH_DISC_YEAR, "last()"), year); } /** * Finds the specified artist in paginated artists page and clicks it. * Expected to be on artists page. * */ protected void findAndClickArtist(String artistName) { // find the artist's page (it's paginated) and click it String expectedArtist = MessageFormat.format(ARTIST_TABLE_ROW_BY_NAME, artistName); while (!browser.isElementPresent(expectedArtist)) { // click through pages assertTrue("Artist " + artistName + " not found.", browser.isElementPresent(ARTISTS_NEXT_PAGE_LINK)); browser.click(ARTISTS_NEXT_PAGE_LINK); // ajax sleep(3000); } browser.clickAndWait(MessageFormat.format(ARTIST_TABLE_ROW_LINK, artistName)); // click artist link } /** * Finds the specified disc in paginated discs page and clicks it. * Expected to be on discs page. * */ protected void findAndClickDisc(String discName) { // find the disc page (it's paginated) and click it String expectedDisc = MessageFormat.format(DISC_TABLE_ROW_BY_NAME, discName); while (!browser.isElementPresent(expectedDisc)) { // click through pages assertTrue("Disc " + discName + " not found.", browser.isElementPresent(DISCS_NEXT_PAGE_LINK)); browser.click(DISCS_NEXT_PAGE_LINK); // ajax sleep(3000); } browser.clickAndWait(MessageFormat.format(DISC_TABLE_ROW_LINK, discName)); // click disc link } /** * @param in milliseconds * */ protected void sleep(int milliseconds) { try { Thread.sleep(milliseconds); // TODO how to do this properly? } catch (InterruptedException e) { throw new RuntimeException(e); } } protected void addBandMember(String artistName) { browser.clickAndWait(ARTIST_ADD_BAND_MEMBER); browser.type(ARTIST_LAST_BAND_MEMBER, artistName); } /** * Checks whether specified disc contains expected data. */ protected void checkBandMember(int tableRow, String expectedBandMember) { String actualMemberName = browser.getAttribute(MessageFormat.format(ARTIST_NTH_BAND_MEMBER, tableRow) + "@value"); assertTrue("This is not expected (" + expectedBandMember + ") album (" + actualMemberName + ")!", actualMemberName.equals(expectedBandMember)); } }