Xamarin自动登录凭据用于Google Play的发布前报告

Eri*_*ric 5 google-play xamarin.forms

我正在Visual Studio 2017中使用Xamarin Forms 3构建Android应用程序并将其发布到Google Play。Google Play提供了自动测试功能(发布前的报告),但无法通过我的登录屏幕。

Google Play可以输入“用户名资源名称”,“密码资源名称”和“登录按钮资源名称”。我为每个控件(txtEmail,txtPass和btnSignIn)都提供了Xamarin x:name ,但是显然这是不正确的,因为自动测试仪仍然无法进入并且甚至没有尝试。

这是我的SignIn.xaml:

<Entry x:Name="txtEmail" Placeholder="email address" Keyboard="Email" />
<Entry x:Name="txtPass" IsPassword="True" />
<Button x:Name="btnSignIn" Text="Sign In" Clicked="OnSignInClicked" />
Run Code Online (Sandbox Code Playgroud)

我已经找到了这些SO问题(在这里,here和Here),但是它们并没有在Xamarin Forms上下文中解决我的问题。第一个链接似乎特别有用,但我不知道将XML代码放在哪里。

在我看来,Xamarin / C#被“编译”为Android代码并生成这些XML文件。我该如何处理?

我了解.APK文件只是一个ZIP文件。将发送到Google Play的APK文件重命名为.zip,我可以浏览内容,但是看不到任何有意义的XML代码。

目前,我添加了一个额外的“演示”按钮,单击后会将用户名和密码放入字段中,然后单击“登录”按钮。Google的自动化测试仪喜欢这种方法并且可以使用,但是对于人工测试来说这是一个糟糕的主意,我想删除这种解决方法。

Yeh*_*kyi 3

我最近遇到了同样的问题。我提交了 alpha 版本,启用了预发布报告,并收到了策略违规错误,指出未提供登录凭据。正如问题中所述,我应该提供资源名称以及测试凭据,但如何在 Xamarin.Forms 项目中执行此操作并不明显。尽管如此,我还是能够使用渲染器来解决这个问题。我知道,创建一个单独的渲染器和一个控件只是为了设置 id 有点极端,但我真的不想显着改变 UI,所以,我创建了 3 个空控件:

public class UsernameEntry : Entry { }
public class PasswordEntry : Entry { }
public class LoginButton : Button { }
Run Code Online (Sandbox Code Playgroud)

并在登录屏幕上的相应位置使用它们,而不是简单的条目和按钮。

然后我将ids.xml文件添加到 Android 项目 ( Resource/values/ids.xml ) 并添加 3 个 id,每个控件一个:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item name="username_entry" type="id"/>
  <item name="password_entry" type="id"/>
  <item name="login_button" type="id"/>
</resources>
Run Code Online (Sandbox Code Playgroud)

最后,我在原生 Android 项目中创建了 3 个渲染器,每个控件一个。例如,外观如下UsernameEntryRenderer:

[assembly: ExportRenderer(typeof(UsernameEntry), typeof(UsernameEntryRenderer))]
namespace Android.Renderers
{
    public class UsernameEntryRenderer : EntryRenderer
    {
        public UsernameEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                // here I can reference the id created previously in ids.xml file
                // and set the native android id property
                Control.Id = Resource.Id.username_entry;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是完美的方法,但对我来说效果很好。我不需要大幅改变 UI 或引入一些隐藏的 UI 元素。希望这对面临类似问题的人有所帮助。