Testdroid/Robotium waitForFragment с использованием ViewPager

Я пытаюсь использовать Testdroid, который поддерживается Robotium.

Фон:FragmentStatePagerAdapter не присваивает значения тегов для фрагментов (в отличие FragmentPagerAdapter) так waitForFragmentByTag не сработает; в результате я использую waitForFragmentById, что я не могу получить работу, как ожидалось.

Мои фрагменты определены в XML (фрагмент.xml), который определяет структуру пользовательского интерфейса и макет. Мои фрагменты также определены в коде (Fragment.java), где слушатели зарегистрированы и т. Д.

Я отладил через ExtSolo исходный код и когда Waiter вызывает FragManager (оба), нулевые значения возвращаются для идентификатора, определенного в теге @id родительского элемента в XML (R.id.fragment) а также идентификатор, определенный самим файлом (R.layout.fragment).

Это правильные значения идентификаторов для использования? Если нет, то что? Любая помощь с благодарностью.

2 ответа

Решение

Я закончил тем, что использовал грязную работу, которая вызовет сбой тестов, если структура изменится:

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);
}

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);
        }
    }
}

Вы можете проверить, какой идентификатор у ваших фрагментов. К сожалению, все они имеют идентификатор ViewPager или id = 0, поэтому кажется, что их невозможно отличить по id. Не знаю, поможет ли это вам, но я надеюсь на это.

Другие вопросы по тегам