背景 我正在使用Selenium,C#和Firefox来自动执行我定期执行的任务。我选择此选项是因为我访问的网站不再提供REST API。在我的代码中,我定期检查错误,例如找不到网页元素。在这个时候,我希望我的应用程序正常退出并显示错误消息。
供参考我当前的代码
if (driver != null)
{
driver.Quit();
}
问题: 当从具有部分填写的表单的网页调用时,driver.Quit()不会关闭Firefox或geckodriver。而是会弹出一个对话框,上面写着
此页面要求您确认是否要离开 - 为您提供数据 已输入可能无法保存。
进行一些搜索我发现该对话框是由网页生成的。我试图寻找一个Firefox首选项来禁用弹出窗口但是没有找到一个相关的。一次搜索result提供了有关杀死Firefox进程的信息。
问题: 是否有推荐的Selenium方法来确保Firefox和Web驱动程序被终止?
答案 0 :(得分:1)
您可以做几件事:
正如您所说,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.
}
}
}
验证您不需要注意后接受警告对话框。在我看来,这是最好的解决方案,因为它确保如果出现意外错误,您的测试不会返回错误传递。执行此操作的代码是:
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);