我在Xamarin UI测试中发现了非常奇怪的行为。问题是 - framework
无法点击某些标记的元素。这个绝对随机的问题。问题可能出现在物理设备或模拟器,Android或iOS上。旧的或新的OS系统。我的测试场景:
app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
try
{
app.WaitForElement(x => x.Marked("Filter"));
app.Tap(x => x.Marked("Filter"));
}
catch (Exception)
{
try
{
app.Tap(x => x.Marked("Button.Home"));
app.Tap(x => x.Marked("IDTransHistory"));
}
catch (Exception)
{
try
{
app.Tap(x => x.Marked("Button.Home"));
app.Tap(x => x.Marked("IDTransHistory"));
}
catch (Exception)
{
app.Tap(x => x.Marked("Button.Home"));
app.Tap(x => x.Marked("IDTransHistory"));
}
}
}
VS Log:
[5/18/2018 12:57:16 PM Informational] ------ Run test started ------
[5/18/2018 12:57:16 PM Informational] NUnit VS Adapter 2.0.0.0 executing tests is started
...
[5/18/2018 12:57:56 PM Informational] Waiting for element matching Marked("IDTransHistory").
[5/18/2018 12:58:03 PM Informational] Using element matching Marked("IDTransHistory").
[5/18/2018 12:58:04 PM Informational] Tapping coordinates [ 532, 1114 ].
[5/18/2018 12:58:05 PM Informational] Waiting for element matching Marked("Filter").
[5/18/2018 12:58:08 PM Informational] Using element matching Marked("Filter").
[5/18/2018 12:58:08 PM Informational] Tapping coordinates [ 684, 96 ].
[5/18/2018 12:58:24 PM Informational] Error while performing Tap(Marked("Date.Start"))
Exception: System.Exception: Unable to find element. Query for Marked("Date.Start") gave no results.
at Xamarin.UITest.SharedApp.FirstWithLog[T](T[] results, ITokenContainer tokenContainer)
at Xamarin.UITest.Android.AndroidApp.<Tap>c__AnonStoreyB.<>m__0()
at Xamarin.UITest.Utils.ErrorReporting.With(Action func, Object[] args, String memberName)
[5/18/2018 12:58:24 PM Informational] Waiting for element matching Marked("Filter").
[5/18/2018 12:58:28 PM Informational] Using element matching Marked("Filter").
[5/18/2018 12:58:28 PM Informational] Tapping coordinates [ 684, 96 ].
[5/18/2018 12:58:32 PM Informational] Using element matching Marked("Date.Start").
[5/18/2018 12:58:32 PM Informational] Tapping coordinates [ 71, 298 ].
[5/18/2018 12:58:35 PM Informational] Using element matching Text("2018").
[5/18/2018 12:58:35 PM Informational] Tapping coordinates [ 139, 228 ].
好的,正如您可以看到标记为Filter
的元素正在使用 - &gt;攻丝坐标[684,96]。这意味着该元素存在于监视器上。但第一次这不起作用。我使用Nunit 3.10和Xamarin UI Test 2.24。这个问题可能出现在随机设备 - iOS或Android,仿真器或物理设备上。目前的测试是在三星sm a310f。我不知道这是Xamarin UI测试的错误还是可能是Calabash。
UPD:
代码 -
app.ScrollDownTo(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Filter"));
app.Tap(x => x.Marked("Filter"));
app.WaitForElement(x=>x.Marked("Date.Start"));
app.Tap(x => x.Marked("Date.Start"));
记录 -
[5/21/2018 3:05:00 PM Informational] Skipping installation: Already installed.
----
[5/21/2018 3:05:34 PM Informational] Scrolling down to Marked("IDTransHistory")
[5/21/2018 3:05:37 PM Informational] Using element matching Marked("IDTransHistory").
[5/21/2018 3:05:37 PM Informational] Tapping coordinates [ 533, 1114 ].
[5/21/2018 3:05:38 PM Informational] Waiting for element matching Marked("Filter").
[5/21/2018 3:05:40 PM Informational] Using element matching Marked("Filter").
[5/21/2018 3:05:40 PM Informational] Tapping coordinates [ 684, 96 ].
[5/21/2018 3:05:41 PM Informational] Waiting for element matching Marked("Date.Start").
[5/21/2018 3:05:56 PM Informational] Error while performing WaitForElement(Marked("Date.Start"), "Timed out waiting for element...", null, null, null)
Exception: System.TimeoutException: Timed out waiting for element...
at Xamarin.UITest.Shared.WaitForHelper.WaitForAny[T](Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout)
at Xamarin.UITest.Android.AndroidApp.<WaitForElement>c__AnonStorey31.<>m__0()
at Xamarin.UITest.Utils.ErrorReporting.With[T](Func`1 func, Object[] args, String memberName)
[5/21/2018 3:05:57 PM Informational] Query for * gave 46 results.
[5/21/2018 3:05:57 PM Informational] [
{
答案 0 :(得分:0)
UITest测试的正常做法是在执行手势后等待某个已定义的状态 - 所以我建议在每次点击后添加一个等待命令。
例如,我将您的示例编码为:
app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Button.Home"));
app.Tap(x => x.Marked("Button.Home"));
app.WaitForElement(x => x.Marked("IDTransHistory"));
app.Tap(x => x.Marked("IDTransHistory"));
这样,您在尝试按下它之前等待元素出现在屏幕上(某些设备这比其他设备更重要,因为屏幕转换动画可能需要一些时间) - 也可能是当元素尚未准备好接收手势时,元素标记为有坐标 - 所以如果上述方法无效,您可以尝试在Thread.Sleep
之前添加Tap
给予UI时间准备就绪 - 这可能有助于稳定您的测试。
如果有必要 - 你最终会得到类似这样的测试代码:
app.WaitForElement(x => x.Marked("IDTransHistory"));
Thread.Sleep(500);
app.Tap(x => x.Marked("IDTransHistory"));
app.WaitForElement(x => x.Marked("Button.Home"));
Thread.Sleep(500);
app.Tap(x => x.Marked("Button.Home"));
app.WaitForElement(x => x.Marked("IDTransHistory"));
Thread.Sleep(500);
app.Tap(x => x.Marked("IDTransHistory"));
我建议从睡眠500开始,以500为增量将其提高,直到测试变得稳定。
如果所有其他方法都失败了 - 我会使用Repl
来调查此问题 - 可能是因为某些内容阻止了此操作。
值得注意的是(尽管根据您的描述,这不是您的问题),在iOS 11中 - Apple对元素的方式(或不是)进行了一些更改Marked
所以一些以前工作的测试可能会停止工作,因为UI不再以同样的方式将它们识别为Marked
。解决此问题的最佳方法是再次使用Repl
查询应用程序。
答案 1 :(得分:0)
运行app.Repl();
并输入tree。您会找到UI可见代码列表,尝试将您的代码一次。如果它工作正常,否则请使用Class和类名,而不要使用UI上的标有Marked的文本。
例如:-
app.Tap( a => a.Class("classs-name"));
// //如果您使用了相同的类名,则将索引用作app.Tap( a => a.Class("classs-name").index(value));
答案 2 :(得分:0)
从文档中: https://docs.microsoft.com/en-us/appcenter/test-cloud/uitest/
Xamarin.UITest需要NUnit 2.6.3或2.6.4才能运行测试。 Xamarin.UITest与NUnit 3.x不兼容。
那可能是你的问题。
我还将检查是否:
点击“过滤器”-不会引起任何布局更改(动画 例如)->在这种情况下,暂停可能会有所帮助。
将元素ID从“ Date.Start”更改为没有 点(。),例如“ StartDate”
答案 3 :(得分:0)
我在使用 ipod touch 模拟器时遇到了这个问题,当我切换到 iPhone 模拟器时,它按预期工作