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

时间:2018-08-23 12:36:09

标签: xamarin.forms google-play

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

Google Play可以输入“用户名资源名称”,“密码资源名称”和“登录按钮资源名称”。我为每个控件(txtEmailtxtPassbtnSignIn)提供了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" />

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我最近也遇到了同样的问题。我提交了一个Alpha版本,启用了启动前报告,并收到一条违反政策的错误,说未提供登录凭据。正如问题中所述,我应该提供资源名称以及测试凭证,但是如何在Xamarin.Forms项目中实现它并不清楚。不过,我能够使用渲染器解决该问题。我知道,创建一个单独的渲染器和一个仅用于设置id的控件有点极端,但是我真的不想大幅更改UI,因此,我创建了3个空控件:

public class UsernameEntry : Entry { }
public class PasswordEntry : Entry { }
public class LoginButton : Button { }

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

然后我将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>

最后,我在原生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;
            }
        }
    }
}

这不是完美的方法,但就我而言,它效果很好。我不需要彻底更改UI或引入一些隐藏的UI元素。希望这会对遇到类似问题的人有所帮助。

答案 1 :(得分:0)

受Yehor的回答启发,我能够提出一种使用Xamarin Effects而不使用自定义控件的解决方案。

首先将ids.xml文件添加到Android项目(Resource / values / ids.xml)中,并添加3个id,每个控件一个。确保将Build操作设置为AndroidResource并将Custom Tool设置为MSBuild:UpdateGeneratedFiles,以便可以自动生成以下样式的C#文件:

<?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>

然后定义一个枚举,以便可以轻松定义效果:

public enum CustomIdType
{
    None,
    Username,
    Password,
    LoginButton
}

对于Android自定义渲染器,请执行以下操作根据自定义效果分配android ID。

[assembly: ResolutionGroupName("CustomRendererHandler")]
[assembly: ExportEffect(typeof(AndroidCustomIdEffect), "CustomIdEffect")]
namespace YOUR_ANDROID_NAMESPACE
{
    public class AndroidCustomIdEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            // get autofill effect
            var effect = (CustomIdEffect)Element.Effects
                .FirstOrDefault(e => e is CustomIdEffect);

            // assign android ID if custom ID effect is not null
            if (effect != null) {
                switch (effect.Type) {
                    case CustomIdType.Username:
                        Control.Id = Resource.Id.username_entry;
                        break;
                    case CustomIdType.Password:
                        Control.Id = Resource.Id.password_entry;
                        break;
                    case CustomIdType.LoginButton:
                        Control.Id = Resource.Id.login_button;
                        break;
                }
            }
        }
        
        protected override void OnDetached()
        {
        }
    }
}

然后在共享代码中定义一个路由效果以使用Android自定义渲染器:

public class CustomIdEffect : RoutingEffect
{
    public CustomIdType Type { get; set; }

    public CustomIdEffect() : base("CustomRendererHandler." + nameof(CustomIdEffect))
    {
    }
}

最后,要在登录页面中使用效果,只需将效果添加到XAML中的控件中即可:

<Entry PlaceHolder="Enter Username">
    <Entry.Effects>
        <local:CustomIdEffect Type="Username"/>
    </Entry.Effects>
</Entry>

<Entry PlaceHolder="Enter Password">
    <Entry.Effects>
        <local:CustomIdEffect Type="Password"/>
    </Entry.Effects>
</Entry>

<Button Text="Login">
    <Button.Effects>
        <local:CustomIdEffect Type="LoginButton"/>
    </Button.Effects>
</Button>

在此之后,如果您提供正确的登录凭据,则Google Pre-launch Report应该能够通过登录屏幕。