我正在使用InternetExplorerDriver协助使用Selenium 2 / WebDriver与C#相对于ASP.NET MVC应用程序的概念证明.
应用程序使用标准模式通知用户记录已保存.这通过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:没有警报处于活动状态
我很难找到一个确切的方式来复制这个问题,并担心不一致的方面.如果它一直失败,那么我们可以调试和跟踪问题.
解决方法
Selenium 2中的警报和提示的处理是相当新的,并且仍在积极的发展.
你的失败可能是由于时序,所以建议在调用SwitchTo().Alert()时编写一个包装方法,以便捕获OpenQA.Selenium.NoAlertPresentException,并忽略它,直到超时到期.
你的失败可能是由于时序,所以建议在调用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));