diff --git a/pom.xml b/pom.xml
index 83eb339..e3768cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,6 +161,20 @@
true
+
+
+
+ maven-jar-plugin
+
+
+ package
+
+ test-jar
+
+
+
+
+
diff --git a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java
index 8f3ece1..e88b1b1 100755
--- a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java
+++ b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QBaseSeleniumTest.java
@@ -18,7 +18,7 @@ import org.openqa.selenium.chrome.ChromeOptions;
*******************************************************************************/
public class QBaseSeleniumTest
{
- private static ChromeOptions chromeOptions;
+ protected static ChromeOptions chromeOptions;
protected WebDriver driver;
protected QSeleniumJavalin qSeleniumJavalin;
@@ -52,15 +52,29 @@ public class QBaseSeleniumTest
**
*******************************************************************************/
@BeforeEach
- void beforeEach()
+ public void beforeEach()
{
driver = new ChromeDriver(chromeOptions);
driver.manage().window().setSize(new Dimension(1700, 1300));
qSeleniumLib = new QSeleniumLib(driver);
- qSeleniumJavalin = new QSeleniumJavalin();
- addJavalinRoutes(qSeleniumJavalin);
- qSeleniumJavalin.start();
+ if(useInternalJavalin())
+ {
+ qSeleniumJavalin = new QSeleniumJavalin();
+ addJavalinRoutes(qSeleniumJavalin);
+ qSeleniumJavalin.start();
+ }
+ }
+
+
+
+ /*******************************************************************************
+ ** control if the test needs to start its own javalin server, or if we're running
+ ** in an environment where an external web server is being used.
+ *******************************************************************************/
+ protected boolean useInternalJavalin()
+ {
+ return (true);
}
diff --git a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QSeleniumLib.java b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QSeleniumLib.java
index 9bbc344..2b28423 100755
--- a/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QSeleniumLib.java
+++ b/src/test/java/com/kingsrook/qqq/materialdashboard/lib/QSeleniumLib.java
@@ -5,6 +5,7 @@ import java.io.File;
import java.time.Duration;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -96,6 +97,17 @@ public class QSeleniumLib
+ /*******************************************************************************
+ ** Getter for BASE_URL
+ **
+ *******************************************************************************/
+ public String getBaseUrl()
+ {
+ return BASE_URL;
+ }
+
+
+
/*******************************************************************************
**
*******************************************************************************/
@@ -265,6 +277,31 @@ public class QSeleniumLib
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public void waitForNumberOfWindowsToBe(int number)
+ {
+ LOG.debug("Waiting for number of windows (tabs) to be [" + number + "]");
+ long start = System.currentTimeMillis();
+
+ do
+ {
+ if(driver.getWindowHandles().size() == number)
+ {
+ LOG.debug("Number of windows (tabs) is [" + number + "]");
+ return;
+ }
+
+ sleepABit();
+ }
+ while(start + (1000 * WAIT_SECONDS) > System.currentTimeMillis());
+
+ fail("Failed waiting for number of windows (tabs) to be [" + number + "] after [" + WAIT_SECONDS + "] seconds.");
+ }
+
+
+
/*******************************************************************************
**
*******************************************************************************/
@@ -293,6 +330,53 @@ public class QSeleniumLib
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public void switchToSecondaryTab()
+ {
+ String originalWindow = driver.getWindowHandle();
+
+ waitForNumberOfWindowsToBe(2);
+
+ Set windowHandles = driver.getWindowHandles();
+ for(String windowHandle : windowHandles)
+ {
+ if(!windowHandle.equals(originalWindow))
+ {
+ driver.switchTo().window(windowHandle);
+ return;
+ }
+ }
+
+ fail("Failed to find a window handle not equal to the original window handle. Original=[" + originalWindow + "]. All=[" + windowHandles + "]");
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public void closeSecondaryTab()
+ {
+ String originalWindow = driver.getWindowHandle();
+ driver.close();
+
+ Set windowHandles = driver.getWindowHandles();
+ for(String windowHandle : windowHandles)
+ {
+ if(!windowHandle.equals(originalWindow))
+ {
+ driver.switchTo().window(windowHandle);
+ return;
+ }
+ }
+
+ fail("Failed to find a window handle not equal to the original window handle. Original=[" + originalWindow + "]. All=[" + windowHandles + "]");
+ }
+
+
+
@FunctionalInterface
public interface Code
{