编码 UI - 当 IsVisible、Exists、TryGetClickablePoint 等都 return 为真时我看不到控件时,我们如何找到是否存在某些东西?
Coded UI - How do we find if something exists when IsVisible, Exists, TryGetClickablePoint etc all return true when I can't see the control?
我正在测试一个 WPF 应用程序,我不知道它的确切工作原理,但我发现有很多实例需要查找是否显示控件。 Stack Overflow 和 MS 论坛等上关于此的所有传统答案都说使用以下之一...
可见,
存在,
尝试获取可点击点,
状态(例如 OffScreen
问题是对于这个系统,许多控件 return 对于所有这些控件都是正确的,即使控件是看不见的!它们还 return 一个坐标为 (-1, -1, -1, -1) 的点,无论控件是否可见。
我唯一成功的是最后使用 try catch。我尝试单击控件,如果失败,我将进入 catch 块。不过,这需要 60 秒才能超时,而且我遇到间歇性问题 运行 10 次中有 9 次。也许经常使用 try catch 会导致性能问题。
当所有标准方法都失败时,是否有一种方法确实有效?我注意到很多其他提出这些问题的人也在测试 WPF。 WPF 开发人员是否正在做一些事情来隐藏控件,使 CodedUI 认为它们仍然存在并可见等。它们只是在某些东西后面吗?
非常感谢。
解决方案有两个。首先,我必须找到该元素,但我记录的步骤无法正常工作。该元素在被测系统 WPF (XAML) 中埋得太深。其次,我必须证明我已经找到该元素,为此我不能使用 TryGetClickablePoint、Exists、Top 或 Width。 None 似乎完全适合我的元素。我不得不使用状态。
public void Assert_MyElementShown()
{
#region Variable Declarations
WpfCustom uISurfaceCustom = this.UISysUnderTestClientShWindow.UIItemCustom1.UISurfaceCustom;
WpfCustom uIYAxisLabelsCustom = new WpfCustom();
#endregion
//Find the Element using it's Container and SearchProperties
uIYAxisLabelsCustom.Container = uISurfaceCustom;
uIYAxisLabelsCustom.SearchProperties[WpfControl.PropertyNames.ClassName] = "Uia.AxisLabelControl";
uIYAxisLabelsCustom.SearchProperties[WpfControl.PropertyNames.AutomationId] = "YAxisLabels";
//Use the State to find if it's on screen or not
var state = uIYAxisLabelsCustom.State;
if (state == Microsoft.VisualStudio.TestTools.UITest.Extension.ControlStates.Default)
{
//Element is visible, do stuff here!
}
else if (state == Microsoft.VisualStudio.TestTools.UITest.Extension.ControlStates.Offscreen)
{
//The control may exist, it may have location on screen and may even
//appear to be clickable according to coded ui framework but is is NOT
//shown on the screen.
}
}
您可以为您的应用程序尝试这种方法..如果控件属性显示为 true 比我们可以选择高度和 width.Means 如果控件在 UI 中不可见,但仍然全部属性显示为 true 而不是检查控件高度和宽度必须在 -ve number.Than 中,我们可以保持像
这样的断言
如果control.height<0
在 UI
中不可见
我正在测试一个 WPF 应用程序,我不知道它的确切工作原理,但我发现有很多实例需要查找是否显示控件。 Stack Overflow 和 MS 论坛等上关于此的所有传统答案都说使用以下之一...
可见, 存在, 尝试获取可点击点, 状态(例如 OffScreen
问题是对于这个系统,许多控件 return 对于所有这些控件都是正确的,即使控件是看不见的!它们还 return 一个坐标为 (-1, -1, -1, -1) 的点,无论控件是否可见。
我唯一成功的是最后使用 try catch。我尝试单击控件,如果失败,我将进入 catch 块。不过,这需要 60 秒才能超时,而且我遇到间歇性问题 运行 10 次中有 9 次。也许经常使用 try catch 会导致性能问题。
当所有标准方法都失败时,是否有一种方法确实有效?我注意到很多其他提出这些问题的人也在测试 WPF。 WPF 开发人员是否正在做一些事情来隐藏控件,使 CodedUI 认为它们仍然存在并可见等。它们只是在某些东西后面吗?
非常感谢。
解决方案有两个。首先,我必须找到该元素,但我记录的步骤无法正常工作。该元素在被测系统 WPF (XAML) 中埋得太深。其次,我必须证明我已经找到该元素,为此我不能使用 TryGetClickablePoint、Exists、Top 或 Width。 None 似乎完全适合我的元素。我不得不使用状态。
public void Assert_MyElementShown()
{
#region Variable Declarations
WpfCustom uISurfaceCustom = this.UISysUnderTestClientShWindow.UIItemCustom1.UISurfaceCustom;
WpfCustom uIYAxisLabelsCustom = new WpfCustom();
#endregion
//Find the Element using it's Container and SearchProperties
uIYAxisLabelsCustom.Container = uISurfaceCustom;
uIYAxisLabelsCustom.SearchProperties[WpfControl.PropertyNames.ClassName] = "Uia.AxisLabelControl";
uIYAxisLabelsCustom.SearchProperties[WpfControl.PropertyNames.AutomationId] = "YAxisLabels";
//Use the State to find if it's on screen or not
var state = uIYAxisLabelsCustom.State;
if (state == Microsoft.VisualStudio.TestTools.UITest.Extension.ControlStates.Default)
{
//Element is visible, do stuff here!
}
else if (state == Microsoft.VisualStudio.TestTools.UITest.Extension.ControlStates.Offscreen)
{
//The control may exist, it may have location on screen and may even
//appear to be clickable according to coded ui framework but is is NOT
//shown on the screen.
}
}
您可以为您的应用程序尝试这种方法..如果控件属性显示为 true 比我们可以选择高度和 width.Means 如果控件在 UI 中不可见,但仍然全部属性显示为 true 而不是检查控件高度和宽度必须在 -ve number.Than 中,我们可以保持像
这样的断言如果control.height<0 在 UI
中不可见