gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:57:36 25 4
gpt4 key购买 nike

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

25 4 0
文章推荐: .net-4.0 - 为什么我不能在 .NET 4.0 中将 List 分配给 IEnumerable