【问题标题】:How to kill IEDriverServer.exe console window after running an InternetExplorerDriver Selenium test运行 InternetExplorerDriver Selenium 测试后如何杀死 IEDriverServer.exe 控制台窗口
【发布时间】:2016-07-11 06:11:10
【问题描述】:

我正在通过 Visual Studio 单元测试并使用 InternetExplorerDriver 运行 Selenium Webdriver。这会在控制台窗口中启动 IEDriverServer.exe。

这很好用并且测试执行。一旦测试执行完成,我希望 cmd.exe 窗口被杀死,这样我就不必手动清理了。我有数以千计的测试,因此您可以想象管理它的过程。

有没有一种优雅的方法来处理这个问题,而无需执行测试后执行并使用 kill.exe 等杀死 cmd.exe 进程?我试过 InternetExplorerDriverService.HideCommandPromptWindow = true,但这只是在隐藏模式下运行 cmd.exe 并让进程一直运行,直到它被手动杀死。我也尝试过 InternetExplorerDriverService.SuppressInitialDiagnosticInformation,所做的只是抑制写入 cmd.exe 窗口的一些信息。

【问题讨论】:

  • 您在您的 IWebDriver 中尝试过.Quit() 吗?在最后的拆解中尝试一下。它将关闭浏览器并结束驱动进程。
  • 我没有。 Quit() 完成了这项工作。谢谢!
  • @Striter Alfa:为什么不发表您的评论作为答案?

标签: c# internet-explorer selenium selenium-webdriver automation


【解决方案1】:

为了补充awser,一些关于主题的信息。您可以根据需要使用 3 种主要方法:

.Close(): - 此方法用于关闭当前打开的窗口。它关闭驱动程序关注的当前打开的窗口。

.Quit(): - 该方法用于销毁WebDriver的实例。它关闭与该驱动程序关联的所有浏览器窗口并安全地结束会话。 Quit() 调用 Dispose 方法来实现这一点。

.Dispose(): - 此方法关闭所有浏览器窗口并安全结束会话 强调文字

在你的情况下,由于你需要终止进程,最好的选择是使用.Quit()

有时,当您的 selenium 实例崩溃时,您无法结束进程,当前和所有下一个测试开始失败,甚至当您取消当前的调试测试套件时。在这种情况下,您确实需要终止该进程。

正如@Prateek 所见,其中一个正在使用Runtime.getRuntime()。在 C# 中,更好的方法是:

foreach (var proc in Process.GetProcessesByName("IEDriverServer"))
{
    proc.Kill();
}

您可以在启动 WebDriver 的构造函数中使用它(但在启动它之前!),或者,如果您使用某个库作为 NUnit,您可以创建一个全局 OneTimeSetUp。一种在所有测试前只运行一次的方法。

另外,如果你不喜欢添加代码或创建新方法来完成这项工作,你可以在你的 main .csproj 中配置 pre-buildpost-build 来执行你的 cmd 命令。每当您运行测试或构建项目时,它都会杀死打开的 webdriver 实例。

要配置它,您需要:

  1. .csproj 中的右键并单击“属性”;

  2. 导航到“构建事件”;

  3. 将命令 taskkill /f /fi "pid gt 0" /im IEDriverServer.exe 粘贴到预构建文本区域、构建后或两者中。

【讨论】:

  • 顺便说一句,对 Edge 使用 taskkill /f /fi "pid gt 0" /im MicrosoftWebDriver.exe。
【解决方案2】:

有两种方式:

  1. 按照 cmets 的建议,driver.quit() 将完成这项工作。

  2. 但有时我们的测试失败并且驱动程序继续运行。为避免出现多个驱动程序实例,您可以使用:Runtime.getRuntime().exec("taskkill /T /F /IM IEDriverServer.exe");

使用此命令的好处是,即使您的脚本没有完全运行,它仍然会杀死驱动程序。

您可以在许多地方使用它。例如:

  1. 如果您使用诸如 TestNG 之类的框架,您可以覆盖 onTestFailure()。
  2. 您可以在测试开始时添加它,这样如果有任何实例已经打开,它们就会被杀死。
  3. 或者你可以在其他地方添加,比如catch块。

【讨论】:

    【解决方案3】:

    我认为你应该试试这个:

            InternetExplorerDriverService service = InternetExplorerDriverService.CreateDefaultService();
    
            service.Start();
    
            IWebDriver driver = new ThreadLocal<IWebDriver>(() => { return new InternetExplorerDriver(service); }).Value;
    
            int pid = service.ProcessId;
    
            // Do any automation you want with your driver...
    
            driver.Quit(); // it calls Dispose
            service.Dispose();
    
            // And if you want to ensure... :-)
    
            try { Process.GetProcessById(pid).Kill(); }
            catch { }
    

    请注意,它适用于 Chrome、Firefox 和其他驱动器!

    【讨论】:

    • 您的解决方案让我手动启动服务。我更喜欢基于驱动程序实例的解决方案。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多