Comment puis-je attendre de manière fiable pour les alertes JavaScript à l'aide Selenium2 / WebDriver?

StackOverflow https://stackoverflow.com/questions/8310548

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.

Était-ce utile?

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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top