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);
背景: 我使用 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);