Skip to content

Commit

Permalink
Updated for using mobile web tests with Testerra 2.4
Browse files Browse the repository at this point in the history
  • Loading branch information
martingrossmann committed Mar 14, 2024
1 parent 3e2137a commit 6210c20
Show file tree
Hide file tree
Showing 14 changed files with 156 additions and 131 deletions.
4 changes: 2 additions & 2 deletions appium/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
dependencies {
compileOnly 'io.testerra:driver-ui:' + testerraCompileVersion
compileOnly 'io.appium:java-client:7.3.0'
compileOnly 'io.appium:java-client:' + appiumJavaClientVersion

implementation 'com.google.code.gson:gson:2.9.0'
implementation 'org.apache.commons:commons-lang3:3.12.0'
Expand All @@ -11,7 +11,7 @@ dependencies {
testImplementation 'io.testerra:driver-ui:' + testerraTestVersion
// testImplementation 'io.testerra:driver-ui'
testImplementation 'io.testerra:report-ng:' + testerraTestVersion
testImplementation 'io.appium:java-client:7.3.0'
testImplementation 'io.appium:java-client:' + appiumJavaClientVersion
}

test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@

package eu.tsystems.mms.tic.testframework.appium;

import eu.tsystems.mms.tic.testframework.core.WinAppDriverCoreAdapter;
import eu.tsystems.mms.tic.testframework.common.IProperties;
import eu.tsystems.mms.tic.testframework.core.WinAppDriverCoreAdapter;
import eu.tsystems.mms.tic.testframework.logging.Loggable;
import eu.tsystems.mms.tic.testframework.pageobjects.internal.core.GuiElementCore;
import eu.tsystems.mms.tic.testframework.pageobjects.internal.core.GuiElementData;
Expand All @@ -33,16 +33,15 @@
import eu.tsystems.mms.tic.testframework.webdrivermanager.WebDriverRequest;
import eu.tsystems.mms.tic.testframework.webdrivermanager.WinAppDriverRequest;
import io.appium.java_client.windows.WindowsDriver;
import io.appium.java_client.windows.WindowsElement;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class WinAppDriverFactory implements WebDriverFactory, Loggable, TestControllerProvider, Sleepy {

public enum Properties implements IProperties {
Expand All @@ -68,7 +67,7 @@ public Object getDefault() {
}
}

private WindowsDriver<WindowsElement> startNewWindowsDriver(WinAppDriverRequest appDriverRequest, SessionContext sessionContext) {
private WindowsDriver startNewWindowsDriver(WinAppDriverRequest appDriverRequest, SessionContext sessionContext) {
final URL finalWinAppServerUrl = appDriverRequest.getServerUrl().get();
sessionContext.setNodeUrl(finalWinAppServerUrl);

Expand All @@ -80,7 +79,7 @@ private WindowsDriver<WindowsElement> startNewWindowsDriver(WinAppDriverRequest
desiredCapabilities.setCapability(WinAppDriverRequest.APP_ID, appId);
});

WindowsDriver<WindowsElement> windowsDriver = new WindowsDriver<>(finalWinAppServerUrl, desiredCapabilities);
WindowsDriver windowsDriver = new WindowsDriver(finalWinAppServerUrl, desiredCapabilities);
//CONTROL.retryFor(appDriverRequest.getStartupTimeoutSeconds(), windowsDriver::getTitle, this::sleep);
return windowsDriver;
}
Expand All @@ -94,8 +93,8 @@ public WebDriverRequest prepareWebDriverRequest(WebDriverRequest webDriverReques
}

@Override
public WebDriver createWebDriver(WebDriverRequest webDriverRequest, SessionContext sessionContext) {
WinAppDriverRequest appDriverRequest = (WinAppDriverRequest)webDriverRequest;
public WebDriver createWebDriver(WebDriverRequest webDriverRequest, SessionContext sessionContext) {
WinAppDriverRequest appDriverRequest = (WinAppDriverRequest) webDriverRequest;

/**
* Try to reuse an already opened application
Expand All @@ -113,11 +112,13 @@ public WebDriver createWebDriver(WebDriverRequest webDriverRequest, SessionConte
appDriverRequest.getServerUrl().ifPresent(desktopDriverRequest::setServerUrl);
}

WindowsDriver<WindowsElement> desktopDriver = startNewWindowsDriver(desktopDriverRequest, sessionContext);
WindowsDriver desktopDriver = startNewWindowsDriver(desktopDriverRequest, sessionContext);

log().info(String.format("Try to create driver on running application by window title \"%s\"", reuseableWindowTitle));
CONTROL.waitFor(appDriverRequest.getReuseTimeoutSeconds(), () -> {
WebElement elementByName = desktopDriver.findElementByName(reuseableWindowTitle);
// TODO: Verify migration
// WebElement elementByName = desktopDriver.findElementByName(reuseableWindowTitle); --> migrate to Appium 8.x
WebElement elementByName = desktopDriver.findElement(By.name(reuseableWindowTitle));
String nativeWindowHandle = elementByName.getAttribute("NativeWindowHandle");
int nativeWindowHandleId = Integer.parseInt(nativeWindowHandle);
if (nativeWindowHandleId > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public AppiumDeviceQuery() {
}

public AppiumDeviceQuery(Capabilities capabilities) {
this.setOs((String) capabilities.getCapability("platformName"));
this.setOs(capabilities.getPlatformName().toString());
// this.setOs((String) capabilities.getCapability("platformName"));
this.setVersion((String) capabilities.getCapability("platformVersion"));
this.setManufacture((String) capabilities.getCapability("deviceManufacture"));
this.setModel((String) capabilities.getCapability("deviceModel"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import eu.tsystems.mms.tic.testframework.report.model.context.SessionContext;
import eu.tsystems.mms.tic.testframework.report.utils.IExecutionContextController;
import eu.tsystems.mms.tic.testframework.utils.AppiumProperties;
import eu.tsystems.mms.tic.testframework.utils.DefaultCapabilityUtils;
import eu.tsystems.mms.tic.testframework.utils.TimerUtils;
import eu.tsystems.mms.tic.testframework.webdriver.WebDriverFactory;
import eu.tsystems.mms.tic.testframework.webdrivermanager.AppiumDriverRequest;
Expand All @@ -41,10 +40,13 @@
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.remote.MobileBrowserType;
import io.appium.java_client.remote.options.BaseOptions;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.MutableCapabilities;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.support.events.EventFiringWebDriver;

import java.net.URL;
Expand Down Expand Up @@ -74,37 +76,42 @@ public WebDriverRequest prepareWebDriverRequest(WebDriverRequest webDriverReques
finalRequest.setBrowserVersion(webDriverRequest.getBrowserVersion());
}

DesiredCapabilities requestCapabilities = finalRequest.getDesiredCapabilities();
MutableCapabilities requestCapabilities = finalRequest.getMutableCapabilities();
BaseOptions baseOptions = new BaseOptions<>();

// general caps
IExecutionContextController executionContext = Testerra.getInjector().getInstance(IExecutionContextController.class);
requestCapabilities.setCapability(AppiumDriverRequest.CAPABILITY_NAME_TEST_NAME, executionContext.getExecutionContext().getRunConfig().getReportName());
baseOptions.setCapability(AppiumDriverRequest.CAPABILITY_NAME_TEST_NAME, executionContext.getExecutionContext().getRunConfig().getReportName());

if (requestCapabilities.getCapability(AppiumDriverRequest.DEVICE_QUERY) == null
|| StringUtils.isBlank(requestCapabilities.getCapability(AppiumDriverRequest.DEVICE_QUERY).toString())) {
switch (webDriverRequest.getBrowser()) {
case Browsers.mobile_safari: {
finalRequest.setDeviceQuery(AppiumProperties.MOBILE_APPIUM_DEVICE_QUERY_IOS.asString());
baseOptions.setCapability(AppiumDriverRequest.DEVICE_QUERY, AppiumProperties.MOBILE_APPIUM_DEVICE_QUERY_IOS.asString());
break;
}
case Browsers.mobile_chrome: {
finalRequest.setDeviceQuery(AppiumProperties.MOBILE_APPIUM_DEVICE_QUERY_ANDROID.asString());
baseOptions.setCapability(AppiumDriverRequest.DEVICE_QUERY, AppiumProperties.MOBILE_APPIUM_DEVICE_QUERY_ANDROID.asString());
break;
}
}
}

switch (webDriverRequest.getBrowser()) {
case Browsers.mobile_chrome:
requestCapabilities.setBrowserName(MobileBrowserType.CHROME);
baseOptions.setCapability(CapabilityType.BROWSER_NAME, MobileBrowserType.CHROME);
break;
case Browsers.mobile_safari:
requestCapabilities.setBrowserName(MobileBrowserType.SAFARI);
baseOptions.setCapability(CapabilityType.BROWSER_NAME, MobileBrowserType.SAFARI);
break;
default:
log().info("No mobile browser requested.");
}

// Any additional defined desired capabilities are merged into browser options
baseOptions = baseOptions.merge(finalRequest.getDesiredCapabilities());
baseOptions = baseOptions.merge(finalRequest.getMutableCapabilities());
finalRequest.setCapabilities(baseOptions);

return finalRequest;
}

Expand All @@ -123,43 +130,32 @@ public WebDriver createWebDriver(WebDriverRequest webDriverRequest, SessionConte

private WebDriver startNewAppiumSession(WebDriverRequest webDriverRequest, SessionContext sessionContext) {
AppiumDriverRequest appiumDriverRequest = (AppiumDriverRequest) webDriverRequest;
DesiredCapabilities requestCapabilities = appiumDriverRequest.getDesiredCapabilities();
Capabilities requestCapabilities = appiumDriverRequest.getCapabilities();
URL appiumUrl = appiumDriverRequest.getServerUrl().get();
DesiredCapabilities finalCapabilities = new DesiredCapabilities(requestCapabilities);
// DesiredCapabilities finalCapabilities = new DesiredCapabilities(requestCapabilities);

// IExecutionContextController executionContextController = Testerra.getInjector().getInstance(IExecutionContextController.class);
// DefaultCapabilityUtils utils = new DefaultCapabilityUtils();

IExecutionContextController executionContextController = Testerra.getInjector().getInstance(IExecutionContextController.class);
DefaultCapabilityUtils utils = new DefaultCapabilityUtils();
// TODO: Move to prepareWebDriverRequest
utils.putIfAbsent(finalCapabilities, AppiumDriverRequest.CAPABILITY_NAME_TEST_NAME, executionContextController.getExecutionContext().getRunConfig().getReportName());
// utils.putIfAbsent(requestCapabilities, AppiumDriverRequest.CAPABILITY_NAME_TEST_NAME, executionContextController.getExecutionContext().getRunConfig().getReportName());

AppiumDriver appiumDriver = null;
Platform mobilePlatform = new MobileOsChecker().getPlatform(webDriverRequest);
switch (mobilePlatform) {
case IOS:
appiumDriver = new IOSDriver<>(appiumUrl, finalCapabilities);
appiumDriver = new IOSDriver(appiumUrl, requestCapabilities);
break;
case ANDROID:
appiumDriver = new AndroidDriver<>(appiumUrl, finalCapabilities);
appiumDriver = new AndroidDriver(appiumUrl, requestCapabilities);
break;
}

// switch (webDriverRequest.getBrowser()) {
// case Browsers.mobile_safari: {
// finalCapabilities.setBrowserName(MobileBrowserType.SAFARI);
// appiumDriver = new IOSDriver<>(appiumUrl, finalCapabilities);
// break;
// }
// case Browsers.mobile_chrome: {
// finalCapabilities.setBrowserName(MobileBrowserType.CHROME);
// appiumDriver = new AndroidDriver<>(appiumUrl, finalCapabilities);
// break;
// }
// }
if (appiumDriver != null) {
AppiumDeviceQuery appiumDeviceQuery = new AppiumDeviceQuery(appiumDriver.getCapabilities());
sessionContext.setActualBrowserName(appiumDeviceQuery.toString());
sessionContext.setUserAgent(appiumDeviceQuery.toString());
sessionContext.setActualBrowserName(appiumDeviceQuery.getBrowserName());
} else {
throw new RuntimeException("Cannot create new Appium session - ambiguous capabilities found:\n " + finalCapabilities.toString());
throw new RuntimeException("Cannot create new Appium session - ambiguous capabilities found:\n " + requestCapabilities.toString());
// throw new RuntimeException("Mobile Browser not supported: " + webDriverRequest.getBrowser());
}
return appiumDriver;
Expand All @@ -174,7 +170,7 @@ public void setupNewWebDriverSession(EventFiringWebDriver webDriver, SessionCont
.ifPresent(driver -> driverString.set(driver.getClass().toString()));

// In case of app automation it es not possible to call a URL
if (StringUtils.isNotBlank(appiumDriverRequest.getDesiredCapabilities().getBrowserName())) {
if (StringUtils.isNotBlank(appiumDriverRequest.getBrowser())) {
appiumDriverRequest.getBaseUrl().ifPresent(url -> {
log().info("Open {} on {}", url, driverString.get());
webDriver.get(url.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.IOSMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;

import java.util.Map;
import java.util.Optional;

/**
Expand All @@ -42,20 +42,21 @@
public class MobileOsChecker {

public Platform getPlatform(WebDriverRequest webDriverRequest) {
Map<String, Object> capabilities = webDriverRequest.getCapabilities();
Capabilities capabilities = webDriverRequest.getCapabilities();

if (webDriverRequest.getBrowser().equals(Browsers.mobile_chrome)
|| "Espresso".equals(capabilities.get(MobileCapabilityType.AUTOMATION_NAME))
|| "UiAutomator2".equals(capabilities.get(MobileCapabilityType.AUTOMATION_NAME))
|| "UiAutomator".equals(capabilities.get(MobileCapabilityType.AUTOMATION_NAME))
|| capabilities.containsKey(AndroidMobileCapabilityType.APP_PACKAGE)
|| capabilities.containsKey(AndroidMobileCapabilityType.APP_ACTIVITY)
|| "Espresso".equals(capabilities.getCapability(MobileCapabilityType.AUTOMATION_NAME))
|| "UiAutomator2".equals(capabilities.getCapability(MobileCapabilityType.AUTOMATION_NAME))
|| "UiAutomator".equals(capabilities.getCapability(MobileCapabilityType.AUTOMATION_NAME))
|| capabilities.getCapability(AndroidMobileCapabilityType.APP_PACKAGE) != null
|| capabilities.getCapability(AndroidMobileCapabilityType.APP_ACTIVITY) != null
) {
return Platform.ANDROID;
}
if (webDriverRequest.getBrowser().equals(Browsers.mobile_safari)
|| "XCUITest".equals(capabilities.get(MobileCapabilityType.AUTOMATION_NAME))
|| "UIAutomation".equals(capabilities.get(MobileCapabilityType.AUTOMATION_NAME))
|| capabilities.containsKey(IOSMobileCapabilityType.BUNDLE_ID)
|| "XCUITest".equals(capabilities.getCapability(MobileCapabilityType.AUTOMATION_NAME))
|| "UIAutomation".equals(capabilities.getCapability(MobileCapabilityType.AUTOMATION_NAME))
|| capabilities.getCapability(IOSMobileCapabilityType.BUNDLE_ID) != null
) {
return Platform.IOS;
}
Expand Down
Loading

0 comments on commit 6210c20

Please sign in to comment.