2016-11-21 10 views
0

Описание: MFC Applicationкодированный Ui WaitForControlReady (200) не нарушает тайм-аута

желательное действие - проверить, если дополнительное окно открыто. Определите вспомогательное окно с помощью уникальной кнопки, расположенной в окне.

Проблема: когда окно закрыто, следующий код вместо возврата false после 200 мс ждет 7 секунд = время ожидания не работает.

GeneralUIMap winwindow представляет собой кнопку, так как сама кнопка не имеет уникальные поисковые свойства, и могут быть однозначно определены только WinWindow обертку GeneralUIMap:

class x{ 
    private UITestControl mainApplicationWindow; //main application window 
    private WinWindow GeneralUIMap; 
    private WinButton btnZoomAdd; 

    X(){ 
     mainApplicationWindow = new WinWindow(); 
     mainApplicationWindow.TechnologyName = "MSAA"; 
     mainApplicationWindow.SearchProperties UITestControl.PropertyNames.Name] = " - Main Window - Welcome"; 

     GeneralUIMap = new WinWindow(mainApplicationWindow); 
     GeneralUIMap.SearchProperties[WinWindow.PropertyNames.ControlId] = "8546"; 
     btnZoomAdd = new WinButton(GeneralUIMap); 



    } 
    public bool isVisible() 
    { 
     WinWindow w = new WinWindow(mainApplicationWindow); 
     w.SearchProperties[WinWindow.PropertyNames.ControlId] = "8546"; 

     try 
     { 
      w.WaitForControlReady(200); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 

     return true; 
    } 

ответ

0

Существует ли окно, когда вы вдумайтесь быть готовым? Если нет, функция вызовет исключение null. Это исключение требует времени, так как кодированный пользовательский интерфейс пытается найти элемент управления, прежде чем сдаваться и возвращает значение null.

Используйте WaitForControlExist() или TryFind() как состояние перед тем, как использовать WaitForControlReady().

Также WaitForControlReady() вернет false, если таймаут достигнут. Но ваш код на самом деле всегда будет возвращать true (если нет исключения), так как вы не оцениваете значение WaitForControlReady().

Вместо попытке поймать, используйте:

if (w.TryFind() && w.WaitForControlReady(200)) 
{ 
    return true; 
else 
{ 
    return false; 
} 

IMO, 200 мс действительно короткий промежуток времени, в течение тайм-аута. Это может привести к ошибочным ошибкам. В других случаях, когда проверяется эффективность пользовательского интерфейса, у вас должны быть разумные тайм-ауты. Тайм-аут по умолчанию составляет 3000 мс в кодированном пользовательском интерфейсе, которого должно быть достаточно. Но не стесняйтесь его увеличивать.

Помните, что таймаут будет достигнут только тогда, когда условие не встречается в отличие от задержки, когда действие будет ждать до конца независимо от состояния объекта. Кроме того, автоматические тесты по-прежнему будут быстрее, чем люди, из-за своей регулярности.

Последнее замечание, ваш метод «IsVisible()» точно не возвращает видимый статус окна. С Coded UI, я думаю, вы можете considere, что элемент управление видно, когда у вас есть интерактивная точка или проверить ControlStates:

w.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.State, ControlStates.Invisible) 

и, возможно, тоже:

w.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.State, ControlStates.Offscreen);