6

새로운 네이티브 Microsoft UI 자동화 인터페이스 3.0 (VC++ 2010, Win7)을 사용하여 자동화 된 테스터 응용 프로그램을 프로그래밍하려고합니다. 테스트중인 응용 프로그램 (AUT)은 WPF 응용 프로그램입니다.오래 된 UI 자동화 트리

거의 모든 것이 잘 작동합니다 ... 이벤트 핸들러를 설치하고, 트리를 탐색하고, 다양한 조건을 사용하여 요소를 검색하고, 패턴을 사용하여 발견 된 요소를 제어 할 수 있습니다.

하지만 어제 나는 절망적 인 행동을 발견했습니다. 내 AUT의 UIA 트리는 기본 메뉴 버튼 중 하나를 클릭하여 GUI 기본 패널을 전환 한 후 간단히 업데이트되지 않습니다.

주 메뉴 버튼을 클릭 한 후, 나는 AUT의 GUI에 새로운 위젯을 볼 수 있지만, UIA 트리 여전히 주 메뉴 버튼을 클릭 전에이 왔다 컨트롤이 포함되어 있습니다. (오래된) UIA 트리는 검색 기능을 사용하거나 워커를 사용하여 완전히 읽을 수 있지만 위젯이 더 이상 존재하지 않기 때문에 작성할 수 없습니다.

이것은 정확하게 오래된 캐쉬가있는 것처럼 보입니다 ... 그러나 캐싱 UIA 기능을 전혀 사용하지 않습니다. 없음. 못. 아무데도.

UIA 기능을 호출하거나 테스터 응용 프로그램을 다시 시작하거나 AUT의 GUI를 앞뒤로 전환하지 않아도 프로그래밍 방식으로 UIA 트리를 업데이트 할 수 없었습니다. 이것은 매번 발생하지 않습니다. 때로는 메인 버튼을 클릭 한 후 트리가 제대로 최신 것으로 보이며 모든 것이 잘 작동합니다. 그러나 대부분의 실행은 실패합니다. inspect.exe를 사용하여 UIA 트리를 안정적으로 업데이트하는 유일한 (신비한) 방법이 있습니다. AUT의 UIA 하위 트리를 간략하게 살펴보기 위해 inspect.exe 도구를 사용할 때 문제가 갑자기 사라지고 테스터 애플리케이션이 실제로 업데이트 된 트리에 즉시 액세스 할 수 있습니다! 물론 AUT를 다시 시작한 후에 문제가 다시 나타납니다.

(다른 응용 프로그램의) UIA 트리를 만들기 위해 inspect.exe가 수행하는 작업은 무엇입니까? 캐싱을 사용하지 않고도 사라진 요소에 액세스하는 것이 어떻게 가능합니까? 내가 놓친 게 무엇입니까?

정말 도움이 필요합니다.


좋아, 좀 더 연구 결과 :

  1. UISpy.exe이 inspect.exe가하는 같은 신비한 방법을 UIA 트리를 갱신 할 수 있습니다 (inspect.exe이 같은 사용하기 때문에이 특히 이상하다 네이티브 인터페이스가 있지만 UISpy.exe는 .NET 인터페이스 AFAIK를 사용합니다. 이것은 이것이 시스템 전반에 걸친 지속적인 UIA 문제 일뿐 순수한 UIA 문제는 아니라는 것을 의미합니다.

  2. 에 액세스하지 않으면 문제가 발생하지 않고보기를 전환합니다. 나는. 내 테스터 애플리케이션이 주 메뉴 버튼을 클릭하여보기를 전환하기 전에 AUT의보기에 액세스하지 않으면 새 위젯이 문제없이 보입니다. 이는 네이티브 UIA API의 일부 캐싱 문제를 강력하게 나타냅니다. 캐싱을 전혀하지 않기 때문에 어떻게 이런 일이 발생할 수 있는지 모르겠더라도. 누군가 내부 캐싱이 발생하는지 알고 있습니까?

나는 이것이 API 버그 일 수 있다고 생각합니다. 그러나 마이크로 소프트 커넥트에 대한 나의 현재의 경험을 고려해 볼 때, 나는 그 쇼 스트 스토퍼와 함께 길을 잃었다 .-- (

누군가 생각 좀 해?


또한 스눕 도구를 테스트했습니다. 스눕을 사용하면 Inspect와 UISpy가 일시적으로 문제를 치유하지 않습니다. Inspect.exe와 관련하여 또 다른 세부 사항이 있습니다 ... AUT의 하위 트리를 축소하고 확장하면 문제를 일시적으로 치료할 수 있습니다.

+0

나는 [문제] (http://stackoverflow.com/questions/11014771/contentcontrol-is-not-visible-when-application-starts-via-ui-automation-test-bu) 있습니다. 해결책이 있으시면 제안하십시오! – stukselbax

+0

나무를 어떻게 이동합니까? 일반적으로 업데이트 후 어느 시점에서 새로운 시작 요소 (루트/맨 위)를 가져와야합니다. 하지만 .. 프로그램을 다시 시작한 후에도 문제가 있다고 말한 이후로? UISpy 등을 통해 트리를 강제 업데이트합니까? 또한 UI 요소를 얻기 위해 여러 가지 방법을 시도 했습니까? 요소 위로 마우스를 가져 가면 AutomationElement.FromPoint를 사용하는 것과 같은 기능을합니까? 또한 .. 일부 응용 프로그램에서 UI 트리가 깨 졌거나 일부 링크가 아무 데나 또는 주기적으로 연결된다는 것을 의미합니다. 따라서 아래로 올라가서 항상 출발점을 찾지는 않습니다. –

+0

어쩌면 당신은 몇 가지 코드를 제공 할 수 있습니다, intesressting 문제 소리. – Kooki

답변

2

좋아, 이것에 대한 업데이트. UIA는 단순히 끔찍한 버그로 보인다. 엘리먼트의 콘텐트 배열을 읽고 그 배열의 길이가 숨겨진 캐쉬를 업데이트한다는 것을 알았습니다. 나 또한 탭의 하위 트리가 업데이트되지 않았지만 다른 탭으로 전환하여 다시 업데이트 할 수있는 경우가있었습니다 (패턴을 사용하여 내용을 읽는 것은 도움이되지 않았습니다). 두 경우 모두 재생산 가능했지만 예측하거나 예방할 방법을 찾지 못했습니다. 또한 많은 제 3 자 WPF 구성 요소가 버그가있는 것 같습니다. 우리는 마침내 그 API를 사용하기를 포기했습니다.

1

저는 꽤 오래되었지만 Inspect.exe가 다른 응용 프로그램을 위해 UIA 트리를 새로 고치는 작업을 알아 냈습니다. 옵션 메뉴를 보면 'SPI_SCREENREADER 플래그'라는 항목이 있습니다. 기본적으로 선택되어 있습니다.

코드에서이 작업을 수행하고 당신은 아마 신선한 UIA 트리있어 :

SystemParametersInfo (SPI_SETSCREENREADER, TRUE, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE을);

PostMessage (HWND_BROADCAST, WM_WININICHANGE, SPI_SETSCREENREADER, 0);