Я пишу тесты в Xamarin UI Test для приложения Xamarin Forms на основе вкладок.Я хотел бы установить идентификаторы автоматизации для каждого элемента вкладки, чтобы в моем тесте пользовательского интерфейса можно было щелкнуть конкретную вкладку без ссылки на текстовую метку вкладки, которая локализована.
Я полагаю, вам нужно использовать пользовательскийРендерер и установить ContentDescription (Android) и AccessibilityIdentifier (iOS), и я пытался сделать это, со смешанными результатами.Как правильно это сделать?Если я на правильном пути с пользовательским рендерером, какой метод (ы) рендерера мне следует переопределить в IOS / Android, чтобы добиться этого?
ОБНОВЛЕНИЕ:
iOS: Ответ предоставлен @apineda.См. Его решение ниже вопроса.
Android: Похоже, требуется пользовательский рендер.Это немного противно, но это работает.Мы должны рекурсивно искать в иерархии представлений элементы панели вкладок и устанавливать для каждого «ContentDescription».Так как мы используем нижнюю панель навигации, мы ищем в обратном направлении для лучшей производительности.Для верхней панели навигации вам нужно искать «TabLayout» вместо «BottomNavigationItemView».
[assembly: ExportRenderer(typeof(MainPage), typeof(CustomTabbedPageRenderer))]
namespace Company.Project.Droid.CustomRenderers
{
public class CustomTabbedPageRenderer : TabbedRenderer
{
private bool tabsSet = false;
public CustomTabbedPageRenderer(Context context)
: base(context)
{
}
protected override void DispatchDraw(Canvas canvas)
{
if (!tabsSet)
{
SetTabsContentDescription(this);
}
base.DispatchDraw(canvas);
}
private void SetTabsContentDescription(Android.Views.ViewGroup viewGroup)
{
if (tabsSet)
{
return;
}
// loop through the view hierarchy backwards. this will work faster since the tab bar
// is at the bottom of the page
for (int i = viewGroup.ChildCount -1; i >= 0; i--)
{
var menuItem = viewGroup.GetChildAt(i) as BottomNavigationItemView;
if (menuItem != null)
{
menuItem.ContentDescription = "TabBarItem" + i.ToString();
// mark the tabs as set, so we don't do this loop again
tabsSet = true;
}
else
{
var viewGroupChild = viewGroup.GetChildAt(i) as Android.Views.ViewGroup;
if (viewGroupChild != null && viewGroupChild.ChildCount > 0)
{
SetTabsContentDescription(viewGroupChild);
}
}
}
}
}
}