nunit UITest xamarin.forms:如何滚动选择器?

Posted

技术标签:

【中文标题】nunit UITest xamarin.forms:如何滚动选择器?【英文标题】:nunit UITest xamarin.forms: how to scroll a picker? 【发布时间】:2016-06-03 09:51:34 【问题描述】:

我正在尝试为 Xamarin.Forms 项目创建 UITest。在 android 上进行测试。 我尝试使用Xamarin forum 上的一些 inf,但没有成功。

选择器的国家/地区列表:

List<country> countryList = new List<country>(id="GB", name="United Kingdom", id="US", name="United States".... etc);

选择器代码:

        var countryPicker  = new Picker();
        countryPicker.SetBinding(Picker.SelectedIndexProperty, "myIndex");
        countryPicker.BindingContext = getCountry;
        countryPicker.BackgroundColor = Color.White;
        countryPicker.AutomationId = "countryPicker";
        countryPicker.SelectedIndexChanged += ((s, e) =>
            
                    foreach (var element in countryList)
                    
                        if (element.name.Equals(countryPicker.Items[countryPicker.SelectedIndex]))
                        
                            getCountry.myCountry = element.id;
                        
                    
            );

        //adding all the countries to the list
        foreach (var item in countryList)
        
            countryPicker.Items.Add(item.name);

        

单元代码:

app.Query(c=>c.Marked("countryPicker").Invoke("selectValue", "United States"));

答案:查询 Marked("countryPicker").Invoke("selectValue", "United States") 得到 1 个结果。 但是什么都没有发生——选择还没有完成! 我尝试将值选择为“US” - 相同,没有结果。

我错过了什么吗?

【问题讨论】:

我很确定AppQuery.Invoke 会尝试在本机视图上调用方法(所以UIPickViewSpinner)。我猜您需要根据平台更改Invoke 调用,并使用平台选择器支持的任何方法来设置选择。 【参考方案1】:

打开 Xamarin.Form 选择器、选择和测试结果(仅限 Android):

// Open up the picker
app.Tap(x => x.Marked("countryPicker"));

// Try to scroll and find the text item only 5 times
for (int i = 0; i< 5; i++)

    if (app.Query(m => m.Text("United States")).Length == 0)
        app.ScrollDown(x => x.Id("select_dialog_listview"));
else
    
        app.Tap(x => x.Text("United States"));
        break;
    

Assert.IsTrue(app.Query("countryPicker")[0].Text == "United States");

打开 Xamarin.Form 选择器、选择和测试结果(仅限 ios):

/// Open up the picker
app.Tap(x => x.Marked("countryPicker"));

// Assuming a single column picker
var picker = app.Query(x => x.Class(pickerClass).Index(0));
// Try to scroll and find the text item only 5 times
for (int i = 0; i < 5; i++)

    if (app.Query(m => m.Text("United States")).Length == 0)
        app.ScrollDown(x => x.Class("UIPickerTableView").Index(0));
    else
    
        app.Tap(x => x.Text("United States"));
        break;
    

app.Tap(x => x.Class("UIToolbarTextButton"));
Assert.IsTrue(app.Query("countryPicker")[0].Text == "United States");

【讨论】:

感谢 sn-p。看起来滚动命令有问题。启动时,我可以看到滚动尝试如何执行 - 开始滚动但弹回开始位置。但是 ScrollUp 工作正常。会不会是 nUnit lib 问题。我使用 2.6.4.14 版本作为 XamarinUITesting 不支持 nUnit 3.0 什么是“pickerClass”变量值?【参考方案2】:

以下解决方案现在也可用,并且当您的选择器的值超出上面设置的 5 个滚动限制时,它们不会中断。我在这个例子中使用了 NumberPicker,但同样的方法应该适用于 CountryPicker:

if (platform == Platform.iOS) 
    app.Query(x => x.Class("UIPickerView").Invoke("selectRow", 3, "inComponent", 0, "animated", true));

    // This is a hack to move the item so that Xamarin Forms will generate the event to update the UI
    var rect = app.Query(x => x.Class("UIPickerTableView").Index(0).Child()).First().Rect;
    app.DragCoordinates(rect.CenterX, rect.CenterY, rect.CenterX, rect.CenterY + 20);

    app.Tap(c => c.Text("Done"));

else 
    //NOTE: On Android the values appear to be out by one - setting 4 selects the 3rd value.
    var results = app.Query(c => c.Class("numberPicker").Invoke("setValue", 4));
    var text = app.Query("PickerControl")[0].Text;
    app.Tap(c => c.Text(text));

    //You can also do it like this on Android:
    //    app.ScrollDownTo(m => m.Text("White"), x => x.Id("select_dialog_listview"));
    //    app.Tap(x => x.Text("White"));
    //    Assert.IsTrue(app.Query("PickerControl")[0].Text == "White");

您可以在打开选择器后使用这些解决方案。

特别值得注意的是 iOS 上的小“微调” - 如果您使用 selectRow 选择选择器值,则 UI 不会标记为已更新。此 hack 会触发必要的事件并更新 UI。

【讨论】:

当您知道要选择的 index 时,这适用于 iOS。但是如何选择 value -e.g. “英国”?底层 UIPickerView 上似乎没有可用的方法。

以上是关于nunit UITest xamarin.forms:如何滚动选择器?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Form与Xamarin.Android或Xamarin.IOS的区别简述

Visual Studio 中的 xamarin 是不是在 xamarin.form 中提供拖放功能?

Xamarin.Form 蓝牙ble

Xamarin.Form 初学 之 服务引用-WCF服务引用

Xamarin.Form指纹认证

xamarin.form MasterDetailPage