2015-09-08 2 views
0

J'ai un certain nombre de tests qui semblent échouer de manière aléatoire en raison d'un dépassement de délai pendant l'exécution d'Internet Explorer.Expiration du délai pendant l'exécution d'Internet Explorer lors d'une erreur Browser.AttachTo

WatiN.Core.Exceptions.TimeoutException: Timeout while Internet Explorer busy 

Ils erreurs semblent être seulement causé sur les lignes avec le code de:

WatiN.Core.Browser.AttachTo[T](Constraint constraint)

Ma méthode d'installation:

[SetUp] 
[Timeout(1000)] 
public void WithAnInstanceOfTheBrowser() 
{ 
    Settings.AttachToBrowserTimeOut = 200; 
    Settings.WaitUntilExistsTimeOut = 200; 
    Settings.WaitForCompleteTimeOut = 200; 
    Settings.SleepTime = 60; 

    BrowserExtension.KillAllIEProcess(); 

    var securePassword = new SecureString(); 
    foreach (var c in UserConfig.GetConfigPassword()) 
    { 
     securePassword.AppendChar(c); 
    } 

    string address = UserConfig.GetConfigUrl(); 
    string username = UserConfig.GetConfigUserName(); 
    ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe", address); 
    startInfo.UserName = username; 
    startInfo.Password = securePassword; 
    startInfo.UseShellExecute = false; 
    startInfo.LoadUserProfile = true; 
    Process.Start(startInfo); 
    _browser = Browser.AttachTo<IE>(Find.ByUrl(UserConfig.GetConfigUrl())); 
} 

_browser est une variable globale au niveau de la classe:

IE _browser; 

Ensuite, dans le test, j'effectue un certain nombre d'actions sur la fenêtre qui s'ouvre et l'une de ces actions est en cliquant sur un bouton et ce bouton ouvre un nouvel onglet dans l'application. ensuite pour obtenir une référence à cette nouvelle page J'utilise les lignes:

Thread.Sleep(6000); //even sleeping but to no avail 
Browser workItem = Browser.AttachTo<IE>(Find.ByTitle(new Regex(workItemRegex))); 

Cela semble rejeter au hasard des erreurs, parfois ça marche et parfois je reçois une erreur.

Je ne suis pas exactement sûr de ce qui ne va pas ici, car il semble logique que cela fonctionne.

Dans le TearDown du test, tous les processus IE sont supprimés et _browser est défini sur null.

Des idées?

Répondre

0

J'ai vu cela avant et il m'est arrivé en essayant de fermer et rouvrir IE, puis de se ré-attacher au navigateur. Mais même si je ne trouve pas d'explication logique pour expliquer pourquoi cela échoue, j'ai découvert pourquoi il arrivait sur moi (au moins dans mon cas) et c'est parce que même lorsque vous tuez l'objet IE avant d'en instancier un nouveau, l'arrêt de IE prend plus de temps que prévu (croyez-moi, j'ai essayé plusieurs minutes) alors la seule solution pour moi était de tuer le processus que j'utilisais avant de créer un nouveau et à partir de ce moment je n'ai eu aucun problème. J'espère que cela aidera votre situation.

+0

J'ai résolu ce problème en utilisant une combinaison de AttachToNoWait et Thread.Sleep (XXXX). J'ai également essayé de structurer mes tests différemment en ce que je passe la fenêtre courante sur laquelle je travaille à des méthodes auxiliaires au lieu de créer une référence à la page spécifique dans le cadre des méthodes auxiliaires. J'accepterai votre réponse car, d'après mon expérience, c'est exactement ce qui cause le problème. Ce ne sont que quelques trucs de travail que j'ai utilisés. – Ben

+0

J'ai été là avant et j'ai utilisé une instance et la déplacer entre les classes mais j'ai aussi trouvé des situations où il n'y avait pas d'autre alternative que de lancer une autre instance et de s'y attacher, puis de tuer cette instance et re instaurez et dans ce cas, tuer le processus fonctionne très bien. – ProgrammerV5