我目前正在协助使用 Selenium 2/WebDriver 和 C# 针对使用 InternetExplorerDriver 的 ASP.NET MVC 应用程序进行概念验证。
该应用程序使用标准模式通知用户记录已保存。这通过将 TempData 设置为包括“成功保存记录”来实现,如果 TempData 存在于 View 中,则 View 将警告消息。
在为此功能进行 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 并忽略它,直到超时到期。
像这样简单的事情应该可以工作:
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));
关于automated-tests - 如何使用 Selenium/WebDriver 可靠地等待 JavaScript 警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8310548/