【问题标题】:Appium Android switch app (native and chrome) using serenity BDD使用 Serenity BDD 的 Appium Android 切换应用程序(本机和 chrome)
【发布时间】:2021-06-13 23:34:47
【问题描述】:

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

我的场景需要将应用从原生切换到打开 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 输出以获取更多详细信息

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

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

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


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


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

【问题讨论】:

    标签: java selenium-chromedriver appium serenity-bdd


    【解决方案1】:

    我建议一种解决方法。尽量不要创建 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的信息

    【讨论】:

    • 感谢您的解决方法,它有效,即使 xpath 与我们使用的 chrome WebDriver 也不完全相同,但我可以让 chrome 执行我想通过测试的操作。只需要对 safari/ios stepdef 版本进行少量更改。谢谢(我投票了,但我的声誉还不够高,无法展示)
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多