Как я могу надежно ждать предупреждений JavaScript с помощью Selenium2/WebDriver?

В настоящее время я помогаю в проверке концепции с использованием Selenium 2/WebDriver с С# против приложения 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% случаев Selinium не работает с

OpenQA.Selenium.NoAlertPresentException: предупреждение не активно

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


person Paul Williams    schedule 29.11.2011    source источник


Ответы (2)


Обработка предупреждений и подсказок в 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));
person Naishy    schedule 30.11.2011
comment
Спасибо за это. На самом деле, работая дальше, мы обнаружили, что это была проблема не с селеном, а с нашим тестируемым приложением и упорядочением событий javascript по нажатию кнопки (не спрашивайте...). Во всяком случае, селен вел себя сам . @Naishy, ​​твой ответ выглядит великолепно, и в противном случае мы бы попробовали - ура. - person Paul Williams; 01.12.2011
comment
Вы можете использовать синтаксис группы методов, чтобы сделать последнюю строку более краткой; IAlert alert = wait.Until(AlertIsPresent);. - person Richard Ev; 18.03.2013
comment
Теперь вы можете использовать ExpectedCondition.AlertIsPresent См.: stackoverflow.com/a/24550934/200824 - person Bob Lokerse; 14.09.2015

Надеюсь, это будет полезно для ожидания и нажатия

WebDriverWait(driver,4).until(EC.alert_is_present())
driver.switch_to.alert.accept()
person Hietsh Kumar    schedule 03.01.2020