繁体   English   中英

如何在谷歌地图上点击 Xamarin UITest 的标记

[英]How to click on a marker on the google map for Xamarin UITest

我为 Android 应用程序编写了 Xamarin UITest。 在应用程序中使用谷歌地图。 请帮帮我,如何点击地图上的标记?

标记未显示在视图树中,我的猜测是它们是在地图框架布局内的屏幕上绘制的。

鉴于标记位于地图的中心,您可以使用以下内容点击它:

(带有 ID 为“map”的地图片段)

var map = app.Query("map")
var middleX = (map.First().Rect.Width + map.First().Rect.X) / 2
var middleY = (map.First().Rect.Height + map.First().Rect.Y) / 2
app.TapCoordinates(middleX, middleY)

但我认为这就是你在地图中所能做的。

如果您自己构建应用程序,我建议您查看后门方法。 这些方法可以构建到应用程序中,然后从测试中调用。

Obj-C 和 Java 应用程序有很多示例。 这是 C# 后门方法的示例,您可以将其放入 MainActivity 或 AppDelegate 类: http : //danatxamarin.com/2015/05/07/configuring-backdoor-methods-in-c-for-xamarin-test -云/

我会创建一个后门来返回你需要的关于地图的任何数据,然后使用app.Invoke("myNewMethod"); 这将返回一个字符串(可能是 json)。 此字符串可以包含屏幕坐标,然后您可以将其传递给app.TapCoordinates(x, y); .

简短的回答是,Android 上的 Google 地图并没有真正以可自动化的方式公开对象,因此第二个最佳选择是后门。

如果你有一个自定义的 android 渲染器,你可以在里面模拟点击,主要的技巧是访问渲染器内的标记:

var field = this.GetType().BaseType.GetField("_markers", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
var markers = (List<Marker>)field.GetValue(this);

现在对于markers任何元素,因为您无法发送真正的点击,您可以模拟它。 粘贴来自我的实时项目的代码:

  protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == "ExternalClickedPin")
        {
            if (FormsControl.ExternalClickedPin != null)
            {
                var pin = Map.Pins.FirstOrDefault(x => x.MarkerId == FormsControl.ExternalClickedPin.MarkerId);
                if (pin != null)
                {
                    var field = this.GetType().BaseType.GetField("_markers", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

                    var hiddenMarkers = (List<Marker>)field.GetValue(this);

                    var marker = hiddenMarkers.FirstOrDefault(x => x.Id == pin.MarkerId.ToString());
                    if (marker != null)
                    {
                        //simulating click
                        //1 invoke clicked event
                        // pin.SendMarkerClick(); // <- if needed for tests
                        //2 show info on map
                        marker.ShowInfoWindow(); //just what i was needing
                        //3 center pin on map
                        //Map.MoveToRegion(...); <- not here, im calling this from Forms subclassed control
                    }

                }
                FormsControl.ExternalClickedPin = null;
            }



        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM