automated-tests - 如何使用 Selenium/WebDriver 可靠地等待 JavaScript 警报?

标签 automated-tests webdriver selenium-webdriver

我目前正在协助使用 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/

相关文章:

Java/Junit : how to test if an external program/process/application is running?

java - TestNG "getCurrentXmlTest()).getAllParameters()"API 使用非常旧的 testng-5.4-jdk15.jar TestNG 库

java - WebDriver 和 ChromeDriver : Unable to fix org/json/JSONException error

java - IE10 的网络驱动程序设置功能不会改变 IE 版本吗?

java - Selenium 点击功能没有失败

typescript - 如何使用 ts-node 运行 Protractor 配置文件 (.ts)?

testing - TeamCity 测试可以异步运行吗

python - Selenium:Python 无法从 elif 中找到元素

java - driver.switchTo().alert() 不适用于谷歌浏览器和火狐浏览器

java - 使用 Selenium WebAPI 进行 Jira 测试自动化