【问题标题】:Appium Unable to Switch from NativeApp to WebView in C#Appium 无法在 C# 中从 NativeApp 切换到 WebView
【发布时间】:2021-01-10 09:35:05
【问题描述】:

长期以来,我一直被一个问题所困扰,无法解决并且急需帮助。我有一个 android apk 文件,启动应用程序后,它会显示网站的 Webview。启动应用后,我无法从 Native App 切换到 Webview。

我看到 2 个可用的上下文(本机和 Webview),但我无法切换到 WebView,它无法显示“message”:“ChromeDriver 已准备好进行新会话”。以下是我尝试切换时的错误消息。我在 Appium 中验证了 ChromeDriver,它与 Chromeversion 相同,并且 Appium 是 v4 最新的

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

以下是我想要的能力

        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);
            }

以下是我用于上下文切换的内容


    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;
                       }
                   }
            }

下面是我如何初始化我的驱动程序

var driver = new AndroidDriver<IWebElement>(new Uri("http://" + config.Server + ":"
                            + config.Port + "/wd/hub/"), SetCapability(config), new TimeSpan(0, 3, 0));

请帮忙解决问题

【问题讨论】:

    标签: c# selenium selenium-webdriver appium appium-android


    【解决方案1】:

    您是否检查过所用设备中的 chrome 版本?它应该与 Appium 指向的 chrome 驱动程序的版本相匹配。查看此链接以获取有关 chrome 驱动程序的更多信息,下载合适的版本后,您应该添加 chromedriverExecutable 功能

    https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json

    这对我有用:

    AppiumOptions appiumOptions = new AppiumOptions();
            appiumOptions.AddAdditionalCapability(MobileCapabilityType.PlatformName, 
            "Android");
            appiumOptions.AddAdditionalCapability(MobileCapabilityType.PlatformVersion, 
            "8.1");
            appiumOptions.AddAdditionalCapability(MobileCapabilityType.AutomationName, 
            "UiAutomator2");
            appiumOptions.AddAdditionalCapability(MobileCapabilityType.DeviceName, 
            "Android Device");
            appiumOptions.AddAdditionalCapability(MobileCapabilityType.App, 
            "D:\\XXX.apk");
            appiumOptions.AddAdditionalCapability("chromedriverExecutable", 
            "C:\\Users\\Downloads\\chromedriver.exe");
            driver = new AndroidDriver<AndroidElement>(new 
            Uri("http://127.0.0.1:4723/wd/hub"), appiumOptions);
    

    【讨论】:

    • 我的 Chromedriver 与设备中使用的版本相同,我不知道为什么会收到远程驱动程序错误,我在本地计算机上运行 OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(响应错误Response)
    • 我之前读到过 chrome 驱动程序最新版本和 appium 之间存在兼容性问题,所以我的建议是尝试降级 chrome 并使用旧版本的 chrome 驱动程序,如果您不是针对特定的版本。
    【解决方案2】:

    我可以通过使用 Appium 本地服务解决此问题

    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);
    

    确保在测试后处理掉服务

    _appiumLocalService.Dispose();
    

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2016-03-28
      • 2020-07-14
      • 2017-07-19
      • 2018-10-16
      • 1970-01-01
      相关资源
      最近更新 更多