如何在运行InternetExplorerDriver Selenium测试后终止IEDriverServer.exe控制台窗口

时间:2016-03-23 19:17:31

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

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

这很好用,测试执行。一旦测试执行完成,我就像cmd.exe窗口被杀死一样,以至于我不得不做手动清理。我有成千上万的测试,所以你可以想象管理它的头痛。

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

3 个答案:

答案 0 :(得分:10)

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

  

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

     

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

     

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

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

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

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

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

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

此外,如果您不想放置代码或创建新方法来完成此项工作,您可以在主要.csproj中配置pre-buildpost-build来执行cmd命令。无论何时运行测试或构建项目,都会终止打开的webdriver实例。

要进行配置,您需要:

  1. .csproj中的右键,然后点击"属性";

  2. 导航至"构建活动";

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

答案 1 :(得分:6)

有两种方法:

  1. 正如评论driver.quit()中所建议的那样。

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

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

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

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

答案 2 :(得分:0)

我想你应该试试这个:

        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和其他驱动器!