使用 REPL
创建 Xamarin.UITests 的一个重要工具是 rePL (read-eval-print-loop) 。 REPL 是一个类似控制台的环境,可在其中动态试验 UITest 表达式。 REPL 评估它们,在应用中实时运行它们,并记录详细输出。 表达式可以从 REPL 工具复制,并直接在 UITest 项目中使用。
启动 REPL
REPL 只能通过运行调用 方法的测试来 IApp.Repl() 启动:
[TestFixture]
public class Tests
{
AndroidApp app;
[SetUp]
public void BeforeEachTest()
{
app = ConfigureApp.Android.StartApp();
}
[Test]
public void CreditCardNumber_TooShort_DisplayErrorMessage()
{
app.Repl();
}
}
运行并调用测试时 .Repl() ,Xamarin.UITest 将停止测试,并启动终端窗口中的 REPL:
提示
如果 macOS 上未显示 REPL 窗口,请转到"系统首选项">"安全"&"隐私">"隐私 > 自动化",搜索 "Visual Studio",并确保 选中"终端"。 然后尝试再次启动它。
有三种方法可以退出 REPL:
- 按 Ctrl-C
- 键入 退出
- 键入 退出
REPL 关闭时,Xamarin.UITest 将继续执行测试的其余部分。
使用 REPL
REPL 提供 的实例 IApp ,该实例允许与应用程序交互。 REPL 还提供了两个用于创建 Xamarin.UITests 的命令: tree 命令和 copy 命令。
常见工作流是使用 命令或 来识别屏幕上的视图,并 tree IApp.Flash 获取有关这些视图的元数据。 该信息用于创建和 AppQueries 激增将形成测试的步骤。 然后,可以使用 命令将工作复制到剪贴板, copy 以便将其粘贴到测试中。
使用树命令发现视图
tree该命令将显示屏幕上可见的视图的分层列表:
使用 IApp.Flash 发现视图
许多 Xamarin.UITest API 方法接受 AppQuery 对象以查找屏幕上的视图。 IApp.Flash()方法有助于在 REPL 中测试这些查询。 IApp.Flash() 会通过使查询结果闪烁来突出显示查询结果,并返回有关结果中视图的一些详细信息。
例如,以下代码片段演示如何查找 Android 活动上可见的 EditText 所有视图:
>>> app.Flash(c=>c.Class("EditText"))
Flashing query for Class("EditText") gave 1 results.
[
{
"Id": "creditCardNumberText",
"Description": "android.widget.EditText{528165e4 VFED..CL .F...... 139,70-941,178 #7f050001 app:id/creditCardNumberText}",
"Rect": {
"Width": 802.0,
"Height": 108.0,
"X": 139.0,
"Y": 274.0,
"CenterX": 540.0,
"CenterY": 328.0
},
"Label": null,
"Text": "",
"Class": "android.widget.EditText",
"Enabled": true
}
]
我们可以使用 Flash 方法帮助创建 AppQuery ,以与其他 API 一起使用来生成测试。
在测试中创建步骤
让我们看看如何使用 REPL 在测试中快速创建和尝试各个步骤。
例如,可以使用上述命令 tree 的结果。 如果需要测试在 中输入 ID 为 EditText creditCardNumberText的文本,它可以使用 IApp.EnterText 方法:
>>> app.EnterText(c=>c.Marked("creditCardNumberText"), "1234567890123456")
Using element matching Marked("creditCardNumberText").
Tapping coordinates [ 540, 328 ].
同样,如果测试需要模拟用户点击按钮,可以使用 IApp.Tap 方法:
>>> app.Tap(c=>c.Marked("validateButton"))
Using element matching Marked("validateButton").
Tapping coordinates [ 540, 533 ].
使用 copy 命令
复制将保留在会话期间输入的命令的历史记录。 此 copy 命令将历史记录添加到剪贴板,以便可以将其粘贴到应用中:
>>> copy
Copying history to clipboard.


