Robotium: разрешите Соло щелкнуть DatePicker в локализованной сборке

Я нажимаю кнопку «Установить» в DatePickerDialog с помощью Robotium через

solo.clickOnButton("Set"); 

Если я сейчас изменю язык тестового устройства на другой язык, Robotium не сможет найти кнопку, так как текст больше не «Установить», а переведенное слово.

Есть ли возможность получить доступ к кнопке в Picker другим способом?

Поскольку в Jelly Bean DatePicker потерял кнопку «Отмена», я не могу использовать метод clickOnButton (int index).

Единственная идея, которая у меня есть, - использовать setButton в DatePickerDialog, чтобы иметь доступ к локализованному строковому ресурсу текста кнопки или сохранить ссылку на кнопку. Но, может быть, кто-то знает лучший способ получить доступ без использования пользовательского текста кнопки.

С уважением Ким


person Micky    schedule 10.08.2012    source источник


Ответы (4)


Если у вас есть доступ к исходному коду, вы можете использовать как getString(), так и getView():

Button button = (Button) solo.getView(R.id.x);

solo.clickOnView(button);

Существует также solo.getString(R.string.x), который хорошо использовать для локализованных сборок.

person Renas    schedule 10.08.2012
comment
Спасибо за Ваш ответ. Я знаю эти методы. X является важной частью, как мне получить идентификатор или строковый ресурс для кнопки установки стандартного DatePickerDialog? Как я уже сказал, без передачи ссылки на пользовательскую кнопку? - person Micky; 10.08.2012

Я знаю, что это не лучшее решение, но оно работает для меня:

solo.clickOnButton(0);
person Semyon    schedule 23.05.2013

Вот мое предложение (при условии, что вы показываете диалог через DialogFragment): у меня есть SelectDateDialogFragment с уникальным TAG и методом onCreateDialog(), который создает DatePickerDialog. Затем я показываю диалог через selectDateDialogfragment.show(getFragmentManager(), SelectDateDialogFragment.TAG). В тестах Robotium я использую следующий код, чтобы нажимать кнопки диалогового окна:

solo.clickOnView(editDateButton);

solo.waitForFragmentByTag(SelectDateDialogFragment.TAG);

solo.setDatePicker(0, 2000, 1, 1);

SelectDateDialogFragment dialogFragment = (SelectDateDialogFragment) activity.getFragmentManager()
        .findFragmentByTag(SelectDateDialogFragment.TAG);
DatePickerDialog dialog = (DatePickerDialog) dialogFragment.getDialog();
Button okButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
solo.clickOnView(okButton);

solo.waitForDialogToClose();
person csoltenborn    schedule 07.10.2014

Я хотел бы поделиться с вами некоторыми подробностями.

Первый:

solo.clickOnButton(0);

работал хорошо для меня некоторое время. Но поскольку новые диалоги не имеют кнопок «Установить» и «Отмена», а вместо них «Отмена» и «ОК», это решение теперь будет выбирать кнопку отмены на более новых устройствах, просто переключаясь на

solo.clickOnButton(1);

сломал бы тест для старых устройств.

Поэтому я перешел на решение csoltenborn с двумя модификациями:

  • поскольку я хочу оставаться совместимым со старыми устройствами, я использую SupportFragmentManager
  • поскольку мой фрагмент вложен в другой фрагмент в зависимости от устройства и его ориентации, мне иногда приходится обращаться к определенным фрагментам ChildFragmentManager.

Это мое решение, возможно, оно может добавить к хорошему ответу csoltenborn:

DialogFragment dialogFrag;

Fragment outerFragment = getActivity().getSupportFragmentManager().findFragmentByTag("outerFragmentTAG");
    if (outerFragment == null) {
        dialogFrag = (DialogFragment)getActivity().getSupportFragmentManager().findFragmentByTag("datePicker");
    } else {
        dialogFrag = (DialogFragment)outerFragment.getChildFragmentManager().findFragmentByTag("datePicker");
    }
    Button okButton = ((DatePickerDialog)dialogFrag.getDialog()).getButton(DialogInterface.BUTTON_POSITIVE);
    solo.clickOnView(okButton);
person Christoph    schedule 17.11.2015