Xamarin.UITest:如何select当前节点的下一个元素

Xamarin.UITest: How to select a next element of the current node

有什么方法可以使用 Xamarin.UITest.Queries.AppQuery select 当前节点的下一个元素吗?

这是一个 REPL 来源:

[CalabashRootView > ... > UIView]                                              
  [UILabel]
  [UIButton] label: "arrow prev"
    [UIImageView] id: "arrow-prev.png"
  [iLobby_iOS_Controls_UIAnimatedButtonView]
  [UILabel] label: "Tell us about yourself",  text: "Tell us about yourself"
  [UILabel] label: "FIRST AND LAST NAME",  text: "FIRST AND LAST NAME"
  [UILabel] label: "*",  text: "*"
  [UITextField]
    [UIImageView]
    [_UITextFieldContentView]
    [UIAccessibilityTextFieldElement]
  [UILabel] label: "COMPANY",  text: "COMPANY"
  [UITextField]
    [UIImageView]
    [_UITextFieldContentView]
    [UIAccessibilityTextFieldElement]

挑战是 select UILabel 旁边的 UITextField 元素

我正在寻找与 xPath 类似的方法。在我的例子中,它看起来像:

//UILabel[@text='FIRST AND LAST NAME']/following::UITextField

有什么想法吗?我们的应用程序是用 Xamarin.iOS 编写的(没有 Xamarin.Forms)。

说明

用 Xamarin.UITest 识别 UI 控件的最佳方法是在应用程序的源代码中为每个控件分配一个唯一标识符。

在Xamarin.iOS中,我们可以在我们应用程序的源代码中分配AccessibilityIdentifier 属性,然后在Xamarin.UITest中使用x => x.Marked引用它。

设置辅助功能标识符,Xamarin.iOS

有几种方法可以在 Xamarin.iOS 中设置 AccessibilityIdentifier

每种方式都实现相同的结果。使用最适合您当前代码库的方法。

对于此示例,我将 UI 标签的 AccessibilityIdentifier 设置为 FirstAndLastNameLabel

1。故事板,Visual Studio (Mac)

2。故事板,Xcode

3。在代码中

var firstAndLastNameLabel = new UILabel
{
    AccessibilityIdentifier = "FirstAndLastNameLabel"
};

引用 Xamarin.UITest

中的唯一标识符

在我们为每个 UI 控件创建了唯一标识符之后,我们可以使用 x => x.Marked;

在 Xamarin.UITest 中引用它
readonly System.Func<Xamarin.UITest.Queries.AppQuery, Xamarin.UITest.Queries.AppQuery> firstAndLastNameLabelQuery = x => x.Marked("FirstAndLastNameLabel");

public string GetFirstAndLastNameLabelText()
{
    var label = app.Query(firstAndLastNameLabelQuery)?.FirstOrDefault();
    return label?.Text ?? string.Empty;
}

附加信息

在Xamarin.UITest

中使用Marked

https://docs.microsoft.com/appcenter/test-cloud/uitest/#using-marked-to-locate-views

AccessibilityIdentifier API

An identifier can be used to uniquely identify an element in the scripts you write using the UI Automation interfaces

https://developer.apple.com/documentation/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier?language=objc