Как установить AutomationId для элементов панели TabbedPage в приложении Xamarin Forms для тестирования пользовательского интерфейса - PullRequest
0 голосов
/ 28 января 2019

Я пишу тесты в 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);
                    }
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 29 января 2019

Вам не нужно CustomRenderer для этого.Вам просто нужно установить AutomationId для дочерних элементов Pages на вкладке TabPage, и это назначено для элемента Item.

Допустим, у вас есть TabPage, как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                xmlns:local="clr-namespace:MyGreatNamespace"
             x:Class="MyGreatNamespace.MyTabPage">
    <TabbedPage.Children>
         <local:MainPage AutomationId="MainTab" Title="Main Page" />
         <local:PageOne AutomationId="TabOne" Title="Page One" />
         <local:PageTwo AutomationId="TabTwo" Title="Page Two" />
    </TabbedPage.Children>
</TabbedPage>

С этой конфигурацией вы сможете:

app.Tap("TabTwo");

И вам не нужно будет использовать свойство Text.

Надеюсь, это поможет .-

ОБНОВЛЕНИЕ:

Только что подтвердил, что выше не работает с Android (заметил, что ваш оригинальный вопрос для Android), но только с iOS.По некоторым причинам поведение отличается.

Вы все еще можете использовать Локализованную версию текста, чтобы «коснуться его», как объяснено ниже.

трюк, который можно использовать при работе с локализованным текстом,что вы установили правильную культуру, а затем использовали тот же набор ресурсов в XAML, что и часть теста.

т.е.

app.Tap(AppResources.MyMainTabText)

...