簡體   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