java - 使用 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 的方式?
解决方案
我建议一种解决方法。尽量不要创建 Chrome 驱动程序。当您想离开应用程序(主应用程序)打开 Chrome 时,只需单击 Android 主页(或返回)按钮即可返回主屏幕。然后单击 Chrome 图标并检查您是否可以继续与其交互。如果是,那么请继续使用 Chrome,直到想回到应用程序为止。利用:
driver.launchApp()
或者
driver.activateApp(variables.getProperty("appium.appPackage")); //Android
driver.activateApp(variables.getProperty("appium.bundleId")); //iOS
对于您遇到的异常,我认为它来自您管理多个驱动程序的方式。当您切换到 Chrome 驱动程序时,您的主应用程序驱动程序会话似乎意外调用了 quit()。我不确定您的代码结构如何。但是,如果您不想通过上述解决方法来修复它,那么仔细管理您的驱动程序可能是一个不错的方法。
更多关于 SessionNotFoundException的信息在这里
推荐阅读
- reactjs - 从功能性 React 组件传递 AgGrid 上下文
- c# - 如何在 automapper 中为 aftermap 上的目标属性赋值
- wordpress - ACF 中继器 - 显示前 10 行并将其他行放在另一个 div
- python - 如何在本地使用 tf-hub 模型
- r - 用值列表替换条形标签
- discord.py - (discord.py 重写)如何断开每个人与不和谐语音频道的连接?
- php - Laravel 7 与 Vue js 执行没有 php artisan serve 命令
- java - 如何使用 JDBC Thin Driver 和 Oracle Wallet 连接到 Oracle Cloud DDBB
- actionscript-3 - 如何让自上而下的射击子弹与敌人相撞?AS3
- python - 使用 DDG 获取响应 200 而不是 <418 I'm a Teapot>