Как я могу надежно ждать оповещения JavaScript с помощью Selenium2/WebDriver?
В настоящее время я помогаю в доказательстве концепции с использованием Selenium 2/WebDriver с С# против приложения ASP.NET MVC с помощью InternetExplorerDriver.
В приложении используется стандартный шаблон для уведомления пользователей о сохранении записи. Это работает с настройками TempData, чтобы включить "Запись успешно сохранена", и если TempData присутствует в представлении, представление предупредит об этом.
При работе над тестами Selenium для этой функциональности мы получаем неустойчивое поведение из приведенного ниже тестового кода С#/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: предупреждение не активно
Я изо всех сил пытаюсь найти точный способ воспроизвести проблему и беспокоиться о аспекте несогласованности. Если он не прошел последовательно, мы могли бы отладить и отследить проблему.
Ответы
Ответ 1
Обработка предупреждений и подсказок в 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));