2014-05-21 6 views
0

예를 들어 아주 간단한 UI를 사용할 것입니다 : 하나의 버튼 (B)으로 창 (W이라고합니다). 코딩 된 UI의 UIMap에서 BW의 하위 항목입니다. 즉지도의 XML 사양에서 BW의 "자손"에 표시됩니다.코딩 된 UI의 "항상 검색"구성이 부모/자식 객체와 어떻게 작동합니까?

이제 두 개의 인스턴스 W이 동시에 열립니다. W1W2을 구별 할 수있는 검색 속성이 있습니다 (예 : 서로 다른 Name 속성이 있음). 을 제외한 B1B2을 구별 할 수있는 방법이 없습니다. UIMap의 WUITestControl에 맞게 W1의 이름에 Name 속성을 설정

  1. 를 열고이 윈도우의 경우, W1W2
  2. :

    나는 다음과 같은 절차에 테스트를 수행합니다.

  3. UIMap의 BUITestControl에서 Mouse.Click()을 실행합니다.
  4. UIMap의 WUITestControlName 속성이 W2의 이름과 일치하도록 설정하십시오.
  5. UIMap의 BUITestControl에서 Mouse.Click()을 실행합니다.

내 이해도 WB가있는 경우 "항상 검색"이다 구성, 다음이 그래서 제 질문은 다음과 같은 경우에 발생하는 모두 단계 3, 5로 클릭하고 B1으로 이어질 것입니다 :

  • B에는 "검색 항상"설정이 있지만 W은 설정되어 있지 않습니다.
  • W에는 "검색 항상"설정되어 있지만 B에는 설정되어 있지 않습니다.

답변

2

검색 항상 설정이 없으면 엔진은 UI 요소를 찾은 후 캐시합니다 (캐시를 통해 해당 요소에서 가져온 MSAA COM 개체에 대한 참조를 유지함). Always Search를 사용하면 항상 말한 것처럼 요소를 검색합니다. 또한 UITestControl.Find()는 똑같은 작업을 수행하므로 항상 검색 구성을 설정하지 않으려는 경우 명시 적으로 사용할 수 있습니다.

컨트롤의 검색 속성을 변경하면 엔진은 다음에 해당 컨트롤을 사용할 때 요소를 검색합니다. 따라서 검색 속성을 변경하면 컨트롤에서 ui 요소에 대한 참조가 삭제됩니다. 그러나 자식 요소 (귀하의 경우 버튼)가 이미 캐시되어 있고 부모의 검색 속성을 변경하면 버튼에서 찾기를 호출하거나 항상 검색을 설정해야합니다. 그렇지 않으면 엔진에서 캐시 된 UI 요소를 사용합니다.

동일한 클래스의 여러 UITestControl을 사용하려면 UIMap을 잊어 버리고 해당 클래스의 인스턴스를 여러 개 만든 다음 검색 속성을 개별적으로 변경해야합니다. UIMap은 요소 계층에 대한 책임이 없으며 요소에 액세스하는 것뿐입니다.따라서 귀하의 경우

: 모든 것이 올바르게 설정 W1- 경우

var W1 = new MyWindowClass(); 
var W2 = new MyWindowClass(); 
W1.SearchProperties.Add(...); 
W2.SearchProperties.Add(...); 

그런 다음> B는 W1 창 W2-에서 단추가 될 것입니다> B W2 창에서 버튼을 것이다.

W 다음 당신은 UIMap에서의 부모를 설정할 수있는 최고 수준의 요소가 아닌 경우 :

var W1 = new MyWindowClass(UIMap.UITopWindow); 

이러한 질문은 또한 당신에게 도움이 될 수 있습니다

Interacting with multiple instances of an application in Coded UI

SwitchTo method for Coded UI

+0

정보 주셔서 감사합니다. 불행히도 UIMaps를 포함하여 기존 코드를 사용하도록 제한되어 있습니다. 제 대답의 두 번째 단락은 내 질문에 두 번째 시나리오를 다루는 것으로 생각합니다. 답은'B1'을 두 번 클릭한다는 것입니다. 첫 번째 시나리오는 어떻습니까? 같은 질문을 다른 방법으로 말하기 : 컨트롤에서 .Find()를 호출하면 해당 컨트롤의 부모를 다시 찾거나 부모에 대해 캐시 된 내용을 보게됩니까? –

+0

엔진은 하위 컨트롤의 전체 계층 구조를 다시 검색합니다. 부모에 대한 검색 조건을 수정하고 자식에 대해 Find()를 호출하십시오. – kida