我有一些表单使用 jQuery Dirty Forms 插件在用户尝试离开之前提醒他们。
在 Chrome 52 之前,我能够对 Selenium 插件引发的警报进行测试。我打电话给driver.Navigate().Back();
,这会触发一个警报框。然后我可以使用以下代码处理警报:
d.Navigate().Back();
try
{
// Expecting an alert now
IAlert a = d.SwitchTo().Alert();
// And acknowledge the alert (equivalent to clicking "OK")
a.Accept();
}
catch (NoAlertPresentException ex)
{
System.Diagnostics.Debug.Write($"Warning: Expected an alert but none was present. {ex.Message}");
}
但是,自 Chrome 52 以来, 的行为.Back()
似乎发生了变化。现在, anInvalidOperationException
与消息一起抛出
未知错误:无法
从意外警报打开确定加载状态
(会话信息:chrome=53.0.2785.116)
(驱动程序信息:chromedriver=2.24.417431(9aea000394714d2fbb20850021f6204f2256b9cf),平台=Windows NT 10.0.10586 x86_64)
我此时正在丢弃异常,但由于警报,下一个测试将不会运行。具体来说,这意味着我不能按顺序运行多个测试。我必须单独运行每个测试,手动确认警报,以便 Chrome 将关闭
我正在使用最新版本的 Selenium (2.53.1) 并尝试过 ChromeDriver 2.22/23/24。所有人都有相同的行为。
我知道这里没有人可以控制 Chrome,但我想知道是否有替代方案可以用来实现这个测试目标,以确保出现脏表单警报。由于其他一些问题,我无法真正从 Chrome 更改为其他浏览器。提交表单也是我不想做的事情(如果脏表单没有被触发,它会修改数据库,我不想解决这个问题)。
更新:2016-09-22
我现在正在使用以下代码解决这个问题。
try
{
// Navigate back to the previous page
d.Navigate().Back();
try
{
IAlert a = d.SwitchTo().Alert();
// Get the text of the alert or prompt
System.Diagnostics.Debug.WriteLine(a.Text);
// And acknowledge the alert (equivalent to clicking "OK")
a.Accept();
}
catch (NoAlertPresentException ex)
{
System.Diagnostics.Debug.Write($"Warning: Expected an alert but none was present. {ex.Message}");
}
}
// Chrome 52: this is how the driver does it now?
catch (InvalidOperationException ex)
{
if (!ex.Message.Contains("unexpected alert"))
throw;
IAlert a = d.SwitchTo().Alert();
Assert.IsTrue(a.Text.Contains("lose these changes"));
a.Accept();
System.Diagnostics.Debug.WriteLine("Handled alert through InvalidOperationException handler.");
}