Теперь самое главное, что я ожидал и что я получил. Тестовый метод выглядит следующим образом:
WaitForXxxxMapClasses.WaitForXxxxMap uimap = new WaitForXxxxMapClasses.WaitForXxxxMap(); // моя UIMap, которую я получил с помощью UI test builder.
//
SilverlightButton first = uimap.UIWaitForXxxxTestingInWindow.UIWaitForXxxxTestingDocument.UISilverlightControlHoPane.UIItemCustom.UIMainPageMainPage.UIFirstButton;
SilverlightButton second = uimap.UIWaitForXxxxTestingInWindow.UIWaitForXxxxTestingDocument.UISilverlightControlHoPane.UIItemCustom.UIMainPageMainPage.UISecondButton;
SilverlightButton third = uimap.UIWaitForXxxxTestingInWindow.UIWaitForXxxxTestingDocument.UISilverlightControlHoPane.UIItemCustom.UIMainPageMainPage.UIThirdButton;
//
second.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.Height, 0); // Исследуемая функция.
//
Rectangle rect = second.BoundingRectangle;
Point center = new Point();
center.X = rect.Left + rect.Width / 2;
center.Y = rect.Top + rect.Height / 2;
//
Mouse.Click(center);
Я ожидал, что метод WaitForControlPropertyNotEqual для кнопки second должен блокировать ход выполнения тестового метода до тех пор, пока высота кнопки не станет больше 0 (т.е. кнопка станет видимой) или пока не кончится время по умолчанию. В MSDN написано так: Blocks the current thread until the specified property of this control is not equal to the specified value, or until the default time-out expires./
Конечно я проверил значение Height - оно равно 0 и параметры объекта Playback.PlaybackSettings, вот они на момент выполнения метода:
Test Name: Parameters
Test Outcome: Passed
Result StandardOutput:
DelayBetweenActions = 100
SearchTimeout = 120000
WaitForReadyTimeout = 60000
ShouldSearchFailFast = True
SmartMatchOptions = TopLevelWindow, Control
SearchInMinimizedWindows = True
ThinkTimeMultiplier = 1
ImeLanguageList = System.Collections.Generic.List`1[System.Int32]
MaximumRetryCount = 1
MatchExactHierarchy = False
SkipSetPropertyVerification = False
SendKeysAsScanCode = False
WaitForReadyLevel = UIThreadOnly
ContinueOnError = False
AlwaysSearchControls = False
Как я понял, функция должна ожидать WaitForReadyTimeout милисекунд и уже потом завершаться ошибкой. Я же планировал нажать на первую кнопку спустя несколько секунд после старта теста и увидеть, как тест нажмет на вторую кнопку, чтобы появилась третья :). Но все оказалось не так...
На самом деле: WaitForControlPropertyNotEqual ничего не ждет - алгоритм продолжается без всяких видимых! пауз и пытается нажать на кнопку, у которой нулевые высота и ширина, а BoundingRectangle вообще с отрицательными величинами (глянул на всякий случай). И сразу появляется ошибка:
...Microsoft.VisualStudio.TestTools.UITest.Extension.PlaybackFailureException: Cannot perform 'Click' on the control. Additional Details: The control details were not specified. ...
А если используем такое нажатие: Mouse.Click(second);, то ошибка примерно все равно о том же: ...
Microsoft.VisualStudio.TestTools.UITest.Extension.FailedToPerformActionOnHiddenControlException: Cannot perform 'Click' on the hidden control. Additional Details: ...
Тогда возникает вопрос... а как тогда должны работать функции ожидания для UITestControl? Как их надо применять, чтобы отрабатывала задержка по времени и тест не валился, если вдруг что-то не успеет огтрисоваться или загрузиться в процессе запуска?
PS я пробовал и такой вариант: second.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.Height, 0, 60000); - никакой разницы, все пролетает за считанные секунды и ошибки те же.