/*
*
* 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.List;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriver.Navigation;
import org.openqa.selenium.WebDriver.Options;
import org.openqa.selenium.WebDriver.TargetLocator;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ByIdOrName;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import com.google.gwt.user.client.ui.UIObject;
import com.google.inject.Inject;
// TODO: Auto-generated Javadoc
/**
* The Class PageObject.
*
* @author vjrj@ourproject.org (Vicente J. Ruiz Jurado)
*/
public abstract class PageObject {
// private static final Log LOG =
// LogFactory.getLog(PageObject.class.getName());
/** The Constant POLL_INTERVALS. */
private static final long[] POLL_INTERVALS = { 10, 20, 30, 40, 50, 50, 50, 50, 100 };
/** The webdriver. */
@Inject
private WebDriver webdriver;
/**
* Clear field.
*
* @param elem
* the elem
*/
protected void clearField(final WebElement elem) {
elem.sendKeys(Keys.chord(Keys.CONTROL, "a"), Keys.DELETE);
}
/**
* Find element.
*
* @param by
* the by
* @return the web element
*/
public WebElement findElement(final By by) {
return webdriver.findElement(by);
}
/**
* Find elements.
*
* @param by
* the by
* @return the list
*/
public List<WebElement> findElements(final By by) {
return webdriver.findElements(by);
}
/**
* Gets the by id.
*
* @param id
* the id
* @return the by id
*/
public WebElement getById(final String id) {
return webdriver.findElement(By.id(UIObject.DEBUG_ID_PREFIX + id));
}
/**
* Gets the current url.
*
* @return the current url
*/
public String getCurrentUrl() {
return webdriver.getCurrentUrl();
}
/**
* Gets the title.
*
* @return the title
*/
public String getTitle() {
return webdriver.getTitle();
}
/**
* Gets the web driver.
*
* @return the web driver
*/
protected WebDriver getWebDriver() {
return webdriver;
}
/**
* Gets the window handle.
*
* @return the window handle
*/
public String getWindowHandle() {
return webdriver.getWindowHandle();
}
/**
* Gets the window handles.
*
* @return the window handles
*/
public Set<String> getWindowHandles() {
return webdriver.getWindowHandles();
}
/**
* Hightlight.
*
* @param element
* the element
*/
public void hightlight(final WebElement element) {
SeleniumUtils.hightlight(element, webdriver);
// final JavascriptExecutor js = (JavascriptExecutor) webdriver;
// final String script = "window.jQuery('#" + element.getAttribute("id") +
// "').addClass('k-outline');"
// + "setTimeout('window.jQuery(\"#" + element.getAttribute("id")
// + "\").removeClass(\"k-outline\")', 700);";
// // LOG.info("High: " + script);
// js.executeScript(script);
}
/**
* Checks if is element present.
*
* @param id
* the id
* @return true, if is element present
*/
public boolean isElementPresent(final String id) {
final Wait<WebDriver> wait = new WebDriverWait(webdriver, 5);
final WebElement element = wait.until(visibilityOfElementLocated(By.id(id)));
return element != null;
}
/**
* Checks if is present.
*
* @param element
* the element
* @return true, if is present
*/
public boolean isPresent(final WebElement element) {
// FIXME: find a better way to do this
try {
getWebDriver().findElement(By.id(element.getAttribute("id")));
return true;
} catch (final NoSuchElementException e) {
return false;
}
}
/**
* Checks if is text present.
*
* @param text
* the text
* @return true, if is text present
*/
public boolean isTextPresent(final String text) {
return webdriver.findElement(By.tagName("body")).getText().contains(text);
}
/**
* Manage.
*
* @return the options
*/
public Options manage() {
return webdriver.manage();
}
/**
* Navigate.
*
* @return the navigation
*/
public Navigation navigate() {
return webdriver.navigate();
}
/**
* Quit.
*/
public void quit() {
webdriver.quit();
}
/**
* 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);
}
/**
* Switch to.
*
* @return the target locator
*/
public TargetLocator switchTo() {
return webdriver.switchTo();
}
/**
* Visibility of element located.
*
* @param locator
* the locator
* @return the expected condition
*/
public ExpectedCondition<WebElement> visibilityOfElementLocated(final By locator) {
return new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(final WebDriver driver) {
final WebElement toReturn = driver.findElement(locator);
if (toReturn.isDisplayed()) {
return toReturn;
}
return null;
}
};
}
/**
* Thanks to:
* http://groups.google.com/group/webdriver/browse_frm/thread/6e705242
* cc6d75ed/f5f8dca438397254?lnk=gst#f5f8dca438397254
*
* @param waitForWhat
* the wait for what
* @param runnable
* the runnable
*/
protected void waitFor(final String waitForWhat, final Runnable runnable) {
int i = 0;
boolean success = false;
final long timeout = System.currentTimeMillis() + 9000;
while (i < POLL_INTERVALS.length && !success) {
try {
runnable.run();
success = true;
} catch (final Throwable e) {
if (++i == POLL_INTERVALS.length) {
if (System.currentTimeMillis() > timeout) {
throw new RuntimeException("Timeout while waiting for " + waitForWhat, e); // NOPMD
// by
// vjrj
// on
// 16/05/11
// 13:05
} else {
--i;
}
}
try {
Thread.sleep(POLL_INTERVALS[i]);
} catch (final InterruptedException e2) {
Thread.currentThread().interrupt();
throw new RuntimeException("Got interrupted while waiting for " + waitForWhat, e2); // NOPMD
// by
// vjrj
// on
// 16/05/11
// 13:08
}
}
}
}
/**
* Wait for.
*
* @param element
* the element
*/
public void waitFor(final WebElement element) {
final String id = element.getAttribute("id");
// LOG.info("WAIT FOR: " + id);
waitFor(id, new Runnable() {
@Override
public void run() {
Assert.assertTrue(element.isDisplayed());
}
});
}
/**
* Wait for.
*
* @param element
* the element
* @param text
* the text
*/
protected void waitFor(final WebElement element, final String text) {
// LOG.info("WAIT FOR: " + text);
waitFor(text, new Runnable() {
@Override
public void run() {
final String elText = element.getText();
// LOG.info("Element text: " + elText);
Assert.assertTrue(elText.contains(text));
}
});
}
/**
* Wait for id.
*
* @param id
* the id
*/
protected void waitForId(final String id) {
// LOG.info("WAIT FOR: " + id);
waitFor(id, new Runnable() {
@Override
public void run() {
Assert.assertTrue(getWebDriver().findElement(new ByIdOrName(id)).isDisplayed());
}
});
}
/**
* Wait for value.
*
* @param element
* the element
* @param text
* the text
*/
protected void waitForValue(final WebElement element, final String text) {
// LOG.info("WAIT FOR: " + text);
waitFor(text, new Runnable() {
@Override
public void run() {
final String elValue = element.getText();
// LOG.info("Element value: " + elValue);
Assert.assertTrue(elValue.contains(text));
}
});
}
}