自动测试 – 如何可靠地等待使用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));

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...