如何在Google地图上单击Xamarin UITest的标记

问题描述 投票:0回答:3

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

google-maps user-interface testing xamarin
3个回答
0
投票

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

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

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

简短的答案是,Android上的Google Maps并不是真的以可自动化的方式公开对象,因此,第二好的选择是后门。


1
投票

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

假设标记位于地图的中心,您可以使用类似这样的内容来点击它:

(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)

但是我认为您可以在地图本身中完成所有操作。


0
投票

如果您有用于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;
            }



        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.