自动测试 – 如何可靠地等待使用Selenium2 / WebDriver的JavaScript警报?

前端之家收集整理的这篇文章主要介绍了自动测试 – 如何可靠地等待使用Selenium2 / WebDriver的JavaScript警报?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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,并忽略它,直到超时到期.

像这样简单的东西应该工作:

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));

猜你在找的JavaScript相关文章