使用ViewPager的Testdroid / Robotium waitForFragment

时间:2013-02-22 05:23:46

标签: android android-fragments robotium testdroid

我正在尝试使用由Robotium支持的Testdroid。

背景: FragmentStatePagerAdapter没有为片段分配标记值(与FragmentPagerAdapter不同),因此waitForFragmentByTag将无效;结果我使用waitForFragmentById,我无法按预期工作。

我的片段在xml( fragment.xml )中定义,它定义了UI结构和布局。 我的片段也在代码( Fragment.java )中定义,这是监听器注册的地方等。

我已通过ExtSolo源代码调试,当Waiter调用fragmentManager(两者)时,为XML中父元素的@id标记中定义的ID返回空值(R.id.fragment)以及文件本身定义的ID(R.layout.fragment)。

这些ID值是否正确使用?如果不是,那是什么?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

Robotium基于FragmentManager和方法findFragmentById / findFragemntByTag。 使用示例应用程序Support4Demos,我检查了State Pager中的片段,这些片段似乎与您的上下文类似。使用此代码:

List<Fragment> fragList = new ArrayList<Fragment>();

@Override
public void onAttachFragment (Fragment fragment) {
    if (!fragList.contains(fragment)) {
        fragList.add(fragment);
        Log.d("TEST", "Fragment id ("+ fragment.getId() +")");
        if (fragment.getId() != View.NO_ID && fragment.getId() != 0) {
            String id = fragment.getResources().getResourceEntryName(
                    fragment.getId());
            Log.d("TEST", "Fragment id " + id);
        }
    }
}

你可以查看你的片段有什么ID。不幸的是,它们都具有ViewPager或id = 0的id,因此似乎无法通过id区分它们。不知道,它是否会对你有帮助,但我希望如此。

答案 1 :(得分:0)

我最终使用了令人讨厌的工作,如果结构发生变化,将导致测试失败:

private void assertAtHomeFragment() {
    assertTrue(solo.waitForView(ListView.class, 1, 2000));
    assertTrue(solo.waitForView(ImageButton.class, 3, 2000));
    assertTrue(solo.waitForView(Button.class, 1, 2000));
    solo.sleep(1000);
}

private void assertAtLibraryFragment() {
    assertTrue(solo.waitForView(ListView.class, 1, 2000));
    assertTrue(solo.waitForView(ImageButton.class, 0, 2000));
    solo.sleep(1000);
}