【问题标题】:Robotium UI testing for app with Navigation Drawer使用导航抽屉的应用程序的 Robotium UI 测试
【发布时间】:2014-02-18 09:11:47
【问题描述】:

我们从 support.v4 库中获得了带有 Navigation Drawer 的应用。我们使用 Robotium 自动化 UI 测试,一切正常,但 Navigation Drawer 可能会随机冻结,因此某些测试可能会随机失败。

这绝对不是Robotium 的问题,因为我看到Navigation Drawer 在我设备上的其他一些应用程序中被冻结,也在我自己的应用程序中。

我已经尝试从这个问题的答案中修复Navigation DrawerWhy does DrawerLayout sometimes glitch upon opening?

它有帮助,随机冻结从 90% 减少到大约 10%,但 10% 的测试运行可能会失败,这非常糟糕,尤其是对于持续集成...

可能有人已经解决了这个问题?

【问题讨论】:

  • 你问这个问题已经有一段时间了,你有没有找到解决这个问题的方法?
  • 不,但是我们的 QA 工程师建议尝试在循环中打开 Navigation Drawer 并检查其项目的可见性,如果可以,则中断循环。你可以试试这个方法
  • 听起来不错。我也一直在玩 solo.setNavigationDrawer(Solo.OPENED);,它出现在 Robotium 5.1 中。和solo.sendKey(Solo.MENU); 几次(我已连接菜单以打开抽屉)。我会试试你的建议,听起来简单多了。
  • 您是在模拟器上测试它吗?尝试在实际设备上运行。
  • 是的,在模拟器上,因为 CI 构建代理位于地球另一端的某个地方 :) 所以设备不是我的解决方案

标签: android robotium navigation-drawer


【解决方案1】:

我在 Robotium 测试中遇到了同样的问题,我最终采用的解决方案是模拟拖动手势(真实用户如何滑动打开抽屉),而不是尝试单击抽屉切换或使用 @987654321 @ 方法。我似乎更频繁地注意到运行早于 SDK 18 的 Android 设备上的间歇性故障。

我将此方法放置在我们自己的 Solo 子类中,从那以后我们没有失败的测试(超过数百次运行)。

/**
 * Open the navigation drawer with a drag gesture. Click based triggering is
 * flaky on SDK < 18
 */
public void openNavigationDrawer() {
    Point deviceSize = new Point();
    getCurrentActivity().getWindowManager().getDefaultDisplay().getSize(deviceSize);

    int screenWidth = deviceSize.x;
    int screenHeight = deviceSize.y;
    int fromX = 0;
    int toX = screenWidth / 2;
    int fromY = screenHeight / 2;
    int toY = fromY;

    this.drag(fromX, toX, fromY, toY, 1);
}

【讨论】:

    【解决方案2】:

    我也在使用android.support.v4.widget.DrawerLayout,但没有找到任何方法简单地

    我终于用下面的代码打开了抽屉

    /**
     * As we use app compat it seems Solo#setNavigationDrawer is not doing well 
     * (drawer does not open, but the button is clicked)
     *
     * Same result for clickOnView(getView(android.R.id.home))
     * 
     * This code opens the navigation drawer on the main thread
     * Be aware : you need to provide your DrawerLayout id (you can do it in params)
     */
     public void openCompatNavigationDrawer() {
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
                 ((DrawerLayout) mSolo.getView(R.id.drawer_layout))
                      .openDrawer(Gravity.LEFT);
             }
         });
     }
    

    此处提供要点https://gist.github.com/quentin7b/9b51a3827c842417636b

    【讨论】:

      【解决方案3】:

      打开抽屉导航:solo.clickOnScreen(50, 50);

      在抽屉导航中选择列表项:

      ListView listView = (ListView) solo.getView(R.id.left_drawer); View SwitchOrganizations = listView.getChildAt(0); solo.clickOnView(SwitchOrganizations);

      【讨论】:

        猜你喜欢
        • 2017-04-15
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多