2015-01-12 64 views
0

所以,我已经走了,使用的代码生成器在Visual Studio中生成编码的UI测试。我们有一个TreeList的wpf应用程序。我将它记录到第一个框中,输入一个值,然后单击第二个框,然后键入一个新值。没什么超级花式。录制CodedUI找不到记录控制

public void RecordedMethod1() 
{ 
    #region Variable Declarations 
    WpfCell uIItemCell = this.UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTreeListTree.UIEntityTesterTreeListTreeItem.UIItemCell; 
    WpfEdit uIInvoice1InvoiceIDEdiEdit = this.UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTreeListTree.UIEntityTesterTreeListTreeItem.UIItemCell.UIInvoice1InvoiceIDEdiEdit; 
    WpfCell uIItemCell1 = this.UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTreeListTree.UIEntityTesterTreeListTreeItem.UIItemCell1; 
    WpfEdit uI_localTextBoxEdit = this.UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTreeListTree.UIEntityTesterTreeListTreeItem.UIItemCell11.UI_localTextBoxEdit; 
    #endregion 

    // Click cell 
    Mouse.Click(uIItemCell, new Point(92, 18)); 

    // Type '1' in 'Invoice:1/InvoiceID|Editor' text box 
    uIInvoice1InvoiceIDEdiEdit.Text = this.RecordedMethod1Params.UIInvoice1InvoiceIDEdiEditText; 

    // Click cell 
    Mouse.Click(uIItemCell1, new Point(136, 9)); 

    // Type '2/1/2012' in '_localTextBox' text box 
    uI_localTextBoxEdit.Text = this.RecordedMethod1Params.UI_localTextBoxEditText; 
} 

#region Properties 
public virtual RecordedMethod1Params RecordedMethod1Params 
{ 
    get 
    { 
     if ((this.mRecordedMethod1Params == null)) 
     { 
      this.mRecordedMethod1Params = new RecordedMethod1Params(); 
     } 
     return this.mRecordedMethod1Params; 
    } 
} 

它与第一Mouse.Click()这个错误崩溃叫

Microsoft.VisualStudio.TestTools.UITest.Extension.UITestControlNotFoundException was unhandled by user code 
HResult=-268111872 
Message=The playback failed to find the control with the given search properties. Additional Details: 
TechnologyName: 'UIA' 
FrameworkId: 'Wpf' 
ControlType: 'Custom' 
ClassName: 'Uia.EntityTesterControl' 
AutomationId: 'EntityTesterControl' 
Search may have failed at 'Test Suite Tools' Custom as it may have virtualized children. If the control being searched is descendant of 'Test Suite Tools' Custom then including it as the parent container may solve the problem. 
Source=Microsoft.VisualStudio.TestTools.UITesting 
BasicMessage=The playback failed to find the control with the given search properties. 
RootElement="" 
StackTrace: 
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapControlNotFoundException(COMException ex, IPlaybackContext context) 
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowComException(COMException innerException, IPlaybackContext context) 
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, IPlaybackContext context) 
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, String queryId) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String queryId, Int32 maxDepth, Int32& timeLeft) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean useCache, Boolean alwaysSearch, ISearchArgument searchArg, IList`1 windowTitles, Int32& timeLeft) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean useCache, Boolean alwaysSearch, ISearchArgument searchArg, IList`1 windowTitles, Int32& timeLeft) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean useCache, Boolean alwaysSearch, ISearchArgument searchArg, IList`1 windowTitles, Int32& timeLeft) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean useCache, Boolean alwaysSearch, ISearchArgument searchArg, IList`1 windowTitles, Int32& timeLeft) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetElement(Boolean useCache, ISearchArgument searchArg) 
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.Search(ISearchArgument searchArg) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindInternal() 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindPrivate() 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.<Find>b__37() 
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.Find() 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyPrivate(String propertyName) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.<>c__DisplayClass3b.<GetProperty>b__3a() 
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetProperty(String propertyName) 
at Microsoft.VisualStudio.TestTools.UITesting.ALUtility.GetTechElementFromUITestControl(UITestControl uiTestControl) 
at Microsoft.VisualStudio.TestTools.UITesting.ActionExecutorManager.GetActionExecutor(UITestControl uiControl) 
at Microsoft.VisualStudio.TestTools.UITesting.Mouse.ClickImplementation(UITestControl control, MouseButtons button, ModifierKeys modifierKeys, Point relativeCoordinate) 
at Microsoft.VisualStudio.TestTools.UITesting.Mouse.<>c__DisplayClass6.<Click>b__5() 
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) 
at Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl control, MouseButtons button, ModifierKeys modifierKeys, Point relativeCoordinate) 
at Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl control, Point relativeCoordinate) 
at RoadExercises.UIMap.RecordedMethod1() in c:\Users\dtan\Documents\Visual Studio 2013\Projects\CodedUITestProject1\CodedUITestProject1\UIMap.Designer.cs:line 46 
at RoadExercises.RoadExercises.IrVerifyFillInField(String p1, String p2) in c:\Users\dtan\Documents\Visual Studio 2013\Projects\CodedUITestProject1\CodedUITestProject1\RoadExercises.cs:line 169 
at RoadExercises.RoadExercises.RoadExercise1b() in c:\Users\dtan\Documents\Visual Studio 2013\Projects\CodedUITestProject1\CodedUITestProject1\RoadExercises.cs:line 139 
InnerException: System.Runtime.InteropServices.COMException 
HResult=-2147467259 
Message=Error HRESULT E_FAIL has been returned from a call to a COM component. 
Source=Microsoft.VisualStudio.TestTools.UITest.Playback 
ErrorCode=-2147467259 
StackTrace: 
at Microsoft.VisualStudio.TestTools.UITest.Playback.Engine.IScreenElement.FindAllDescendants(String bstrQueryId, Object& pvarResKeys, Int32 cResKeys, Int32 nMaxDepth) 
at Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindAllScreenElement(String queryId, Int32 depth, Boolean singleQueryId, Boolean throwException, Boolean resetSkipStep) 
at Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindScreenElement(String queryId, Int32 depth, Boolean resetSkipStep) 
at Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindScreenElement(String queryId, Int32 depth) 
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String queryId, Int32 maxDepth, Int32& timeLeft) 
InnerException: 

据我可以告诉(当我做了各种慢步骤/ null检查)。无法找到UIEntityTesterTreeListTree的控件。它看起来不在被映射的路径下。显然,这个路径并不是UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTree的简单例子,但是在此之前还有几个子区域需要经历。

我试过几次重新映射,但没有运气。我宁愿不用硬编码,所以希望这里有人能帮我找到解决这个问题的方法。

谢谢!

+0

Web搜索错误消息的一部分会提供很多匹配。我搜索“搜索可能失败,因为它可能有虚拟化的孩子”的第一个结果是Microsoft博客(由Tapas),并解释了消息和解决方法。 ' 没有骰子; – AdrianHHH

+0

通过加入这一行到代码就会宣告该WpfCell/WpfEdit 'this.UIWindowWindow.UIEntityTesterControlCustom.Container = this.UIWindowWindow.UIPART_DockSitePane.UITabbedMdiContainer2fPane后尝试他的溶液@AdrianHHH。它仍然坠毁喜欢它,因为它是无法找到的元素以前那样:( – DanTan

回答

0

你必须编辑WpfCell的搜索属性,以确保他们使用正确的价值观。编码UI测试生成器通常太专用,无法一直工作,我发现将这些值编辑为最小公分母是最佳实践。 Here's一个好地方开始。

我没有太多的经验,修改搜索属性的位置,以寻找在树中的位置,因为我发现它使代码更复杂,并不总是在我的经验,非常稳定。如果某些元素在开发中被添加或移动,它将会破坏您的所有代码,您将不得不返回并更改所有映射的参数。我的建议是让开发人员为元素添加标识属性(例如唯一的名称标签),以便您可以在搜索中指定该属性。

如果您熟悉C#中,它可能会更容易,而不是你的代码映射。如果你有一个元素的特定属性,那当然会更容易。例如:

<wpfelement> 
    <subElement name='someElement'> 
     <button name='oneButton'>Click me.</button> 
    </subElement> 
</wpfelement> 
<wpfelement> 
    <subElement name='someOtherElement'> 
     <button name='secondButton'>Click me.</button> 
    </subElement> 
</wpfelement> 

会在地图的发现:

public WpfButton UIItemCell 
{ 
    get 
    { 
     WfpButton target = new WpfButton(parentElement); 
     target.SearchProperties["name"] = "secondButton"; 
     return target; 
    } 
} 

这样,无论身在何处的元素在你的树,编码的UI引擎轻松找到它。如果您想要的单元格没有任何标识属性,将它们添加到UI中会很有帮助,但是您还可以使用element.GetChildren()从最接近的具有标识符的父级进行导航,并从中进行过滤。

+0

你有没有修改编码的UI映射找到的东西在树前深,垂直?它看起来像我的目标是在一个不同的层次的代码正在,但也有一些分支。 所以它查找节点[1]中的项目。[3]当它想要的项目真的在节点[2]。[1]。[4]任何想法如何改变属性来找到它?试图避免让代码检查整个树。我知道它在节点[2] [1] [4]中,但我不知道如何从节点[1]移动搜索。[3]到节点[2]。[1]。[4] – DanTan

+0

我编辑了答案。如果不清楚,请告诉我。 –