/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.selenium; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.Point; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.pagefactory.ElementLocatorFactory; import org.testng.ITestContext; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.DataProvider; import cc.kune.core.client.i18n.I18nUtils; import cc.kune.core.client.state.TokenUtils; import cc.kune.core.client.sub.SubtitlesWidget; import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.core.shared.dto.GroupType; import cc.kune.selenium.chat.ChatPageObject; import cc.kune.selenium.general.EntityHeaderPageObject; import cc.kune.selenium.login.LoginPageObject; import cc.kune.selenium.login.RegisterPageObject; import cc.kune.selenium.spaces.GroupSpacePageObject; import cc.kune.selenium.spaces.HomeSpacePageObject; import cc.kune.selenium.spaces.NewGroupPageObject; import cc.kune.selenium.spaces.SitePageObject; import cc.kune.selenium.spaces.UserSpacePageObject; import com.google.inject.Guice; import com.google.inject.Injector; // TODO: Auto-generated Javadoc /** * The Class KuneSeleniumDefaults. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ public class KuneSeleniumDefaults { /** The Constant INJECTOR. */ public static final Injector INJECTOR = Guice.createInjector(new SeleniumModule()); /** The Constant LOG. */ private static final Log LOG = LogFactory.getLog(KuneSeleniumDefaults.class); /** The must close finally. */ public static boolean mustCloseFinally = false; /** The base url. */ private final String baseUrl; /** The chat. */ protected final ChatPageObject chat; /** The entity header. */ protected final EntityHeaderPageObject entityHeader; /** The group space. */ protected GroupSpacePageObject groupSpace; /** The home space. */ protected final HomeSpacePageObject homeSpace; /** The injector. */ private final Injector injector; /** The login. */ protected LoginPageObject login; /** The messages. */ private final ResourceBundle messages; /** The new group. */ protected NewGroupPageObject newGroup; /** The register. */ protected RegisterPageObject register; /** The site. */ protected final SitePageObject site; /** The subtitle popup. */ private WebElement subtitlePopup; /** The user space. */ protected UserSpacePageObject userSpace; /** The webdriver. */ private final WebDriver webdriver; /** * Instantiates a new kune selenium defaults. */ public KuneSeleniumDefaults() { baseUrl = "http://" + SeleniumConf.SITE.getDomain() + "/" + SeleniumConf.SITE.getParams() + "#"; injector = INJECTOR; final ElementLocatorFactory locator = injector.getInstance(ElementLocatorFactory.class); webdriver = injector.getInstance(WebDriver.class); login = injector.getInstance(LoginPageObject.class); register = injector.getInstance(RegisterPageObject.class); entityHeader = injector.getInstance(EntityHeaderPageObject.class); site = injector.getInstance(SitePageObject.class); chat = injector.getInstance(ChatPageObject.class); homeSpace = injector.getInstance(HomeSpacePageObject.class); userSpace = injector.getInstance(UserSpacePageObject.class); groupSpace = injector.getInstance(GroupSpacePageObject.class); newGroup = injector.getInstance(NewGroupPageObject.class); PageFactory.initElements(locator, login); PageFactory.initElements(locator, register); PageFactory.initElements(locator, entityHeader); PageFactory.initElements(locator, site); PageFactory.initElements(locator, chat); PageFactory.initElements(locator, homeSpace); PageFactory.initElements(locator, userSpace); PageFactory.initElements(locator, groupSpace); PageFactory.initElements(locator, newGroup); messages = injector.getInstance(ResourceBundle.class); } /** * Answer on next prompt. * * @param answer * the answer */ public void answerOnNextPrompt(final String answer) { final Alert alert = webdriver.switchTo().alert(); alert.sendKeys(answer); sleep(2000); alert.accept(); } /** * Before methods. * * @param context * the context */ @BeforeMethod public void beforeMethods(final ITestContext context) { } /** * Before suite. */ @BeforeSuite public void beforeSuite() { resize(); home(); setPosition(100, 0); SeleniumUtils.initCursor(webdriver); SeleniumUtils.showCursor(webdriver); SeleniumUtils.showCursor(webdriver, login.getAnonMsg()); sleep(1000); login.getAnonMsg().click(); } /** * Browser back. */ public void browserBack() { webdriver.navigate().back(); } /** * Browser forward. */ public void browserForward() { webdriver.navigate().forward(); } /** * Close. */ public void close() { webdriver.close(); } /** * Close browser. */ @AfterSuite public void closeBrowser() { // We try to only open one window for all our selenium tests if (mustCloseFinally) { close(); } } /** * Creates the correct login. * * @return the object[][] */ @DataProvider(name = "correctlogin") public Object[][] createCorrectLogin() { // The default correct user/password used in tests return new Object[][] { { SeleniumConstants.USER_SHORNAME, SeleniumConstants.USER_PASSWD } }; } /** * Creates the correct register. * * @return the object[][] */ @DataProvider(name = "correctregister") public Object[][] createCorrectRegister() { // The default correct user/password used in tests return new Object[][] { { "jane", "Jane Doe", SeleniumConstants.USER_PASSWD, "jane@example.org" } }; } /** * Creates the incorrect login. * * @return the object[][] */ @DataProvider(name = "incorrectlogin") public Object[][] createIncorrectLogin() { // Some pairs of user/passwd that must fail when try to login return new Object[][] { { "test1@localhost", "test1blabla" }, { "test1", "test1" }, { "test1@localhost", "test" }, { "", "" } }; } /** * Do screenshot. * * @param filename * the filename */ public void doScreenshot(final String filename) { SeleniumUtils.doScreenshot(webdriver, filename); } /** * Gets the. * * @param url * the url */ public void get(final String url) { webdriver.get(url); } /** * Gets the current history token. * * @return the current history token */ public String getCurrentHistoryToken() { final String currentUrl = webdriver.getCurrentUrl(); LOG.info(String.format("Current url: %s", currentUrl)); final String[] splitted = currentUrl.split("#"); return splitted.length > 1 ? splitted[1] : ""; } /** * Gets the page source. * * @return the page source */ public String getPageSource() { return webdriver.getPageSource(); } /** * Goto token. * * @param token * the token */ public void gotoToken(final StateToken token) { get(baseUrl + token); } /** * Goto token. * * @param token * the token */ public void gotoToken(final String token) { get(baseUrl + token); } /** * Home. */ public void home() { assert baseUrl != null; webdriver.get(baseUrl); } /** * New groups. * * @return the object[][] */ @DataProvider(name = "newGroups") public Object[][] newGroups() { return new Object[][] { { "grp1", "吗台湾", "吗台湾 吗台湾 吗台湾 吗台湾", "吗 台湾", GroupType.CLOSED }, { "grp2", "Chomsky Fan Club", "Some chomsky fan club", "chomsky", GroupType.ORGANIZATION }, { "grp3", "روبا", "روبا روبا روبا روبا", "روبا", GroupType.COMMUNITY }, { "grp0", "Ecologist Group", "Melbourne eco feminist group", "eco feminism", GroupType.PROJECT } }; } /** * Open. * * @param url * the url */ public void open(final String url) { webdriver.get(url); } /** * Resize. */ public void resize() { // Some others tested values: // 1024,769 // 840,770 // 806,707 webdriver.manage().window().setPosition(new Point(0, 0)); webdriver.manage().window().setSize(new Dimension(806, 707)); // Before we were using: // final JavascriptExecutor js = (JavascriptExecutor) webdriver; // js.executeScript("window.resizeTo(806,707); window.moveTo(0,0);"); } /** * Send keys but in a slow way (word by word). * * @param element * the element * @param strings * the strings */ public void sendKeys(final WebElement element, final String... strings) { for (final String s : strings) { final String[] splitted = s.split(" "); for (int i = 0; i < splitted.length; i++) { element.sendKeys(splitted[i]); if (i < splitted.length - 1) { element.sendKeys(" "); } } } } /** * Sets the position. * * @param x * the x * @param y * the y */ public void setPosition(final int x, final int y) { webdriver.manage().window().setPosition(new Point(x, y)); } /** * Show cursor. * * @param x * the x * @param y * the y */ public void showCursor(final int x, final int y) { SeleniumUtils.showCursor(webdriver, x, y); } /** * Show msg. * * @param msg * the msg */ public void showMsg(final String msg) { SeleniumUtils.showMsg(webdriver, "", msg); } /** * Show msg. * * @param title * the title * @param msg * the msg */ public void showMsg(final String title, final String msg) { SeleniumUtils.showMsg(webdriver, title, msg); } /** * Show title slide. * * @param title * the title */ public void showTitleSlide(final String title) { showTitleSlide(title, "", getCurrentHistoryToken()); } /** * Show title slide. * * @param title * the title * @param description * the description */ public void showTitleSlide(final String title, final String description) { showTitleSlide(title, description, getCurrentHistoryToken()); } /** * Show title slide. * * @param title * the title * @param description * the description * @param token * the token */ public void showTitleSlide(final String title, final String description, final String token) { gotoToken(TokenUtils.subtitle(title, description, token)); sleep(4000); if (subtitlePopup == null) { subtitlePopup = webdriver.findElement(By.id(SeleniumConstants.GWTDEV + SubtitlesWidget.SUBTITLE_MANAGER_ID)); } subtitlePopup.click(); // SeleniumUtils.moveMouseToAndClick(webdriver, subtitlePopup, 100, 100); } /** * Show tooltip. * * @param element * the element */ public void showTooltip(final WebElement element) { SeleniumUtils.showTooltip(webdriver, element); } /** * Sleep. * * @param milliseconds * the milliseconds */ public void sleep(final int milliseconds) { SeleniumUtils.sleep(milliseconds); } /** * T. * * @param message * the message * @return the string */ public String t(final String message) { final String methodName = I18nUtils.convertMethodName(message); try { return messages.getString(methodName); } catch (final MissingResourceException e) { LOG.info(methodName + " = " + message); return message; } } }