Как мога надеждно да изчакам JavaScript сигнали с помощта на Selenium2 / WebDriver?

В момента помагам в доказателство за концепция, използвайки 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% от времето Selinium ще се провали с a

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