【问题标题】:How can I navigate to a specific page in an Appium test when using the Page Object Model design pattern?使用页面对象模型设计模式时,如何导航到 Appium 测试中的特定页面?
【发布时间】:2020-12-18 20:36:23
【问题描述】:

我的 Appium 测试已针对我的 Android 应用顺利运行。使用 Maven 和 Kotlin 编码。我的应用只有一个 LAUNCHER 活动,即我的 SplashScreenActivity。

目前,我有一个提供操作系统级别功能的 baseTest 类,例如 waitForElementswipeScreen(dir: Direction, amount: Int)

然后我有一个 AppTest 类扩展它并提供一些特定于应用程序的功能。最重要的是一个名为startApp() 的函数,它启动我的应用程序,以我的测试用户身份登录并导航到我的主屏幕。特定 UI 的每个测试都扩展此 AppTest 类并创建其自己的 getToUI 函数,该函数仅运行 startApp 函数,然后自动单击其他几个按钮以访问要测试的特定 UI。

现在我正在尝试将页面对象模型设计模式添加到我的测试中。我应该如何实现这种导航到要测试的 UI?我应该把代码导航到每个页面类的init中的页面吗?还是有更优雅的解决方案?

【问题讨论】:

  • 所以你正在尝试做一些事情,比如拥有someElement.click()。某些元素包含标识符和点击背后的逻辑?
  • 不,我首先要问的是如何访问该页面。在我的应用程序中,您必须先登录,然后单击 5 个按钮才能进入我要测试的页面。我见过的例子都没有解释你应该如何进入你想要测试的 UI 页面。我看到的例子只是说“创建一个新的登录页面(驱动程序)”现在开始点击元素。在我可以运行 Appium 测试之前,我的应用应该如何进入 LoginPage?
  • 你是用 Java 还是 C# 做的?
  • 这是在 Kotlin 中,因为我正在测试和 Android 应用程序。一旦我得到这个工作,我会尝试让 IOS 应用程序也能工作
  • 无论哪种方式,您都可以使用方法 Login() 创建一个抽象类。这会将您带到所有测试的相同入口点。然后你所有的测试都简单地继承抽象类。如果您在 Java 中使用 TestNG 组合执行此操作,我可以更详细地介绍。

标签: appium appium-android


【解决方案1】:

如果您只是希望在测试特定 UI 时优化导航到页面的方式,我建议您使用 Appium's start activity 命令,前提是 UI 不是片段。

有一些方法可以伪造登录功能,即生成测试身份验证令牌并将其添加到 HTTP 标头或添加身份验证 cookie 并将其与 HTTP 请求一起发送,但这更具体到您的项目中如何实现身份验证。

在 BDD 样式测试中,它应该如下所示:

given: a user and user is logged in
when: user opens SOME PAGE
then: SOME VALIDATION HERE

【讨论】:

    【解决方案2】:

    页面对象模型只是一种抽象。由您决定粒度级别:它可以是应用程序片段、UI 上的屏幕、UI 上的部分屏幕等。

    您还可以使用单个全局 Actions 类来包装一般操作,例如启动/重新启动应用、启动 Activity、将应用置于后台等。

    假设您应该登录一次,然后为了加快速度,您将重新开始活动,它可能看起来像这样:

    before:
    
    LoginScreen loginScreen = Actions.launchApp(); // should load login screen
    HomeScreen home = loginScreen.loginWithValidUser();
    
    beforeEach:
    
    HomeScreen homeScreen = Actions.launchHomeActivity() // no need to login, it is cached, just restart activity; maybe you need to make server API call to flush user data?
    
    test
    
    UserProfileScreen userScreen = homeScreen.openUserProfile()
    userScreen.changePassword(newPassword)
    userScreen.save()
    Actions.navigateBack()
    
    homeScreen....
    

    在导航到其他屏幕期间返回 PO 实例仍然取决于您。只要有静态功能,个人品味和可用性就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2021-07-14
      • 2017-12-03
      • 2022-01-26
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多