当前位置: 首页 > 知识库问答 >
问题:

使用serenity BDD的Appium Android switch应用程序(本机和chrome)

蓬新
2023-03-14

我用serenity和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();

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

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

第二次尝试:在使用第二个appiumDriver之前对第一个appiumDriver执行.quit()操作,但在chrome操作之后执行.launchApp()操作时,我得到以下结果:

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

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

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

同样的过程在iOS上也可以正常工作,当我重新打开应用程序元素时,这些元素被正确找到。也许问题在于serenity处理UIAutomator2的方式?

共有1个答案

孟英光
2023-03-14

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

driver.launchApp()

或者

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

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

更多关于SessionNotFoundExcema的信息

 类似资料:
  • 本机应用程序是安装和执行在资源所有者使用的设备上的客户端(例如,桌面程序,本机移动应用)。本机应用程序需要关于安全、平台能力和整体最终用户体验的特别注意事项。 授权端点需要在客户端和资源所有者用户代理之间进行交互。本机应用程序可以调用外部的用户代理,或在应用程序中嵌入用户代理。例如: 外部用户代理-本机应用程序可以捕获来自授权服务器的响应。它可以使用带有操作系统已注册方案的重定向URI调用客户端作

  • 我正在尝试使用expo客户端在iphone上发布我的应用程序。当我将链接从我的mackbook发送到iphone时。我收到一个错误,说“加载请求的应用程序时出现问题。看起来您可能正在使用LAN URL。确保您的设备与服务器位于同一网络上或尝试使用隧道。”我在同一个网络上。我检查了两次网络。这些是我遵循的步骤1)我通过在终端窗口中给出“npm start”命令来启动应用程序。2)我选择选项“s”,然

  • 我最近开始研究iOS本机应用程序自动化- MAC OS 10.10.2iOS模拟器-iPhone 5s,iOS8.1 Appium 1.3.4 应用在应用商店中-我正在使用此应用商店应用的.App文件 Appium.app中的iOS设置-应用路径-为.app文件提供路径强制设备-模拟器设备 代码- 我还尝试只在代码中提供应用程序路径,但没有在appium.app中提供,我尝试使用和不使用应用程序的

  • 我读过一些帖子,说亚马逊应用程序使用webviews相当多 (来源:https://www.quora.com/why-does-the-Amazon-app-use-webview-in-and-ios-application和https://www.teamblind.com/post/Amazon-app-webviews-cut4sn6c) 现在,我曾经在android中玩过webview

  • 我想在Android上使用Appium来自动化下面的场景 首先在Chrome中打开一个网页。网页包含注册表单 填写表单,然后单击提交按钮 提交按钮通过uri打开我的本机应用程序(与我们通过点击链接市场打开Google Play的行为相同://...) 最后与应用程序交互 我可以为第1到3步实现自动化,但在第4步就失败了。 这对Appium有可能吗?有没有其他测试框架可以自动化这样的场景?

  • 我已经按照https://reactnative.dev/docs/environment-setup中规定的说明,除了choclatey,因为我已经有了节点等,但我不能构建我的应用程序,以达到仿真器上的输出RN样板(步骤2:在文档中)以下npx反应本机运行android。我已经搜索了很多很多个小时来寻找一个解决方案,但是我一无所获,这变得非常令人沮丧。下面我附上了相关的输出。 提前感谢您的帮助。