使用Robotium进行带有导航抽屉的应用程序UI测试

19
我们使用了支持库中的Navigation Drawer来开发应用。我们正在使用Robotium进行UI自动化测试,一切正常,但是Navigation Drawer可能会随机冻结,因此一些测试可能会随机失败。
这绝对不是Robotium的问题,因为我看到如何在我的设备上的其他应用程序中以及我的自己的应用程序中Navigation Drawer被冻结。
我已经尝试了这个问题答案中关于Navigation Drawer的修复方法:Why does DrawerLayout sometimes glitch upon opening? 它有所帮助,随机冻结从90%减少到约10%,但是10%的测试运行可能会失败,这非常糟糕,特别是对于持续集成...
也许有人已经解决了这个问题?

这个问题你问了好一段时间了,你找到解决方法了吗? - Mendhak
1
不过我们的QA工程师建议尝试循环打开导航抽屉并检查其项目的可见性,如果正常,则跳出循环。你可以尝试这种方法。 - Artem Zinnatullin
好的。我也一直在尝试使用 solo.setNavigationDrawer(Solo.OPENED);,这是在Robotium 5.1中出现的,并且多次使用了solo.sendKey(Solo.MENU);(我已将菜单连接到打开抽屉)。我会尝试您的建议,听起来简单得多。 - Mendhak
你是在模拟器上测试吗?试着在实际设备上运行。 - Sagar Waghmare
是的,在模拟器上,因为CI构建代理位于地球另一侧的某个地方 :) 所以设备对我来说不是解决方案。 - Artem Zinnatullin
有人吗?已经尝试了所有方法,但仍然面临这个问题。 - C0D3LIC1OU5
3个回答

3

我们的 Robotium 测试也遇到了同样的问题,我最终采取的解决方案是模拟一次拖动手势(就像真正的用户如何滑开抽屉),而不是尝试点击抽屉切换或使用 solo 方法。我发现在 Android 版本低于 SDK 18 的设备上,这种间歇性的失败情况更加常见。

我将此方法放置在我们自己的 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


0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接