package com.redheap.selenium; import java.util.logging.Logger; import oracle.adf.view.rich.automation.selenium.ByRich; import oracle.adf.view.rich.automation.selenium.Dialog; import oracle.adf.view.rich.automation.selenium.DialogManager; import oracle.adf.view.rich.automation.selenium.RichWebDrivers; import org.junit.After; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import org.junit.runner.JUnitCore; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.remote.RemoteWebDriver; /** * Example of a Bot Style test where there is no separation between test classes and page object classes. * @see https://code.google.com/p/selenium/wiki/BotStyleTests */ public class BotStyleTest { private static final Logger logger = Logger.getLogger(BotStyleTest.class.getName()); private static final long TIMEOUT_MSECS = 10000; private static final String BASE_URL = "http://localhost:7101/adf-richclient-demo"; private RemoteWebDriver driver; private DialogManager dialogManager; @Before public void setup() { final FirefoxProfile profile = new FirefoxProfile(); profile.setEnableNativeEvents(true); profile.setPreference("app.update.enabled", false); driver = new FirefoxDriver(profile); DialogManager.init(driver, TIMEOUT_MSECS); dialogManager = DialogManager.getInstance(); } @After public void tearDown() { driver.quit(); } @Test public void testWaitForPpr() throws Exception { logger.info("load demo page..."); driver.get(BASE_URL); logger.info("wait for completion..."); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS); logger.info("click search button..."); driver.findElement(By.id("tmplt:gTools:glryFind:doFind")).click(); logger.info("wait for completion..."); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS); } @Test public void testWaitForPprRichWebDrivers() throws Exception { logger.info("load demo page..."); driver.get(BASE_URL); logger.info("wait for completion..."); RichWebDrivers.waitForRichPageToLoad(driver, TIMEOUT_MSECS); logger.info("click search button..."); driver.findElement(By.id("tmplt:gTools:glryFind:doFind")).click(); logger.info("wait for completion..."); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS); } @Test public void testDialogFramework() throws Exception { driver.get(BASE_URL + "/faces/components/button.jspx"); RichWebDrivers.waitForRichPageToLoad(driver, TIMEOUT_MSECS); assertTrue("oracle.adf.view.rich.automation.ENABLED must be true and adf-richclient-automation-11.jar must be on classpath", (Boolean) driver.executeScript("return AdfPage.PAGE.isAutomationEnabled()")); // assert browser and dialog state before we get started assertEquals("initially ADF dialogManager should find zero dialogs", 0, dialogManager.totalNumberOfDialogsOpen()); assertNull("initially ADF dialogManager should report no current dialog", dialogManager.getCurrentDialog()); // click button with useWindow="true" and action="dialog:createNewFile" final WebElement launchDialogButton = driver.findElement(ByRich.locator("rich=dmoTpl:usewindowButton")); launchDialogButton.click(); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS, /*useAutomaticDialogDetection*/true); // verify new dialog is opened and active assertEquals("after launching first dialog, ADF dialogManager should find single dialog", 1, dialogManager.totalNumberOfDialogsOpen()); final Dialog firstDialog = dialogManager.getCurrentDialog(); assertNotNull("after launching first dialog, ADF dialogManager should detect dialog having focus", firstDialog); assertEquals("title of dialog should be 'New File'", "New File", firstDialog.getTitle(driver)); assertTrue("firstDialog starts out being alive", firstDialog.isAlive()); // demonstrate we can also locate new dialog by title and launching component id assertEquals("locating dialog by its title should find it", firstDialog, dialogManager.getDialogBy(driver, DialogManager.SelectDialogBy.TITLE, "New File")); assertEquals("locating dialog by its launching component id should find it", firstDialog, dialogManager.getDialogBy(driver, DialogManager.SelectDialogBy.LAUNCH_SOURCE_ID, "dmoTpl:usewindowButton")); // switch back to main window (but keep popup window open) dialogManager.selectMainWindow(driver); assertEquals("dialog remains running after switching back to main window", 1, dialogManager.totalNumberOfDialogsOpen()); assertNull("dialog no longer reported as current after switching back to main window", dialogManager.getCurrentDialog()); // click button again to open a second popup launchDialogButton.click(); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS, /*useAutomaticDialogDetection*/true); // verify new dialog is opened and active assertEquals("two dialogs after clicking button for second time", 2, dialogManager.totalNumberOfDialogsOpen()); Dialog secondDialog = dialogManager.getCurrentDialog(); assertEquals("second dialog also has 'New File' title", "New File", secondDialog.getTitle(driver)); assertNotEquals("second dialog has different handle than first dialog", firstDialog, secondDialog); // note: dialogManager.getDialogBy results are now uncertain as both dialogs have same title // and launching component // close first dialog (which is not the current dialog). // DialogManager also resets active window to main window when detecting closed dialogs firstDialog.close(driver); // includes RichWebDrivers.waitForServer(..,..,true) assertEquals("one dialog remaining after closing first dialog", 1, dialogManager.totalNumberOfDialogsOpen()); assertEquals("main browser window active after closing first dialog", null, dialogManager.getCurrentDialog()); assertFalse("first dialog handle should be marked dead", firstDialog.isAlive()); // make second dialog current and show we can close current dialog secondDialog.focus(driver); assertEquals("second dialog window active after switching to it", secondDialog, dialogManager.getCurrentDialog()); secondDialog.close(driver); // includes RichWebDrivers.waitForServer(..,..,true) assertEquals("no dialogs open after closing second dialog", 0, dialogManager.totalNumberOfDialogsOpen()); assertNull("main browser window active after closing second dialog", dialogManager.getCurrentDialog()); assertFalse("first dialog handle still marked dead after closing second dialog", firstDialog.isAlive()); assertFalse("second dialog handle marked dead after closing", secondDialog.isAlive()); // click button once more to open new popup, but this time close with save button in popup launchDialogButton.click(); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS, /*useAutomaticDialogDetection*/true); assertEquals("one dialog running for final test", 1, dialogManager.totalNumberOfDialogsOpen()); assertNotNull("dialog active after launching for final test", dialogManager.getCurrentDialog()); driver.findElement(ByRich.locator("rich=saveNewFile")).click(); RichWebDrivers.waitForServer(driver, TIMEOUT_MSECS, /*useAutomaticDialogDetection*/true); assertEquals("no dialogs running after pressing Save button in dialog", 0, dialogManager.totalNumberOfDialogsOpen()); assertNull("main browser window active afer pressing Save button in dialog", dialogManager.getCurrentDialog()); } public static void main(String[] args) { String[] args2 = { BotStyleTest.class.getName() }; JUnitCore.main(args2); } }