Comment puis-je attendre de manière fiable pour les alertes JavaScript à l'aide Selenium2 / WebDriver?
-
25-10-2019 - |
Question
J'assiste actuellement à une preuve de concept en utilisant Sélénium 2 / WebDriver avec C # contre une application ASP.NET MVC en utilisant le InternetExplorerDriver.
L'application utilise un modèle standard pour informer les utilisateurs qu'un enregistrement a sauvé. Cela fonctionne en paramètres TempData à inclure « Sauvegarder successefully », et si TempData est présent dans la vue, la vue d'alerter le message.
En travaillant sur des tests Selenium pour cette fonctionnalité que nous recevons le comportement inconstitant du dessous C # / code de test Selenium:
_driver.Navigate().GoToUrl(_baseUrl + "/Amraam/List");
_driver.FindElement(By.LinkText("Create New")).Click();
_driver.FindElement(By.Id("txtAmraamSerialNumber")).SendKeys("CC12345");
var selectElement = new SelectElement(_driver.FindElement(By.Id("LocationId")));
selectElement.SelectByText("Tamworth");
_driver.FindElement(By.Id("btnSave")).Click();
var wait = new WebDriverWait(_driver, defaultTimeout);
IAlert alert = wait.Until(drv => drv.SwitchTo().Alert());
_alertText = alert.Text;
alert.Accept();
Assert.That(_alertText, Is.EqualTo("Record successfully saved"));
Environ 50% du temps, Selinium échouera avec un
OpenQA.Selenium.NoAlertPresentException: Pas d'alerte est active
Je lutte pour trouver une manière exacte de reproduire le problème, et l'inquiétude en ce qui concerne l'aspect d'incohérence. Si elle n'a pas toujours, alors nous pourrions déboguer et suivre vers le bas problème.
La solution
La gestion des alertes et des invites dans Sélénium 2 est assez nouveau et est encore en cours de développement. Vos échecs sont probablement en raison du calendrier, je vous conseille donc d'écrire une méthode d'emballage autour de l'appel à SwitchTo (). Alert () afin que vous prenez le OpenQA.Selenium.NoAlertPresentException et l'ignorer jusqu'à ce que le délai d'expiration.
Quelque chose d'aussi simple que cela devrait fonctionner:
private IAlert AlertIsPresent(IWebDriver drv)
{
try
{
// Attempt to switch to an alert
return drv.SwitchTo().Alert();
}
catch (OpenQA.Selenium.NoAlertPresentException)
{
// We ignore this execption, as it means there is no alert present...yet.
return null;
}
// Other exceptions will be ignored and up the stack
}
Cette ligne
IAlert alert = wait.Until(drv => drv.SwitchTo().Alert());
deviendrait alors
IAlert alert = wait.Until(drv => AlertIsPresent(drv));