2015-01-12 3 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; 
    } 
} 

그것은 내가 말할 수있는 (I 다양한 느린 단계/널 (null) 검사를했을 때) 지금까지

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: 

전화를 처음 Mouse.Click()에이 오류와 충돌합니다. UIEntityTesterTreeListTree에 대한 컨트롤을 찾을 수 없습니다. 매핑 된 경로 아래에 위치하지 않은 것 같습니다. 분명히이 경로는 UIWindowWindow.UIEntityTesterControlCustom.UIEntityTesterTree의 간단한 경우는 아니지만 이전에는 몇 가지 하위 영역이 있습니다.

몇 번이나 다시 매핑하려고 시도했지만 행운이 없습니다. 차라리 열심히 코딩하지 않을 것입니다. 그래서 누군가가 여기에서이 문제를 해결할 수있는 방법을 찾길 원합니다.

감사합니다.

+0

웹에서 오류 메시지의 일부를 검색하면 많은 조회가 발생합니다. "검색 결과가 가상화 된 어린이 일 수 있으므로 실패했을 수 있습니다."라는 검색 결과의 첫 번째 결과는 메시지 및 해결 방법에 대한 설명이 포함 된 Microsoft 블로그 (타파스)입니다. ' 없음 주사위, – 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

답변을 편집했습니다. 명확하지 않은 경우 알려주십시오. –

관련 문제