/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.wbtest.selenium; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.uberfire.wbtest.client.main.DefaultScreenActivity; import static org.junit.Assert.*; /** * All Selenium-based UberFire tests extend this base class, which provides the basic boilerplate operations of loading * the test app, waiting for it to initialize, and after the tests, checking for uncaught exceptions that happened while * it was running. */ public class AbstractSeleniumTest { static final int WINDOW_HEIGHT = 700; static final int WINDOW_WIDTH = 1000; /** * The WebDriver that tests should use to interact with the browser. When each test method starts, the browser will * be on {@link #baseUrl} and the UberFire app will be fully initialized. */ protected WebDriver driver; /** * Base URL for the test app. Going to this URL will load the GWT host page. Subclasses should not change the value * of this field. */ protected String baseUrl; /** * Tests in subclasses can set this to true to disable the check for uncaught exceptions after the test is finished. */ protected boolean skipUncaughtExceptionCheck; /** * Sets up the selenium driver, loads the default perspective, and waits for its screen to appear. This lets * subclass {@code @Before} methods or the tests themselves navigate directly to their screen or perspective of * interest. */ @Before public final void setUp() throws Exception { driver = new FirefoxDriver(); baseUrl = "http://localhost:8080/index.html"; setNormalTimeout(); driver.manage().window().setSize(new Dimension(AbstractSeleniumTest.WINDOW_WIDTH, AbstractSeleniumTest.WINDOW_HEIGHT)); driver.get(baseUrl); waitForDefaultPerspective(); } /** * Causes the current test to fail if there were any uncaught exceptions thrown while it was running. Automatically * runs after every test, unless the test set {@link #skipUncaughtExceptionCheck} to true. */ @After public final void detectUncaughtExceptions() { try { if (!skipUncaughtExceptionCheck) { WebElement alerterStatus = driver.findElement(By.id("UncaughtExceptionAlerter-statusLabel")); if (!alerterStatus.getText().equals("0 uncaught exceptions")) { WebElement alerterLog = driver.findElement(By.id("UncaughtExceptionAlerter-exceptionLog")); fail("Uncaught exceptions detected:\n" + alerterLog.getAttribute("value") + "\nNote: to get Java line numbers in the stack trace, run like this:" + "\n mvn clean verify -Dgwt.style=PRETTY -Dit.test=" + getClass().getSimpleName()); } } } finally { driver.quit(); } } /** * Sets the WebDriver implicit timeout to a "normal" amount (currently 30 seconds). Tests that need to set the * timeout shorter temporarily can call this method to set it back to normal. * <p> * Also, tests that want a different implicit timeout can override this method (it is used from this base class's * setUp() method). */ protected void setNormalTimeout() { driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } /** * Blocks execution of the test until the {@link DefaultScreenActivity} is in the DOM. This is normally done * automatically in the setup method, but tests that refresh the page (or go back to the default perspective) will * need to call this explicitly. */ protected void waitForDefaultPerspective() { driver.findElement(By.id("gwt-debug-" + DefaultScreenActivity.DEBUG_ID)); } }