使用 serenity BDD 的 Appium Android 切换应用程序本机和 Chrome

问题描述

我在 appium (v2.3.12) 中使用了 serenity

我的场景需要将应用程序从原生切换到打开 chrome 并验证表单以创建新帐户,然后返回原生并尝试登录

我使用 serenity.properties 的经典方式来实例化 appiumDriver 并使用 UIAutomator2 自动化应用程序。 当我需要切换 chrome 时,我使用一个新的 AppiumDriver,它具有相同的 url 和新功能,如下所示:

DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("automationName","UIAutomator2");
    capabilities.setCapability("browserName","Chrome");
    capabilities.setCapability("UDID",udid);
    capabilities.setCapability("platformName","Android");
    capabilities.setCapability("deviceName","emulator-5554");
    capabilities.setCapability("platformVersion","11.0");
    AppiumDriver newDriver = new AndroidDriver(new URL(url),capabilities);

Chrome 启动良好,我可以执行我的操作。

但问题就在这里当我不想切换回来时

我尝试了很多方法,但到目前为止都没有效果

第一次尝试是使用以下命令回调我的应用程序:

((AndroidDriver)((WebDriverFacade) getDriver()).getProxiedDriver()).launchApp();

((AndroidDriver)((WebDriverFacade) getDriver()).getProxiedDriver()).resetApp();

本机应用程序启动但驱动程序无法找到任何元素,当我尝试 getPageSource 时:

org.openqa.selenium.WebDriverException:处理命令时发生未知的服务器端错误。原始错误:无法代理。代理错误:“GET /wd/hub/session/f2dd1d65-351f-4845-b321-298e41b7df4d/source”无法代理到 UiAutomator2 服务器,因为检测过程未运行(可能已崩溃)。检查服务器日志和/或 logcat 输出获取更多详细信息

第二次尝试: 在使用第二个之前执行 .quit() 第一个 appiumDriver 但是当我在 chrome 操作之后执行 .launchApp() 时,我得到了这个:

org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用quit()后使用WebDriver?

我也尝试为每个 appiumDriver 使用两个不同的 appium 服务器。


也许解决方案是在退出并在 chrome 中执行操作后重新启动 serenity appiumDriver,因为我尝试启动第三个 appiumDriver 并且它运行良好并在本机应用程序中找到元素但它没有与来自 serenity 的 PageObject 一起工作,我不知道如何在测试中退出并重新启动 appiumDriver。


同样的过程在 iOS 上运行良好,当我重新打开应用程序元素时发现正确。也许问题是宁静处理 UIAutomator2 的方式?

解决方法

我建议一种解决方法。尽量不要创建 Chrome 驱动程序。当您想离开应用程序(主应用程序)打开 Chrome 时,只需单击 Android 主页(或返回)按钮即可返回主屏幕。然后单击 Chrome 图标并检查您是否可以继续与其交互。如果是,那么继续使用 Chrome 直到想要返回应用程序。使用:

driver.launchApp()

driver.activateApp(variables.getProperty("appium.appPackage")); //Android 
driver.activateApp(variables.getProperty("appium.bundleId")); //iOS 

对于您遇到的异常,我认为这来自您管理多个驱动程序的方式。当您切换到 Chrome 驱动程序时,您的主应用程序驱动程序会话似乎意外调用了 quit()。我不确定你的代码结构如何。但是,如果您不想通过上述变通方法修复它,仔细管理您的驱动程序可能是一个不错的方法。

有关 SessionNotFoundException here 的更多信息