Как я могу надежно ждать предупреждений JavaScript, используя Selenium2 / WebDriver? - PullRequest
11 голосов
/ 29 ноября 2011

В настоящее время я помогаю в проверке концепции с использованием Selenium 2 / WebDriver с C # для приложения ASP.NET MVC с использованием InternetExplorerDriver.

Приложение использует стандартный шаблон для уведомления пользователей о сохранении записи. Это работает по настройкам TempData, чтобы включить «Запись успешно сохранена», и если TempData присутствует в представлении, представление предупредит сообщение.

Во время работы над тестами Selenium для этой функции мы получаем непостоянное поведение из приведенного ниже кода теста C # / 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")); 

Примерно в 50% случаев Селиниум потерпит неудачу с

OpenQA.Selenium.NoAlertPresentException: оповещение не активно

Я изо всех сил пытаюсь найти точный способ воспроизвести проблему и беспокоюсь о несоответствии. Если это не помогло последовательно, мы могли бы отладить и отследить проблему.

1 Ответ

15 голосов
/ 30 ноября 2011

Обработка предупреждений и подсказок в Selenium 2 является довольно новой и все еще находится в активной разработке.Ваши сбои, вероятно, связаны с синхронизацией, поэтому я бы предложил написать метод-оболочку для вызова SwitchTo (). Alert (), чтобы вы перехватывали OpenQA.Selenium.NoAlertPresentException и игнорировали его до истечения времени ожидания.* Что-то настолько простое, как это должно работать:

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
}

Эта строка

IAlert alert = wait.Until(drv => drv.SwitchTo().Alert());

станет

IAlert alert = wait.Until(drv => AlertIsPresent(drv));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...