Selenium force driver.Quit 忽略 "asking to leave" 对话框

Selenium force driver.Quit which ignores "asking to leave" dialog

背景: 我使用 Selenium、C# 和 Firefox 来自动执行我经常执行的任务。我选择此选项是因为我正在访问的网站不再提供 REST API。在我的代码中,我会定期检查错误,例如找不到 Web 元素。在这种时候,我希望我的应用程序能够优雅地退出并显示一条错误消息。

参考我目前的代码

        if (driver != null)
        {
            driver.Quit();
        }

问题: driver.Quit() 在从具有已部分填写的表单的网页调用时不会关闭 Firefox 或 geckodriver。相反,会弹出一个对话框,上面写着

This page is asking you to confirm that you want to leave - data you have entered may not be saved.

搜索了一下发现对话框是由网页生成的。我尝试寻找 Firefox 首选项来禁用弹出窗口,但没有找到相关的首选项。一搜result翻到了关于杀掉Firefox进程的信息。

问题: 是否有推荐的 Selenium 方法来确保 Firefox 和 Web 驱动程序被终止?

您可以做几件事:

  • 如评论中所述,完全抑制它们
  • 如您所述,Process.Kill。我使用的一个实现是:

    // ProccessId's can be gotten by Proccess.GetProcessesByName("Name")
    public static void KillProcessAndChildren(params int[] processIds)
    {
        foreach (var processID in processIds)
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(
                "Select * From Win32_Process Where ParentProcessID=" + processID);
            ManagementObjectCollection moc = searcher.Get();
            foreach (ManagementObject mo in moc)
            {
                KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
            }
            try
            {
                Process proc = Process.GetProcessById(processID);
                proc.Kill();
            }
            catch (ArgumentException)
            {
                // Process already exited.
            }
        }
    }
    
  • 确认不需要关注后接受警告对话框。在我看来,这是最好的解决方案,因为它可以确保如果出现意外错误,您的测试不会 return 错误通过。执行此操作的代码是:

    var alert = driver.SwitchTo().Alert();
    if (alert.Text == "The expected error message")
        alert.Accept();
    else
        Assert.Fail("The webriver raised an unexpected warning: " + alert.Text);