You can create a Java Test project in IntelliJ or in your choice of IDE using either Gradle or Maven as a build tool. We are going to use TestContainers in Java to dynamically run the Appium container (Appium Server) as part of our test script. Add below dependencies (in this example I am using Maven):
You can refer the below class file code which runs the test in the emulator device using appium server container in the host machine. You must focus on the code that creates the appium container and the UiAutomator2 capabilities that I have used. You may not have come across any code so far where everything is kept under the same hood for easy understanding of Appium container's environment variables and the needed capabilities of UiAutomator2.
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testcontainers.Testcontainers;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.MountableFile;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;
public class MobileTrial {
public static void main(String[] args) throws IOException, InterruptedException {
Testcontainers.exposeHostPorts(5555, 5037, 8200);
GenericContainer<?> appiumServerContainer = new GenericContainer<>("appium/appium:latest")
.withExposedPorts(4723,8200)
.withPrivilegedMode(true)
.withAccessToHost(true)
.withEnv("REMOTE_ADB", "true")
.withEnv("ANDROID_DEVICES", "host.testcontainers.internal:5555")
.withEnv("APPIUM_ADDITIONAL_PARAMS", "--relaxed-security --allow-insecure=*:chromedriver_autodownload")
.withCopyFileToContainer(MountableFile.forHostPath("c:/users/<put your user directory>/.android/adbkey"), "/home/androidusr/.android/adbkey")
.withCopyFileToContainer(MountableFile.forHostPath("c:/users/<put your user directory>/.android/adbkey.pub"), "/home/androidusr/.android/adbkey.pub")
.withCopyFileToContainer(MountableFile.forHostPath("c:/users/<put your user directory>/.android/adbkey"), "/root/.android/adbkey")
.withCopyFileToContainer(MountableFile.forHostPath("c:/users/<put your user directory>/.android/adbkey.pub"), "/root/.android/adbkey.pub")
.waitingFor(Wait.forHttp("/status").forPort(4723).withStartupTimeout(Duration.ofMinutes(2)));
appiumServerContainer.start();
String appium_server_url = "http://" + appiumServerContainer.getHost() + ":" + appiumServerContainer.getMappedPort(4723);
System.out.println("Appium server url: " + appium_server_url+"/status");
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("appium:automationName", "UiAutomator2");
caps.setCapability("platformName", "Android");
caps.setCapability("browserName", "Chrome");
caps.setCapability("appium:deviceName", "Android Emulator");
caps.setCapability("appium:udid", "host.testcontainers.internal:5555");
caps.setCapability("appium:platformVersion", "15");
caps.setCapability("appium:chromedriverConnectHost", "127.0.0.1");
caps.setCapability("appium:chromedriverConnectPort", 8200);
caps.setCapability("appium:systemPort", 8200);
caps.setCapability("appium:automatedChromedriverDownload", true);
caps.setCapability("appium:ignoreHiddenApiPolicyError", true);
caps.setCapability("appium:relaxedSecurity", true);
caps.setCapability("appium:noSign", true);
caps.setCapability("appium:amStartWithCleanRules", true);
caps.setCapability("appium:noReset", true);
caps.setCapability("appium:clearDeviceLogsOnStart", true);
caps.setCapability("appium:skipUnlock", true);
caps.setCapability("appium:appWaitDuration", 60000);
caps.setCapability("appium:suppressKillServer", true);
caps.setCapability("appium:enforceAppInstall", true);
caps.setCapability("appium:uninstallAppiumServer", true);
caps.setCapability("appium:uiautomator2ServerLaunchTimeout", 60000);
try {
AndroidDriver driver = new AndroidDriver(new URL(appium_server_url), caps);
driver.get("https://www.saucedemo.com/");
System.out.println(driver.getTitle());
driver.quit();
}catch(Exception e){
System.out.println(appiumServerContainer.getLogs());
}
}
}
*********************************************************************************
Coming soon...