I have been stuck with an issue from long time unable to resolve and in need of help badly. I have an android apk file, after launching the app, it shows the Webview of the website. I am unable to switch from Native App to Webview after launching the App.
I see 2 Context available (Native and Webview) but I am not able to switch to WebView, it fails saying "message":"ChromeDriver ready for new sessions". Below is the error message when I attempt to switch. I verified ChromeDriver in Appium, it is same as Chromeversion and Appium is v4 latest
Error in switching Context : OpenQA.Selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Did not get a valid response object. Object was: {"value":{"build":{"version":"85.0.4183.87 (cd6713ebf92fa1cacc0f1a598df280093af0c5d7-refs/branch-heads/4183@{#1689})"},"message":"ChromeDriver ready for new sessions.","os":{"arch":"x86_64","name":"Windows NT","version":"10.0.17763"},"ready":true}}
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at MobileDriver.SwithContextToWebView(AppiumDriver`1 driver, String context) in C:\Automation\Src\Common\MobileDriver.cs:line 656
Below is my desired Capabilities
private static AppiumOptions SetCapability(MobileDriverConfig config)
{
AppiumOptions capabilities = new AppiumOptions();
capabilities.AddAdditionalCapability("automationName", config.AutomationName);
capabilities.AddAdditionalCapability("deviceName", "Android");
capabilities.AddAdditionalCapability("platformName", config.PlatformName);
capabilities.AddAdditionalCapability("platformVersion", config.PlatformVersion);
capabilities.AddAdditionalCapability(CapabilityType.Platform, config.SystemOs);
capabilities.AddAdditionalCapability("udid", config.DeviceId);
capabilities.AddAdditionalCapability("appPackage", config.AppPackage);
capabilities.AddAdditionalCapability("appActivity", config.AppActivity);
capabilities.AddAdditionalCapability("chromeBundleId", config.ChromeBundleId);
capabilities.AddAdditionalCapability("ensureWebviewsHavePages", config.EnsureWebviewsHavePages);
capabilities.AddAdditionalCapability("webviewDevtoolsPort", config.WebviewDevtoolsPort);
capabilities.AddAdditionalCapability("chromedriverUseSystemExecutable", config.ChromedriverUseSystemExecutable);
capabilities.AddAdditionalCapability("enableWebviewDetailsCollection", config.EnableWebviewDetailsCollection);
capabilities.AddAdditionalCapability("fullContextList", true);
}
Below is what I am using for Context Switching
public void SwitchToContext(ViewType type)
{
Thread.Sleep(10000);
var driver = (AppiumDriver<IWebElement>)MDriver; // this is already initialized
System.Collections.ObjectModel.ReadOnlyCollection<string> allContexts = driver.Contexts; // returns 2 Context [Native_APP, WEBVIEW_packageName]
foreach (string context in allContexts)
{
Logger.Debug("Context Name: " + context);
switch (type)
{
case ViewType.Native:
if (context.Contains("NATIVE"))
{
driver.Context = context; // Native Switch works fine
}
break;
case ViewType.Webview:
if (context.Contains("WEBVIEW"))
{
driver.Context = context; // Webview switch errors out
}
break;
}
}
}
below is how I am Initializing my driver
var driver = new AndroidDriver<IWebElement>(new Uri("http://" + config.Server + ":"
+ config.Port + "/wd/hub/"), SetCapability(config), new TimeSpan(0, 3, 0));
Please help to resolve the issue
I was able to fix this by using Appium Local Service
AppiumLocalService _appiumLocalService = new AppiumServiceBuilder().UsingAnyFreePort().Build();
_appiumLocalService.Start();
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability(MobileCapabilityType.DeviceName, "Android_Accelerated_x86_Oreo");
appiumOptions.AddAdditionalCapability(MobileCapabilityType.PlatformName, "Android");
appiumOptions.AddAdditionalCapability(MobileCapabilityType.PlatformVersion, "7.1");
_driver = new AndroidDriver<AppiumWebElement>(_appiumLocalService, appiumOptions);
Make sure you dispose of the service after your test
_appiumLocalService.Dispose();