如何在Xamarin Forms应用程序中为UI测试的选项卡页面栏项设置AutomationId

如何在Xamarin Forms应用程序中为UI测试的选项卡页面栏项设置AutomationId,xamarin,xamarin.forms,xamarin.ios,xamarin.android,xamarin.uitest,Xamarin,Xamarin.forms,Xamarin.ios,Xamarin.android,Xamarin.uitest,我正在XamarinUI测试中为基于选项卡的XamarinForms应用程序编写测试。我希望在每个选项卡项上设置自动化ID,以便我的UI测试可以单击特定选项卡,而无需参考选项卡的文本标签(已本地化) 我想你需要使用一个定制的渲染器,并设置ContentDescription(Android)和AccessibilityIdentifier(iOS),我一直在尝试这样做,结果好坏参半。正确的方法是什么?如果我使用自定义渲染器的方法正确,我应该在IOS/Android中覆盖哪些渲染器方法来实现这一点

我正在XamarinUI测试中为基于选项卡的XamarinForms应用程序编写测试。我希望在每个选项卡项上设置自动化ID,以便我的UI测试可以单击特定选项卡,而无需参考选项卡的文本标签(已本地化)

我想你需要使用一个定制的渲染器,并设置ContentDescription(Android)和AccessibilityIdentifier(iOS),我一直在尝试这样做,结果好坏参半。正确的方法是什么?如果我使用自定义渲染器的方法正确,我应该在IOS/Android中覆盖哪些渲染器方法来实现这一点

更新:

iOS: 答案由@apineda提供。请看问题下面他的答案

Android:似乎需要自定义渲染器。虽然有点恶心,但还是管用的。我们必须递归地在视图层次结构中搜索选项卡栏项,并为每个项设置“ContentDescription”。因为我们使用的是底部导航栏,所以我们向后搜索以获得更好的性能。对于上部组块导航栏,您需要搜索“TabLayout”而不是“BottomNavigationItemView”

[程序集:ExportRenderer(typeof(主页)、typeof(CustomTabbedPageRenderer))]
命名空间Company.Project.Droid.CustomRenders
{
公共类CustomTabbedPageRenderer:TabbedRenderer
{
private bool tabsSet=false;
公共CustomTabbedPageRenderer(上下文)
:基本(上下文)
{
}
受保护的覆盖无效DispatchDraw(画布)
{
如果(!tabsSet)
{
设置选项卡内容描述(此);
}
base.DispatchDraw(画布);
}
私有void SetTabsContentDescription(Android.Views.ViewGroup视图组)
{
如果(选项卡集)
{
返回;
}
//向后循环查看层次结构。这将比使用选项卡栏更快
//在这一页的底部
对于(int i=viewGroup.ChildCount-1;i>=0;i--)
{
var menuItem=viewGroup.GetChildAt(i)作为BottomNavigationItemView;
if(menuItem!=null)
{
menuItem.ContentDescription=“TabBarItem”+i.ToString();
//将选项卡标记为已设置,这样我们就不会再次执行此循环
tabsSet=true;
}
其他的
{
var viewGroupChild=viewGroup.GetChildAt(i)作为Android.Views.viewGroup;
如果(viewGroupChild!=null&&viewGroupChild.ChildCount>0)
{
SetTabsContentDescription(viewGroupChild);
}
}
}
}
}
}

对此,您不需要
自定义渲染器。您只需将
AutomationId
设置到选项卡页面的子
Pages
,这将分配给条项目

假设您有如下
TabPage


通过此配置,您将能够执行以下操作:

app.Tap(“TabTwo”);
而且您不需要使用
Text
属性

希望这有帮助-

更新:

刚刚确认上述内容不适用于Android(注意,您最初的问题是针对Android的),而仅适用于iOS。由于某种原因,这种行为是不同的

您仍然可以使用文本的本地化版本“点击它”,如下所述

处理本地化文本时可以使用的一个技巧是,设置正确的区域性,然后在测试中使用XAML中相同的资源集

i、 e

app.Tap(AppResources.MyMainTabText);

我可以确认此解决方案适用于iOS。非常感谢。对于Android,我能够让它与自定义渲染器一起工作。这很棘手,因为我使用的是Android的底部导航,所以我需要搜索该栏的层次结构。我不想通过文本搜索,因为我们的应用程序最终将是多语言的。将用Android解决方案更新我上面的问题。