硒导航返回和jQuery脏表单插件



我有一些使用jQuery Dirty forms插件的表单,在用户试图导航离开之前提醒他们。

直到Chrome 52,我能够运行一个测试的警报由插件与硒。我打给了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()的行为似乎发生了变化。现在,一个InvalidOperationException被抛出,消息为

未知错误:无法确定加载状态
From unexpected alert open
(Session info: 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.");
}

随着ChromeDriver 2.29的发布,这个问题已经得到修复。Per ChromeDriver发布说明:

修复了在页面卸载时干扰处理警告对话框的错误。

我现在运行Chrome 58,也更新到最新的硒库(3.4.0)。我最初使用的代码(来自原始帖子)现在又可以工作了。

原代码复制供参考:

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}");
}

相关内容

  • 没有找到相关文章

最新更新