测试记录器和 Xamarin 表单 - ID 不适用于 UITest

Posted

技术标签:

【中文标题】测试记录器和 Xamarin 表单 - ID 不适用于 UITest【英文标题】:Test Recorder and Xamarin Forms - Id not available for UITest 【发布时间】:2015-12-10 21:55:55 【问题描述】:

我一直在尝试针对使用 Xamarin Forms 创建的 androidios 应用运行测试记录器。当我单击测试记录器中的控件时,我没有看到放置在生成的 C# 文件中的 Id,只有类类型。

我决定从等式中删除测试记录器,并尝试让基本的 UI 测试针对 Xamarin Forms Android 应用运行。

我从这里下载了一个演示应用程序:

https://developer.xamarin.com/samples/xamarin-forms/UsingUITest/

它应该有所有的东西来正确处理 UITest,包括 StyleIds 和 MainActivity 中用于将 StyleIds 映射到 ContentDescriptions 的代码。

我在 REPL 终端会话中运行 tree 来检查屏幕层次结构,它似乎没有显示应该拥有它们的控件的 id。

>>> tree
[[object CalabashRootView] > PhoneWindow$DecorView]
  [ActionBarOverlayLayout] id: "decor_content_parent"
    [FrameLayout > ... > Platform_DefaultRenderer] id: "content"
      [ButtonRenderer]
        [Button] label: "MyButton",  text: "Click me"
      [LabelRenderer]
        [FormsTextView] label: "MyLabel",  text: "Hello, Xamarin.Forms!"
  [View] id: "navigationBarBackground"
  [View] id: "statusBarBackground"
>>>

有什么想法吗?

【问题讨论】:

StyleId 在该输出中...看到“MyButton”和“MyLabel”了吗?这些是 StyleId 值。您是否尝试过运行选择器以查看是否可以从中进行选择? 感谢 Dylan - 我可以在输出中看到 MyButton 的 StyleId 已转换为 MyButton 的标签。进一步挖掘后,我看到 StyleId 被转换为 iOS 的 AccessibilityIdentifier 和 Android 的 ContentDescription,我猜这些都是作为标签出现的。我的问题是,虽然我可以通过编程方式访问这些,但当我单击控件时,TestRecorder 不会生成 .Marked()。 【参考方案1】:

在 Xamarin Forms 中,StyleId 本质上只是一个占位符,用于转移到本机计数器部分。

对于 Android,请确保您在 MainActivity.cs 中有这个

Xamarin.Forms.Forms.ViewInitialized += (object sender, Xamarin.Forms.ViewInitializedEventArgs e) => 
                if (!string.IsNullOrWhiteSpace(e.View.StyleId))
                
                    e.NativeView.ContentDescription = e.View.StyleId;
                
            ;

在 iOS 中这样做

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        
            global::Xamarin.Forms.Forms.Init();

            Forms.ViewInitialized += (object sender, ViewInitializedEventArgs e) => 
                if (null != e.View.StyleId)
                
                    e.NativeView.AccessibilityIdentifier = e.View.StyleId;
                
            ;

            LoadApplication(new App());

#if ENABLE_TEST_CLOUD
// requires Xamarin Test Cloud Agent
Xamarin.Calabash.Start();
#endif

            return base.FinishedLaunching(app, options);
        

然后您应该开始看到您的 Id 为您的 Xamarin 表单元素提供。

【讨论】:

我在 MainActivity 中有你提到的代码,我很高兴正在生成本机计数器部分。然而,测试记录器似乎无法识别这些,并且不会为带有 StyleId 的控件生成 .Marked,但仅用于按钮,甚至使用按钮标题 你是说按钮的 ID 没有通过,但其他元素还可以吗? StyleId 不会转换为 Id,而是转换为 iOS 的 AccessibilityIdentifier 和 Android 的 ContentDescription。测试记录器应该识别这些并为它们生成一个 .Marked 但不会。它确实为按钮生成 .Marked,但使用按钮标题而不是 StyleId 是的,这就是我对 Id 的意思(StyleId 没有出现)。对我来说,除了它是一个预览工具,我什么都看不到,而且你很可能遇到了一个错误。如果您可以在标准 UITests 中执行 REPL 并查看所有 StyleId,那么您将需要联系 Xamarin 的某个人。我只是想看看你需要联系谁。虽然它在旧金山的下午,可能要到明天才能得到回复。 forums.xamarin.com/categories/xamarin-test-cloud 将是您的最佳选择。 TestCloud 团队的人会看到它并查看它。我对测试记录器也不是很熟悉,所以我们可能忽略了一些明显的东西。

以上是关于测试记录器和 Xamarin 表单 - ID 不适用于 UITest的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 的 xamarin 表单中创建渐变按钮背景

GCM 推送通知不适用于 xamarin android

绑定 xamarin 表单选择器值的正确方法

Xamarin Mono ClientWebSocket 实现不适用于安全套接字

如何在 Xamarin 表单中实现分页

Xamarin Forms 上的 UITest 将 StyleId 写为标签而不是 ID