diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 813a1de..4bd1c6e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: os: [macos-latest, windows-latest, ubuntu-latest] - java: ["8", "11", "17"] + java: ["17", "21", "23"] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/ci_integration.yml b/.github/workflows/ci_integration.yml index 0ed6f42..6b6da33 100644 --- a/.github/workflows/ci_integration.yml +++ b/.github/workflows/ci_integration.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v2 with: - java-version: 11 + java-version: 17 distribution: "zulu" - name: Remove Chrome run: sudo apt purge google-chrome-stable @@ -28,5 +28,6 @@ jobs: run: sudo apt purge chromium-browser - name: Install a new Chromium run: sudo apt install -y chromium-browser + - uses: nanasess/setup-chromedriver@v2 - name: Integration browser test with Maven run: mvn -Dtest=TestBrowser test diff --git a/pom.xml b/pom.xml index 71fdb21..fe3ecda 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.testdevlab TestUI - 2.0.2 + 3.0.0 @@ -25,10 +25,15 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.11.0 - 1.8 - 1.8 + + + org.projectlombok + lombok + 1.18.28 + + @@ -135,7 +140,7 @@ org.seleniumhq.selenium selenium-java - 4.11.0 + 4.28.0 io.appium @@ -154,7 +159,7 @@ selenium-support - 8.5.0 + 9.3.0 net.lightbody.bmp @@ -169,12 +174,17 @@ com.codeborne selenide - 6.17.2 + 7.7.0 + + + com.codeborne + selenide-proxy + 7.7.0 io.github.bonigarcia webdrivermanager - 5.5.2 + 5.9.2 org.slf4j @@ -217,8 +227,8 @@ org.projectlombok lombok - 1.18.2 - test + 1.18.28 + provided org.json diff --git a/src/main/java/testUI/AndroidUtils/AndroidCapabilities.java b/src/main/java/testUI/AndroidUtils/AndroidCapabilities.java index 92ebd74..9b763b8 100644 --- a/src/main/java/testUI/AndroidUtils/AndroidCapabilities.java +++ b/src/main/java/testUI/AndroidUtils/AndroidCapabilities.java @@ -1,7 +1,5 @@ package testUI.AndroidUtils; -import io.appium.java_client.remote.AndroidMobileCapabilityType; -import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.Platform; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; @@ -23,19 +21,19 @@ public static DesiredCapabilities setAppAndroidCapabilities(TestUIConfiguration DesiredCapabilities cap = setChromeDriverCap(configuration); if (getDesiredCapabilities() == null) { cap.merge(setDeviceCapability(configuration)); - cap.setCapability("appium:" + AndroidMobileCapabilityType.APP_WAIT_DURATION, + cap.setCapability("appium:appWaitDuration", Configuration.launchAppTimeout); if (Configuration.automationName.isEmpty()) { - cap.setCapability("appium:" + MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2"); + cap.setCapability("appium:automationName", "UiAutomator2"); } else { - cap.setCapability("appium:" + MobileCapabilityType.AUTOMATION_NAME, + cap.setCapability("appium:automationName", Configuration.automationName); } cap.setCapability("appium:platformName", Platform.ANDROID); if (!Configuration.appActivity.isEmpty() && !Configuration.appPackage.isEmpty()) { - cap.setCapability("appium:" + AndroidMobileCapabilityType.APP_ACTIVITY, + cap.setCapability("appium:appActivity", Configuration.appActivity); - cap.setCapability("appium:" + AndroidMobileCapabilityType.APP_PACKAGE, + cap.setCapability("appium:appPackage", Configuration.appPackage); } if (!Configuration.androidAppPath.isEmpty()) { @@ -69,16 +67,16 @@ public static DesiredCapabilities setAndroidBrowserCapabilities( if (getDesiredCapabilities() == null) { cap.merge(setDeviceCapability(configuration)); if (Configuration.automationName.isEmpty()) { - cap.setCapability("appium:" + MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2"); + cap.setCapability("appium:automationName", "UiAutomator2"); } else { - cap.setCapability("appium:" + MobileCapabilityType.AUTOMATION_NAME, + cap.setCapability("appium:automationName", Configuration.automationName); } cap.merge(setPortCapabilities(configuration)); - cap.setCapability("appium:" + MobileCapabilityType.NO_RESET, true); - cap.setCapability("appium:" + MobileCapabilityType.PLATFORM_NAME, Platform.ANDROID); - cap.setCapability("appium:" + MobileCapabilityType.BROWSER_NAME, "chrome"); - cap.setCapability("appium:" + AndroidMobileCapabilityType.NATIVE_WEB_SCREENSHOT, true); + cap.setCapability("appium:noReset", true); + cap.setCapability("appium:platformName", Platform.ANDROID); + cap.setCapability("appium:browserName", "chrome"); + cap.setCapability("appium:nativeWebScreenshot", true); if (!Configuration.useW3C) { ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.setExperimentalOption("w3c", false); @@ -133,11 +131,11 @@ private static DesiredCapabilities setDeviceCapability(TestUIConfiguration confi if (configuration.getEmulatorName().isEmpty()) { String udid = configuration.getUDID().isEmpty() ? getDevice() : configuration.getUDID(); - cap.setCapability("appium:" + MobileCapabilityType.UDID, udid); - cap.setCapability("appium:" + MobileCapabilityType.DEVICE_NAME, udid); + cap.setCapability("appium:udid", udid); + cap.setCapability("appium:deviceName", udid); } else { - cap.setCapability("appium:" + AndroidMobileCapabilityType.AVD, configuration.getEmulatorName()); - cap.setCapability("appium:" + MobileCapabilityType.DEVICE_NAME, configuration.getEmulatorName()); + cap.setCapability("appium:avd", configuration.getEmulatorName()); + cap.setCapability("appium:deviceName", configuration.getEmulatorName()); } return cap; @@ -148,14 +146,14 @@ private static DesiredCapabilities setPortCapabilities(TestUIConfiguration confi if (configuration.getAppiumUrl().isEmpty()) { int systemPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 10; int chromeDriverPort = Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) + 15; - cap.setCapability("appium:" + "chromedriverPort", chromeDriverPort); - cap.setCapability("appium:" + AndroidMobileCapabilityType.SYSTEM_PORT, systemPort); + cap.setCapability("appium:chromedriverPort", chromeDriverPort); + cap.setCapability("appium:systemPort", systemPort); } if (Configuration.chromeDriverPort != 0) { cap.setCapability("appium:chromedriverPort", chromeDriverPort); } if (Configuration.systemPort != 0) { - cap.setCapability("appium:" + AndroidMobileCapabilityType.SYSTEM_PORT, systemPort); + cap.setCapability("appium:systemPort", systemPort); } return cap; @@ -170,7 +168,7 @@ private static DesiredCapabilities setChromeDriverCap( configuration.getChromeDriverPath().startsWith("C:\\") ? configuration.getChromeDriverPath() : System.getProperty("user.dir") + slash + configuration.getChromeDriverPath(); - cap.setCapability("appium:" + AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromePath); + cap.setCapability("appium:chromedriverExecutable", chromePath); return cap; } diff --git a/src/main/java/testUI/IOSUtils/IOCapabilities.java b/src/main/java/testUI/IOSUtils/IOCapabilities.java index 90735c6..8d37996 100644 --- a/src/main/java/testUI/IOSUtils/IOCapabilities.java +++ b/src/main/java/testUI/IOSUtils/IOCapabilities.java @@ -1,8 +1,6 @@ package testUI.IOSUtils; -import io.appium.java_client.remote.IOSMobileCapabilityType; import io.appium.java_client.remote.MobileBrowserType; -import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.Platform; import org.openqa.selenium.remote.DesiredCapabilities; import testUI.Configuration; @@ -27,20 +25,20 @@ public static DesiredCapabilities setIOSCapabilities(boolean browser) { } // BROWSER OR APP if (browser) { - capabilities.setCapability("appium:" + MobileCapabilityType.AUTO_WEBVIEW, true); - capabilities.setCapability("appium:" + MobileCapabilityType.BROWSER_NAME, + capabilities.setCapability("appium:autoWebview", true); + capabilities.setCapability("appium:browserName", MobileBrowserType.SAFARI); } else if (!Configuration.iOSAppPath.isEmpty()) { String appPath = Configuration.iOSAppPath.charAt(0) == '/' ? Configuration.iOSAppPath : System.getProperty("user.dir") + "/" + Configuration.iOSAppPath; - capabilities.setCapability("appium:" + MobileCapabilityType.APP, appPath); + capabilities.setCapability("appium:app", appPath); } // IN CASE OF REAL DEVICE if (!Configuration.xcodeOrgId.isEmpty()) { - capabilities.setCapability(IOSMobileCapabilityType.XCODE_ORG_ID, + capabilities.setCapability("xcodeOrgId", Configuration.xcodeOrgId); - capabilities.setCapability(IOSMobileCapabilityType.XCODE_SIGNING_ID, + capabilities.setCapability("xcodeSigningId", Configuration.xcodeSigningId); } if (!Configuration.updatedWDABundleId.isEmpty()) { @@ -56,19 +54,16 @@ public static DesiredCapabilities setIOSCapabilities(boolean browser) { wdaLocalPort = 8100 + 20 * (Integer.parseInt(getUsePort().get(getUsePort().size() - 1)) - Configuration.baseAppiumPort) / 100; - } else { - wdaLocalPort = Configuration.wdaPort; + capabilities.setCapability("appium:wdaLocalPort", wdaLocalPort); } - capabilities.setCapability(IOSMobileCapabilityType.WDA_LOCAL_PORT, wdaLocalPort); - capabilities.setCapability("appium:" + MobileCapabilityType.NO_RESET, false); - capabilities.setCapability(IOSMobileCapabilityType.USE_NEW_WDA, + capabilities.setCapability("appium:noReset", false); + capabilities.setCapability("appium:useNewWDA", Configuration.useNewWDA); capabilities.setCapability("appium:platformName", Platform.IOS); - capabilities.setCapability("appium:" + MobileCapabilityType.AUTOMATION_NAME, "XCUITest"); - capabilities.setCapability(IOSMobileCapabilityType.START_IWDP, true); - capabilities.setCapability(IOSMobileCapabilityType.WDA_LAUNCH_TIMEOUT, + capabilities.setCapability("appium:automationName", "XCUITest"); + capabilities.setCapability("appium:wdaLaunchTimeout", Configuration.launchAppTimeout); - capabilities.setCapability(IOSMobileCapabilityType.COMMAND_TIMEOUTS, 30000); + capabilities.setCapability("appium:commandTimeouts", 30000); // ADD CUSTOM CAPABILITIES if (!Configuration.addMobileDesiredCapabilities.asMap().isEmpty()) { for (String key : addMobileDesiredCapabilities.asMap().keySet()) { @@ -107,9 +102,9 @@ private static DesiredCapabilities getIOSDevice() { Configuration.iOSDeviceName; Configuration.iOSVersion = Configuration.iOSVersion.isEmpty() ? "13.2" : Configuration.iOSVersion; - capabilities.setCapability("appium:" + MobileCapabilityType.DEVICE_NAME, + capabilities.setCapability("appium:deviceName", Configuration.iOSDeviceName); - capabilities.setCapability("appium:" + MobileCapabilityType.PLATFORM_VERSION, + capabilities.setCapability("appium:platformVersion", Configuration.iOSVersion); capabilities.setCapability("appium:udid", Configuration.UDID); } else { @@ -118,15 +113,15 @@ private static DesiredCapabilities getIOSDevice() { } else { capabilities.setCapability("appium:udid", Configuration.UDID); } - capabilities.setCapability("appium:" + MobileCapabilityType.DEVICE_NAME, + capabilities.setCapability("appium:deviceName", Configuration.iOSDeviceName); - capabilities.setCapability("appium:" + MobileCapabilityType.PLATFORM_VERSION, + capabilities.setCapability("appium:platformVersion", Configuration.iOSVersion); } } else { - capabilities.setCapability("appium:" + MobileCapabilityType.DEVICE_NAME, + capabilities.setCapability("appium:deviceName" , Configuration.iOSDeviceName); - capabilities.setCapability("appium:" + MobileCapabilityType.PLATFORM_VERSION, + capabilities.setCapability("appium:platformVersion", Configuration.iOSVersion); capabilities.setCapability("appium:udid", Configuration.UDID); } diff --git a/src/main/java/testUI/TestUIServer.java b/src/main/java/testUI/TestUIServer.java index 32cc5bb..5108eac 100644 --- a/src/main/java/testUI/TestUIServer.java +++ b/src/main/java/testUI/TestUIServer.java @@ -367,10 +367,6 @@ public static void stop() { if (!Configuration.automationType.equals(DESKTOP_PLATFORM)) { removeUsePort(driver - 1); removeUseBootstrapPort(driver - 1); - if (Configuration.automationType.equals(IOS_PLATFORM)) { - getDrivers().get(driver - 1).close(); - sleep(500); - } getDrivers().get(driver - 1).quit(); removeDriver(driver - 1); if (getAppiumServices() != null && getAppiumServices().size() >= driver) { diff --git a/src/main/java/testUI/elements/AttributeImp.java b/src/main/java/testUI/elements/AttributeImp.java index c02a910..5e8aaeb 100644 --- a/src/main/java/testUI/elements/AttributeImp.java +++ b/src/main/java/testUI/elements/AttributeImp.java @@ -1,6 +1,7 @@ package testUI.elements; import com.codeborne.selenide.Condition; +import com.codeborne.selenide.WebElementCondition; import org.openqa.selenium.By; import testUI.Configuration; @@ -40,7 +41,7 @@ protected AttributeImp(By AppiumElement, this.collection = collection; } - private Condition condition(boolean hasCondition, Condition condition) { + private WebElementCondition condition(boolean hasCondition, WebElementCondition condition) { if (hasCondition) return condition; return Condition.not(condition); diff --git a/src/main/java/testUI/elements/ShouldBe.java b/src/main/java/testUI/elements/ShouldBe.java index b94e786..717d6c9 100644 --- a/src/main/java/testUI/elements/ShouldBe.java +++ b/src/main/java/testUI/elements/ShouldBe.java @@ -1,6 +1,7 @@ package testUI.elements; import com.codeborne.selenide.Condition; +import com.codeborne.selenide.WebElementCondition; import org.openqa.selenium.By; import testUI.Configuration; @@ -39,7 +40,7 @@ protected ShouldBe(By AppiumElement, this.collection = collection; } - private Condition condition(boolean hasCondition, Condition condition) { + private WebElementCondition condition(boolean hasCondition, WebElementCondition condition) { if (hasCondition) return condition; return Condition.not(condition); diff --git a/src/main/java/testUI/elements/TestUI.java b/src/main/java/testUI/elements/TestUI.java index e325f8a..1620c82 100644 --- a/src/main/java/testUI/elements/TestUI.java +++ b/src/main/java/testUI/elements/TestUI.java @@ -3,6 +3,7 @@ import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; import com.codeborne.selenide.WebDriverRunner; +import com.codeborne.selenide.WebElementCondition; import io.appium.java_client.AppiumBy; import io.qameta.allure.Allure; import io.qameta.allure.model.Status; @@ -231,7 +232,7 @@ protected SelenideElement getSelenide(By element, int index, boolean collection) return $(element); } - protected void selenideAssert(Condition condition, + protected void selenideAssert(WebElementCondition condition, int time, By SelenideElement, int index, diff --git a/src/test/java/TestRunners/TestAndroidLocal.java b/src/test/java/TestRunners/TestAndroidLocal.java index 8934b20..1fa768c 100644 --- a/src/test/java/TestRunners/TestAndroidLocal.java +++ b/src/test/java/TestRunners/TestAndroidLocal.java @@ -24,6 +24,8 @@ public void testAndroidBrowser() { Configuration.testUILogLevel = LogLevel.DEBUG; Configuration.automationType = ANDROID_PLATFORM; Configuration.installMobileChromeDriver = true; + Configuration.UDID = "emulator-5554"; + Configuration.appiumUrl = "http://localhost:4723/"; open("https://www.google.com"); executeJs("arguments[0].value='TestUI';", googleLandingPage.getGoogleSearchInput() .getMobileElement()); @@ -39,8 +41,8 @@ public void testAndroidBrowser() { @DisplayName("Android browser test case") public void testAndroidBrowser2() { Configuration.testUILogLevel = LogLevel.DEBUG; - Configuration.appiumUrl = ""; - Configuration.androidDeviceName = ""; + Configuration.appiumUrl = "http://localhost:4723/"; + Configuration.UDID = "emulator-5554"; open("https://www.google.com"); } } diff --git a/src/test/java/TestRunners/TestBrowser.java b/src/test/java/TestRunners/TestBrowser.java index fae349d..a982e7d 100644 --- a/src/test/java/TestRunners/TestBrowser.java +++ b/src/test/java/TestRunners/TestBrowser.java @@ -15,7 +15,6 @@ import static testUI.UIOpen.open; import static testUI.UIUtils.*; import static testUI.Utils.By.*; -import static testUI.Utils.Performance.getListOfCommandsTime; import static testUI.Utils.Performance.logAverageTime; import static testUI.elements.TestUI.E; import static testUI.elements.TestUI.raiseSoftAsserts; @@ -34,12 +33,9 @@ public void testDesktopBrowser() { open("https://www.google.com"); UIAssert("the url is not correct", getSelenideDriver().getCurrentUrl().equals("https://www.google.com/")); - executeJs("arguments[0].value='TestUI';", googleLandingPage.getGoogleSearchInput() - .getSelenideElement().getWrappedElement()); googleLandingPage.getGoogleSearch() .then().saveScreenshot("~/screen.png"); logAverageTime(); - System.out.println(getListOfCommandsTime()); raiseSoftAsserts(); stop(); @@ -66,6 +62,7 @@ public void testDesktopBrowserStatusCode() { Configuration.logNetworkCalls = true; Configuration.browser = "chrome"; Configuration.headless = true; + open("https://www.google.com") .getNetworkCalls().filterByExactUrl("https://www.google.com/") .and() @@ -88,6 +85,7 @@ public void testDesktopCustomDriverBrowser() { Configuration.browser = "chrome"; Configuration.headless = true; Configuration.softAsserts = true; + open("https://www.google.com"); stop(); String userAgent = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"; diff --git a/src/test/java/TestRunners/TestIOS.java b/src/test/java/TestRunners/TestIOS.java index 39b85b8..9d44988 100644 --- a/src/test/java/TestRunners/TestIOS.java +++ b/src/test/java/TestRunners/TestIOS.java @@ -4,6 +4,7 @@ import org.junit.Test; import testUI.Configuration; +import static testUI.TestUIServer.stop; import static testUI.UIOpen.open; public class TestIOS { @@ -15,5 +16,7 @@ public void testIOSBrowser() { Configuration.serverLogLevel = "debug"; Configuration.useNewWDA = false; open("https://www.facebook.com"); + stop(); + open("https://www.facebook.com"); } } diff --git a/src/test/java/TestRunners/TestJUnit.java b/src/test/java/TestRunners/TestJUnit.java index 329f046..088f369 100644 --- a/src/test/java/TestRunners/TestJUnit.java +++ b/src/test/java/TestRunners/TestJUnit.java @@ -29,7 +29,7 @@ public void testAndroidBrowser() { Configuration.testUILogLevel = LogLevel.DEBUG; Configuration.UDID = "emulator-5554"; Configuration.installMobileChromeDriver = true; - Configuration.appiumUrl = "http://localhost:4723/wd/hub"; + Configuration.appiumUrl = "http://localhost:4723"; open("https://www.google.com") .given().setElement(googleLandingPage.getGoogleSearchInput()); } diff --git a/src/test/java/pages/GoogleLandingPage.java b/src/test/java/pages/GoogleLandingPage.java index 6bff1ab..dd52461 100644 --- a/src/test/java/pages/GoogleLandingPage.java +++ b/src/test/java/pages/GoogleLandingPage.java @@ -11,8 +11,8 @@ public class GoogleLandingPage { private UIElement googleSearch = E(byXpath("//button[@class='Tg7LZd']")) .setSelenideElement(byCssSelector("[aria-label=\"Google Search\"]")) .setiOSElement(byId("id")); - private UIElement googleSearchInput = E(byName("q")) - .setSelenideElement(byName("q")); + private UIElement googleSearchInput = E(byCssSelector("form[role=\"search\"] textarea")) + .setSelenideElement(byCssSelector("form[role=\"search\"] textarea")); private UIElement googleCookies = E(byText("I agree")) .setSelenideElement(byText("I agree")); }