无法确定我的Web应用程序中是否存在某个UITestControl

我目前正在尝试使用C#为Web应用程序自动执行一些编码的UI测试。 我遇到的一个常见问题是,确定页面上是否存在UITestControl对象非常困难。 遗憾的是,微软在其MSDN网站上提供的有关编码UI测试的文档实际上并不存在( 请参阅此处的UITestControl页面 )。

基本上我要问的是:

  • 确定页面上是否存在UITestControl的最佳方法是什么?
  • UITestControl.Exists属性如何工作?
  • UITestControl.Find()方法有什么作用?
  • UITestControl.TryFind()方法如何工作?

我是怎么试图处理它的:

正如我前面提到的,所有这些类和方法的文档大多是空白的。 你可以用来描述任何方法和属性的最多是Intellisense中的1行描述,所以我一直在试验列出的方法。

首先,我尝试检查UITestControl.Exists属性是否为true,但随着时间的推移并咨询其他人使用它的经验,很明显它总是返回true,即使浏览器没有打开。 由于看起来最明显的选项不起作用,我尝试使用UITestControl.Find()方法,但由于它不带任何参数并且什么都不返回,我无法弄清楚它做了什么。 我尝试使用UITestControl.TryFind()方法,偶尔也可以使用,但我发现当我没有在正确的页面上时它似乎只返回false; 否则它总是返回true。 显然我不知道它是如何工作的,不应该用它作为测试。

我想如果我不能得到提供的方法来完成他们的工作,我必须尝试制作自己的工具。 我最近尝试在try / catch块中使用Mouse.Hover(UITestControl)来确定控件是否存在如下:

 public bool DoesExist(UITestControl control){ if(control == null) return false; try{ Mouse.Hover(control); } catch (UITestException) { return false; } return true; } 

它有时会起作用,但在某些情况下,它似乎会因为我不理解的原因而返回误报。 我仍然失明,我几乎没有想法。

我使用的是Visual Studio 2012和Microsoft .NET Framework 4.5.50709版。

关于Find()TryFind()方法的部分答案。

在控件的类实例中设置各种搜索属性后, Find()方法会实际搜索要匹配的控件。 SearchProperties用于尝试查找控件。 如果没有找到控件,则搜索失败 – 忘记确切发生了什么,可能会抛出exception,但文档没有说明。 如果找到一个控件, Find()完成。 如果找到两个或更多,则继续搜索,使用FilterProperties减少找到的控件数量。

Coded UI记录器生成样式代码UIControl aControl = this.UIMap.uione.uitwo.uithree; 这导致了一个问题,即uione如何获得一个指向控件的值,以便uitwo可以被唤醒? 我找到的唯一答案是http://blogs.msdn.com/b/balagans/archive/2009/12/28/9941582.aspx的描述部分,其中说“ 搜索控件的开始(由Find显式查找) ()或通过在行动或财产确认中使用控制而隐含的) “。

因此, Find()执行对控件的搜索,可以显式或隐式调用它。

TryFind()Find()基本相同,只是它返回一个布尔值,指示是否找到了控件。 同样,文档很差,但我相信如果找到一个控件, TryFind()将返回true ,否则返回false

另一个有用的查找方法是FindMatchingControls ,它返回与搜索条件匹配的所有控件的(可能为空)集合。

根据yonitdm的回答,使用BoundingRectangle可以帮助当有多个项目匹配但大多数项目不显示时。 也可以使用TopLeft的值。 执行FindMatchingControls并筛选结果以忽略具有负TopLeft任何内容都可以。

在开发测试时, DrawHighlight方法很有用,它会在控件周围绘制一个矩形。 使用十字准线工具记录断言时绘制的相同类型的矩形。

Coded UI内容索引有很多好的信息。 “UI测试框架如何查找(搜索)控件”链接可能对您特别有用。

我们编写了自己的exists方法,而不是使用obj.Exists(),它使用EnsureClickable()和BoundingRectangle.Width > 0的组合方法来确保控件具有屏幕点。

ETA- oops,抱歉遗漏了重要的一部分。 更新为添加.Width以确保它大于0,如果宽度不知何故,您可能需要使用长度。

我正在使用tryfind()..它工作正常。

 if (obj_webor.GenLink.TryFind()) { logdata.WriteLine(obj_webor.GenInnerText + " Exist !"); } else { logdata.WriteLine(obj_webor.GenInnerText + " Does Not Exist"); } 

之前我使用的是obj_webor.GenLink.exist()..但是如果控件不存在则发出exception并发生exception。 tryfind没问题