Selenium Navigate Back 和 jQuery Dirty Forms 插件

Posted

技术标签:

【中文标题】Selenium Navigate Back 和 jQuery Dirty Forms 插件【英文标题】:Selenium Navigate Back and jQuery Dirty Forms plugin 【发布时间】:2017-01-28 14:23:12 【问题描述】:

我有一些表单使用 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() 的行为似乎发生了变化。现在,InvalidOperationException 会随消息一起抛出

未知错误:无法确定加载状态 从意外警报打开 (会话信息:chrome=53.0.2785.116) (驱动信息:chromedriver=2.24.417431 (9aea000394714d2fbb20850021f6204f2256b9cf),platform=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.");

【问题讨论】:

【参考方案1】:

随着 ChromeDriver 2.29 的发布,该问题已得到修复。根据 ChromeDriver 发行说明:

修复了一个错误,该错误会干扰处理页面卸载时的警报对话框。

我现在正在运行 Chrome 58,并且还更新到了最新的 Selenium 库 (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");

【讨论】:

以上是关于Selenium Navigate Back 和 jQuery Dirty Forms 插件的主要内容,如果未能解决你的问题,请参考以下文章

java+selenium+new——同一个标签窗口里 ,访问多个网页的后退driver.navigate().back()前进driver.navigate().forward()刷新drive(代

selenium常见函数一

VSCode Navigate Back/Forward

Pycharm(Jetbrains IDE)Debian buster Navigate Back/Forward (Ctrl+Alt+Left/Right)不好使的解决方法

java+selenium+new——访问某个网址的两种方式driver.get()以及driver.navigate().to()

当用MVVM navigate回来后,怎么刷新ViewModel?