首页 > 解决方案 > 使用 Serenity BDD 的 Appium Android 切换应用程序(本机和 chrome)

问题描述

我正在使用 appium 的宁静(v2.3.12)

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

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

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,我没有知道如何在测试中从 serenity 中退出并重新启动 appiumDriver。


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

标签: javaselenium-chromedriverappiumserenity-bdd

解决方案


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

driver.launchApp()

或者

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

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

更多关于 SessionNotFoundException的信息在这里


推荐阅读