2013-04-22 12 views
5

Nell'interfaccia utente codificata esiste un modo per attendere che esista un controllo utilizzando UITestControl.WaitForControlExist(waitTime);. C'è un modo per aspettare che un controllo non esista? Il modo migliore che potrei pensare è quello di creare un metodo di estensione in questo modo:Nell'interfaccia utente codificata C# esiste un modo per attendere che un controllo sia selezionabile.

public static bool WaitForControlClickable(this UITestControl control, int waitTime = 10000) 
    { 
     Point p; 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     while (stopwatch.ElapsedMilliseconds < waitTime) 
     { 
      if (control.TryGetClickablePoint(out p)) 
      { 
       return true; 
      } 
      Thread.Sleep(500); 
     } 
     return control.TryGetClickablePoint(out p); 
    } 

Esiste un modo migliore di fare questo? Inoltre sto cercando un modo per fare il contrario.

risposta

3

Allora cosa WaitForControlExists in realtà non fa altro che chiamare il pubblico WaitForControlPropertyEqual, qualcosa di simile:

return this.WaitForControlPropertyEqual(UITestControl.PropertyNames.Exists, true, timeout); 

vostro aiuto può invece chiamare:

public bool WaitForControlPropertyNotEqual(string propertyName, 
       object propertyValue, int millisecondsTimeout) 

Inoltre, come sottolinea Kek, c'è un WaitForControlNotExist metodo pubblico.

Nota che tutti sembrano essere utilizzando lo stesso aiutante (anche pubblico):

public static bool WaitForCondition<T>(T conditionContext, Predicate<T> conditionEvaluator, int millisecondsTimeout) 

questo helper fa essenzialmente un Thread.Sleep sul thread corrente, più o meno come lo si fa.

+0

Ci scusiamo per aver fatto la domanda a voi ma utile come questa risposta per quello che ho inizialmente chiesto non esiste alcuna proprietà cliccabile che io conosca, quindi non posso aspettare. – jgerstle

+0

Direi di guardare in quell'assemblea e vedere come tutti questi metodi sono implementati (usa uno strumento riflettore). Sembrano tutti indicare la stessa direzione generale di ciò che hai fatto. –

1

Se si desidera solo di aspettare per un determinato periodo di tempo, è possibile aggiungere al vostro test:

Playback.Wait(3000); 

con il tempo in millisecondi.

+0

Puoi spiegare perché 'Playback.Wait (500);' sarebbe preferibile rispetto a 'Thread.Sleep (500);' che il codice nella domanda già utilizza? – AdrianHHH

+1

In base a MSDN, Playback.Wait() consente di annullare la riproduzione prima della fine dell'attesa, mentre il sonno potrebbe non funzionare o generare eccezioni. http://msdn.microsoft.com/en-us/library/gg131072.aspx – knighter

0

Esiste una famiglia di metodi WaitForControl...(), incluso il metodo WaitForControlNotExist().

La serie completa di questi metodi è Wait...:

WaitForControlEnabled() 
WaitForControlExist() 
WaitForControlNotExist() 
WaitForControlPropertyEqual() 
WaitForControlPropertyNotEqual() 
WaitForControlReady() 

Ci sono anche le WaitForCondition() e WaitForControlCondition() metodi che possono essere utilizzati per attendere condizioni più complicate.

Problemi correlati