Automated tests 如何使用Selenium2/WebDriver可靠地等待JavaScript警报?

Automated tests 如何使用Selenium2/WebDriver可靠地等待JavaScript警报?,automated-tests,webdriver,selenium-webdriver,Automated Tests,Webdriver,Selenium Webdriver,我目前正在协助使用Selenium 2/WebDriver和C#对使用InternetExplorerDriver的ASP.NET MVC应用程序进行概念验证 应用程序使用标准模式通知用户记录已保存。这通过设置TempData来包括“Record saved Successfully”,如果视图中存在TempData,视图将警告消息 在为该功能进行Selenium测试的同时,我们从以下C#/Selenium测试代码中收到了inconstitant行为: _driver.Navig

我目前正在协助使用Selenium 2/WebDriver和C#对使用InternetExplorerDriver的ASP.NET MVC应用程序进行概念验证

应用程序使用标准模式通知用户记录已保存。这通过设置TempData来包括“Record saved Successfully”,如果视图中存在TempData,视图将警告消息

在为该功能进行Selenium测试的同时,我们从以下C#/Selenium测试代码中收到了inconstitant行为:

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

希望这将有助于等待并单击

WebDriverWait(driver,4).until(EC.alert_is_present())
driver.switch_to.alert.accept()

为此干杯。事实上,进一步研究,我们发现这实际上不是selenium的问题,而是我们正在测试的应用程序的问题,以及点击按钮(不要问…)时javascript事件的顺序。无论如何,selenium本身就是一个问题@Naishy,你的回答看起来很好,我们会尝试其他方法的——干杯<代码>IAlert alert=等待.直到(AlertIsPresent)。现在您可以使用ExpectedCondition.AlertIsPresent查看: