C# Can';t确定我的web应用中是否存在某个UITestControl

C# Can';t确定我的web应用中是否存在某个UITestControl,c#,web-applications,visual-studio-2012,coded-ui-tests,C#,Web Applications,Visual Studio 2012,Coded Ui Tests,我目前正在尝试使用C#为web应用程序自动化一些编码的UI测试。我经常遇到的一个问题是,很难确定页面上是否存在UITestControl对象。不幸的是,微软在其MSDN网站上关于编码UI测试的任何文档实际上都是不存在的() 基本上我要问的是: 确定页面上是否存在UITestControl的最佳方法是什么 UITestControl.Exists属性如何工作 UITestControl.Find()方法的作用是什么 UITestControl.TryFind()方法是如何工作的 我是如何处理的

我目前正在尝试使用C#为web应用程序自动化一些编码的UI测试。我经常遇到的一个问题是,很难确定页面上是否存在
UITestControl
对象。不幸的是,微软在其MSDN网站上关于编码UI测试的任何文档实际上都是不存在的()

基本上我要问的是:

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

正如我前面提到的,关于所有这些类和方法的文档大多是空白的。在Intellisense中,描述任何方法和属性最多只能得到一行描述,因此我一直在尝试列出的方法

首先,我尝试检查
UITestControl.Exists
属性是否为true,但随着时间的推移,并参考其他人的经验,很明显,即使浏览器未打开,它也会返回true。由于最明显的选项不起作用,我尝试使用
UITestControl.Find()
方法,但由于它不带参数,也不返回任何内容,所以我无法理解它的作用。我尝试使用
UITestControl.TryFind()
方法,偶尔它也会起作用,但我发现只有当我不在正确的页面上时,它才会返回false;否则它总是返回真的。很明显,我不知道它是如何工作的,不应该把它作为一个测试

我想如果我不能得到提供的方法来完成他们的工作,我就必须尝试自己制作工具。我最近尝试在try/catch块中使用
鼠标悬停(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
用于尝试查找控件。如果找不到任何控件,则搜索将失败-完全忘记发生了什么,可能会引发异常,但文档没有说明这一点。如果找到一个控件,则
Find()
完成。如果找到两个或多个控件,则继续搜索,方法是使用
filterproperty
将找到的控件数减少为一个

编码的UI记录器生成样式为
UIControl aControl=this.UIMap.uione.uitwo.uithree的代码
这导致了一个问题,
uione
如何获取引用控件的值,从而可以计算
uitwo
?我找到的唯一答案是在描述部分,其中说“开始搜索控件(通过Find()显式搜索,或通过在操作或属性验证中使用控件隐式搜索)”

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

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

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

根据yonitdm的回答,当有多个项目匹配但大多数项目未显示时,使用
边框可以有所帮助。也可以使用
Top
Left
的值。执行
FindMatchingControls
并筛选结果以忽略顶部为负的
或左侧为负的
可能会起作用

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


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

我们没有使用obj.Exists()而是编写了自己的Exists方法,该方法使用and>0的组合方法来确保控件有一个屏幕点

埃塔-哎呀,对不起,遗漏了一个重要的部分。更新为add.Width以确保其大于0,如果Width不起作用,则可能需要使用length。

我正在使用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()。。但如果控件不存在且发生异常,则is将给出错误。tryfind还可以

非常感谢,对于这4个问题中的任何一个,即使是部分答案,我们都将不胜感激。
TryFind()
Find()
的一个问题是很难辨别它是如何与程序生成的元素交互的,从我有限的理解来看,它似乎经常无法找到存在的元素,并成功地找到已经停止存在或从未存在过的元素。哈哈,我也在尝试写我自己的。坏消息,
EnsureClickable()
顺利通过,以及
BoundingRectangle