From c9b6de9fcdeb78892803b524547dedb69207b7a9 Mon Sep 17 00:00:00 2001 From: Ramesh Babu Date: Wed, 22 Jun 2022 10:30:53 +0530 Subject: [PATCH 1/5] [Core] TestLifecycle --- .../selcukes/core/driver/DriverManager.java | 19 +++++----- .../selcukes/core/listener/TestLifecycle.java | 36 +++++++++++++++++++ ...stener.java => TestLifecyclePerClass.java} | 8 ++--- ...tener.java => TestLifecyclePerMethod.java} | 2 +- .../core/tests/web/ClassicGridTest.java | 4 +-- .../selcukes/core/tests/web/PrintTest.java | 4 +-- .../selcukes/core/tests/web/WebTest.java | 4 +-- .../selcukes/core/tests/win/NotepadTest.java | 17 ++------- 8 files changed, 60 insertions(+), 34 deletions(-) create mode 100644 selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java rename selcukes-core/src/main/java/io/github/selcukes/core/listener/{ClassResourceListener.java => TestLifecyclePerClass.java} (78%) rename selcukes-core/src/main/java/io/github/selcukes/core/listener/{MethodResourceListener.java => TestLifecyclePerMethod.java} (94%) diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java index 0d84d157c..c5c2183d2 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java @@ -18,6 +18,7 @@ import io.appium.java_client.windows.WindowsDriver; import io.github.selcukes.commons.exception.DriverSetupException; +import io.github.selcukes.commons.helper.Preconditions; import io.github.selcukes.core.enums.DeviceType; import io.github.selcukes.core.listener.EventCapture; import lombok.CustomLog; @@ -28,16 +29,16 @@ import org.openqa.selenium.support.events.WebDriverListener; import java.util.Arrays; -import java.util.HashSet; +import java.util.Map; import java.util.Objects; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; @CustomLog @UtilityClass public class DriverManager { private static final ThreadLocal DRIVER_THREAD = new InheritableThreadLocal<>(); - private static final Set STORED_DRIVER = new HashSet<>(); + private static final Map STORED_DRIVER = new ConcurrentHashMap<>(); public static synchronized D createDriver(DeviceType deviceType, Capabilities... capabilities) { Arrays.stream(capabilities).findAny().ifPresent(AppiumOptions::setUserOptions); @@ -74,15 +75,15 @@ public static D getDriver() { return (D) DRIVER_THREAD.get(); } - public static void setDriver(D driveThread) { - - DRIVER_THREAD.set(driveThread); + public static void setDriver(D driver) { + DRIVER_THREAD.set(driver); + STORED_DRIVER.putIfAbsent(driver.hashCode(), driver); } public static synchronized void removeDriver() { try { if (getDriver() != null) { - STORED_DRIVER.remove(getDriver()); + STORED_DRIVER.remove(getDriver().hashCode()); getDriver().quit(); } } finally { @@ -92,11 +93,11 @@ public static synchronized void removeDriver() { public static synchronized void removeAllDrivers() { logger.debug(() -> String.format("Closing [%d] stored drivers..", STORED_DRIVER.size())); - STORED_DRIVER.stream().filter(Objects::nonNull).forEach(d -> { + STORED_DRIVER.values().stream().filter(Objects::nonNull).forEach(d -> { try { ((WebDriver) d).quit(); } finally { - STORED_DRIVER.remove(d); + STORED_DRIVER.remove(d.hashCode()); } }); DRIVER_THREAD.remove(); diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java new file mode 100644 index 000000000..377de3cef --- /dev/null +++ b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) Ramesh Babu Prudhvi. + * + * 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 io.github.selcukes.core.listener; + +import io.github.selcukes.core.driver.DriverManager; +import io.github.selcukes.core.driver.GridRunner; +import lombok.CustomLog; +import org.testng.ISuite; +import org.testng.ISuiteListener; + +@CustomLog +public class TestLifecycle implements ISuiteListener { + public void onStart(ISuite suite) { + logger.debug(() -> "Test Suite Execution started..."); + } + + public void onFinish(ISuite suite) { + DriverManager.removeAllDrivers(); + GridRunner.stopAppium(); + logger.debug(() -> "Test Suite Execution finished..."); + } +} diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/listener/ClassResourceListener.java b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerClass.java similarity index 78% rename from selcukes-core/src/main/java/io/github/selcukes/core/listener/ClassResourceListener.java rename to selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerClass.java index 895700b47..c34fb22fe 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/listener/ClassResourceListener.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerClass.java @@ -23,16 +23,16 @@ import org.testng.ITestClass; @CustomLog -public class ClassResourceListener implements IClassListener { +public class TestLifecyclePerClass extends TestLifecycle implements IClassListener { @Override public void onBeforeClass(ITestClass testClass) { - logger.info(() -> "Before Class of " + testClass.getName()); + logger.debug(() -> "Before Class of " + testClass.getClass().getSimpleName()); } @Override public void onAfterClass(ITestClass testClass) { - logger.info(() -> "After Class of " + testClass.getName()); - logger.info(() -> "Cleanup Resource"); + logger.debug(() -> "After Class of " + testClass.getClass().getSimpleName()); + logger.debug(() -> "Cleanup Resource"); DriverManager.removeDriver(); ConfigFactory.cleanupConfig(); } diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/listener/MethodResourceListener.java b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerMethod.java similarity index 94% rename from selcukes-core/src/main/java/io/github/selcukes/core/listener/MethodResourceListener.java rename to selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerMethod.java index a3ba3d429..706e8f6aa 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/listener/MethodResourceListener.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecyclePerMethod.java @@ -24,7 +24,7 @@ import org.testng.ITestResult; @CustomLog -public class MethodResourceListener implements IInvokedMethodListener { +public class TestLifecyclePerMethod extends TestLifecycle implements IInvokedMethodListener { @Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { logger.debug(() -> "Before invocation of " + method.getTestMethod().getMethodName()); diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java index e63458bb7..6012b65b1 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/ClassicGridTest.java @@ -18,7 +18,7 @@ import io.github.selcukes.commons.config.ConfigFactory; import io.github.selcukes.core.driver.GridRunner; -import io.github.selcukes.core.listener.MethodResourceListener; +import io.github.selcukes.core.listener.TestLifecyclePerMethod; import io.github.selcukes.core.page.Pages; import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; @@ -28,7 +28,7 @@ import org.testng.annotations.Test; @CustomLog -@Listeners(MethodResourceListener.class) +@Listeners(TestLifecyclePerMethod.class) public class ClassicGridTest { @BeforeSuite public static void beforeSuite() { diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/PrintTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/PrintTest.java index 54618653c..d9d70e90b 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/PrintTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/PrintTest.java @@ -16,14 +16,14 @@ package io.github.selcukes.core.tests.web; -import io.github.selcukes.core.listener.MethodResourceListener; +import io.github.selcukes.core.listener.TestLifecyclePerMethod; import io.github.selcukes.core.page.Pages; import io.github.selcukes.core.page.WebPage; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; -@Listeners(MethodResourceListener.class) +@Listeners(TestLifecyclePerMethod.class) public class PrintTest { WebPage page; diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebTest.java index aee08fc99..20f3d3845 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/web/WebTest.java @@ -16,14 +16,14 @@ package io.github.selcukes.core.tests.web; -import io.github.selcukes.core.listener.MethodResourceListener; +import io.github.selcukes.core.listener.TestLifecyclePerMethod; import io.github.selcukes.core.page.Pages; import io.github.selcukes.core.page.WebPage; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; -@Listeners(MethodResourceListener.class) +@Listeners(TestLifecyclePerMethod.class) public class WebTest { WebPage page; diff --git a/selcukes-core/src/test/java/io/github/selcukes/core/tests/win/NotepadTest.java b/selcukes-core/src/test/java/io/github/selcukes/core/tests/win/NotepadTest.java index ad5b5d104..14f26b453 100644 --- a/selcukes-core/src/test/java/io/github/selcukes/core/tests/win/NotepadTest.java +++ b/selcukes-core/src/test/java/io/github/selcukes/core/tests/win/NotepadTest.java @@ -16,23 +16,17 @@ package io.github.selcukes.core.tests.win; -import io.github.selcukes.core.driver.DriverManager; -import io.github.selcukes.core.driver.GridRunner; +import io.github.selcukes.core.listener.TestLifecyclePerClass; import io.github.selcukes.core.page.Pages; import io.github.selcukes.core.page.WinPage; import org.openqa.selenium.By; import org.openqa.selenium.Keys; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; +@Listeners(TestLifecyclePerClass.class) public class NotepadTest { - @BeforeMethod - public void beforeTest() { - GridRunner.startAppium(); - } - @Test(enabled = false) public void notepadTest() { @@ -47,9 +41,4 @@ public void notepadTest() { .click(By.name("Don't Save")); } - @AfterMethod - public void afterTest() { - DriverManager.removeDriver(); - GridRunner.stopAppium(); - } } From 180445808ad7b8e4e7f136e5bea6316ddd366160 Mon Sep 17 00:00:00 2001 From: Ramesh Babu Date: Wed, 22 Jun 2022 11:54:11 +0530 Subject: [PATCH 2/5] [Core] Removed unused imports --- .../main/java/io/github/selcukes/core/driver/DriverManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java index c5c2183d2..54d44bb07 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DriverManager.java @@ -18,7 +18,6 @@ import io.appium.java_client.windows.WindowsDriver; import io.github.selcukes.commons.exception.DriverSetupException; -import io.github.selcukes.commons.helper.Preconditions; import io.github.selcukes.core.enums.DeviceType; import io.github.selcukes.core.listener.EventCapture; import lombok.CustomLog; From 268842e4f64bc6b6d97d36507255aff008349cfc Mon Sep 17 00:00:00 2001 From: Ramesh Babu Date: Wed, 22 Jun 2022 12:38:48 +0530 Subject: [PATCH 3/5] [Core] Added Override annotations --- .../java/io/github/selcukes/core/listener/TestLifecycle.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java index 377de3cef..e5fa49c81 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/listener/TestLifecycle.java @@ -24,10 +24,12 @@ @CustomLog public class TestLifecycle implements ISuiteListener { + @Override public void onStart(ISuite suite) { logger.debug(() -> "Test Suite Execution started..."); } + @Override public void onFinish(ISuite suite) { DriverManager.removeAllDrivers(); GridRunner.stopAppium(); From 3dc13f5bed9c41e79e34a77ceb704e3e797a7895 Mon Sep 17 00:00:00 2001 From: Ramesh Babu Date: Thu, 23 Jun 2022 08:25:37 +0530 Subject: [PATCH 4/5] [Core] Handle exceptions on the fly --- .../selcukes/core/driver/AppiumManager.java | 55 +++++++------------ .../selcukes/core/driver/DesktopManager.java | 18 ++---- .../selcukes/core/driver/WebManager.java | 38 +++++-------- webdriver-binaries/pom.xml | 8 ++- 4 files changed, 49 insertions(+), 70 deletions(-) diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java index ae8770e57..604537ec8 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/AppiumManager.java @@ -18,7 +18,6 @@ import io.appium.java_client.android.AndroidDriver; import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.commons.exception.DriverSetupException; import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.SneakyThrows; @@ -57,47 +56,35 @@ public URL getServiceUrl() { } public WebDriver createBrowserDriver(String browser) { - WebDriver driver; - try { - logger.debug(() -> "Initiating New Mobile Browser Session..."); - Capabilities capabilities = AppiumOptions.getUserOptions(); - if (capabilities == null) { - String platform = ConfigFactory.getConfig().getMobile().getPlatform(); - capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), isCloudAppium(), platform); - if (isCloudAppium()) { - capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); - } - + logger.debug(() -> "Initiating New Mobile Browser Session..."); + Capabilities capabilities = AppiumOptions.getUserOptions(); + if (capabilities == null) { + String platform = ConfigFactory.getConfig().getMobile().getPlatform(); + capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), isCloudAppium(), platform); + if (isCloudAppium()) { + capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); } - driver = new RemoteWebDriver(getServiceUrl(), capabilities); - } catch (Exception e) { - throw new DriverSetupException("Driver was not setup properly.", e); + } - return driver; + return new RemoteWebDriver(getServiceUrl(), capabilities); } public WebDriver createAppDriver() { - WebDriver driver; - try { - logger.debug(() -> "Initiating New Mobile App Session..."); - Capabilities capabilities = AppiumOptions.getUserOptions(); - if (capabilities == null) { - if (isCloudAppium()) { - capabilities = CloudOptions.getBrowserStackOptions(true); - } else { - Path appPath = Paths.get(ConfigFactory.getConfig() - .getMobile().getApp()); - String app = appPath.toAbsolutePath().toString(); - logger.info(() -> "Using APP: " + app); - capabilities = AppiumOptions.getAndroidOptions(app); - } + logger.debug(() -> "Initiating New Mobile App Session..."); + Capabilities capabilities = AppiumOptions.getUserOptions(); + if (capabilities == null) { + if (isCloudAppium()) { + capabilities = CloudOptions.getBrowserStackOptions(true); + } else { + Path appPath = Paths.get(ConfigFactory.getConfig() + .getMobile().getApp()); + String app = appPath.toAbsolutePath().toString(); + logger.info(() -> "Using APP: " + app); + capabilities = AppiumOptions.getAndroidOptions(app); } - driver = new AndroidDriver(getServiceUrl(), capabilities); - } catch (Exception e) { - throw new DriverSetupException("Driver was not setup properly.", e); } - return driver; + return new AndroidDriver(getServiceUrl(), capabilities); } } diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DesktopManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DesktopManager.java index e0e3e36a9..3f9886e9d 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/DesktopManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/DesktopManager.java @@ -18,7 +18,6 @@ import io.appium.java_client.windows.WindowsDriver; import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.commons.exception.DriverSetupException; import lombok.CustomLog; import lombok.SneakyThrows; import org.openqa.selenium.WebDriver; @@ -31,17 +30,12 @@ public class DesktopManager extends AppiumManager { @Override public synchronized WebDriver createDriver() { - WebDriver windowsDriver; - try { - logger.debug(() -> "Initiating New Desktop Session..."); - String app = ConfigFactory.getConfig().getWindows().getApp(); - URL serviceUrl = Objects.requireNonNull(getServiceUrl()); - AppiumOptions.setServiceUrl(serviceUrl); - windowsDriver = new WindowsDriver(serviceUrl, AppiumOptions.getWinAppOptions(app)); - } catch (Exception e) { - throw new DriverSetupException("Driver was not setup properly.", e); - } - return windowsDriver; + + logger.debug(() -> "Initiating New Desktop Session..."); + String app = ConfigFactory.getConfig().getWindows().getApp(); + URL serviceUrl = Objects.requireNonNull(getServiceUrl()); + AppiumOptions.setServiceUrl(serviceUrl); + return new WindowsDriver(serviceUrl, AppiumOptions.getWinAppOptions(app)); } @SneakyThrows diff --git a/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java b/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java index ef0874032..e12db697f 100644 --- a/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java +++ b/selcukes-core/src/main/java/io/github/selcukes/core/driver/WebManager.java @@ -17,7 +17,6 @@ package io.github.selcukes.core.driver; import io.github.selcukes.commons.config.ConfigFactory; -import io.github.selcukes.commons.exception.DriverSetupException; import io.github.selcukes.wdb.enums.DriverType; import lombok.CustomLog; import lombok.SneakyThrows; @@ -38,31 +37,24 @@ public class WebManager implements RemoteManager { public synchronized WebDriver createDriver() { String browser = ConfigFactory.getConfig().getWeb().getBrowser().toUpperCase(); - WebDriver driver; - try { - logger.debug(() -> "Initiating New Browser Session..."); - Capabilities capabilities = AppiumOptions.getUserOptions(); - if (capabilities == null) { - capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), - !(isLocalBrowser() || isCloudBrowser())); - if (isCloudBrowser()) { - capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); - } + logger.debug(() -> "Initiating New Browser Session..."); + Capabilities capabilities = AppiumOptions.getUserOptions(); + if (capabilities == null) { + capabilities = BrowserOptions.getBrowserOptions(DriverType.valueOf(browser), + !(isLocalBrowser() || isCloudBrowser())); + if (isCloudBrowser()) { + capabilities = capabilities.merge(CloudOptions.getBrowserStackOptions(false)); } - RemoteWebDriverBuilder driverBuilder = RemoteWebDriver.builder().oneOf(capabilities); - if (!isLocalBrowser()) { - logger.info(() -> "Starting Remote WebDriver session..."); - driverBuilder.address(getServiceUrl()); - } else { - logger.info(() -> "Starting Local WebDriver session..."); - } - - driver = driverBuilder.build(); - } catch (Exception e) { - throw new DriverSetupException("Driver was not setup properly.", e); + } + RemoteWebDriverBuilder driverBuilder = RemoteWebDriver.builder().oneOf(capabilities); + if (!isLocalBrowser()) { + logger.info(() -> "Starting Remote WebDriver session..."); + driverBuilder.address(getServiceUrl()); + } else { + logger.info(() -> "Starting Local WebDriver session..."); } - return driver; + return driverBuilder.build(); } @SneakyThrows diff --git a/webdriver-binaries/pom.xml b/webdriver-binaries/pom.xml index df4aaba49..c63ffdedf 100644 --- a/webdriver-binaries/pom.xml +++ b/webdriver-binaries/pom.xml @@ -35,6 +35,12 @@ testng test - + + org.projectlombok + lombok + ${lombok.version} + provided + + From 9460809c1a672d42bb373025d191f1972b79ef1a Mon Sep 17 00:00:00 2001 From: Ramesh Babu Date: Thu, 23 Jun 2022 08:26:49 +0530 Subject: [PATCH 5/5] [Core] Revert POM change --- webdriver-binaries/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/webdriver-binaries/pom.xml b/webdriver-binaries/pom.xml index c63ffdedf..f3e82ea7f 100644 --- a/webdriver-binaries/pom.xml +++ b/webdriver-binaries/pom.xml @@ -36,11 +36,5 @@ test - - org.projectlombok - lombok - ${lombok.version} - provided -