C# 如何在运行InternetExplorerDriver测试后关闭IEDriverServer.exe控制台窗口

C# 如何在运行InternetExplorerDriver测试后关闭IEDriverServer.exe控制台窗口,c#,internet-explorer,selenium,selenium-webdriver,automation,C#,Internet Explorer,Selenium,Selenium Webdriver,Automation,我正在通过VisualStudio单元测试运行SeleniumWebDriver,并使用InternetExplorerDriver。这将在控制台窗口中激发IEDriverServer.exe 这非常有效,测试也会执行。一旦测试执行完成,我希望cmd.exe窗口被关闭,这样我就不必手动清理它了。我有成千上万的测试,所以你可以想象管理这个的头痛 是否有一种优雅的方法来处理此问题,而不必执行测试后的操作,并使用kill.exe终止cmd.exe进程,等等?我尝试过InternetExplorerDr

我正在通过VisualStudio单元测试运行SeleniumWebDriver,并使用InternetExplorerDriver。这将在控制台窗口中激发IEDriverServer.exe

这非常有效,测试也会执行。一旦测试执行完成,我希望cmd.exe窗口被关闭,这样我就不必手动清理它了。我有成千上万的测试,所以你可以想象管理这个的头痛

是否有一种优雅的方法来处理此问题,而不必执行测试后的操作,并使用kill.exe终止cmd.exe进程,等等?我尝试过InternetExplorerDriversService.HideCommandPromptWindow=true,但它只是在隐藏模式下运行cmd.exe,并让进程一直运行,直到手动终止。我还尝试了InternetExplorerDriversService.SuppressInitialDiagnosticInformation,所做的只是抑制写入cmd.exe窗口的一些信息。

有两种方法:

  • 正如注释
    driver.quit()
    中所建议的那样,将完成此工作

  • 但有时我们的测试失败了,驱动程序继续运行。为了避免有多个驱动程序实例,可以使用:
    Runtime.getRuntime().exec(“taskkill/T/F/IM IEDriverServer.exe”)

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

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

  • 如果您使用的是TestNG之类的框架,则可以重写onTestFailure()
  • 您可以在测试开始时添加它,这样,如果有任何实例已经打开,它们将被终止
  • 也可以在其他位置添加,例如catch block

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

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

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

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

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

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

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

    foreach (var proc in Process.GetProcessesByName("IEDriverServer"))
    {
        proc.Kill();
    }
    
    您可以在启动WebDriver的构造函数中使用它(但在启动之前!),或者,如果您将某些库用作NUnit,则可以创建一个全局OneTimeSetUp。一种在所有测试之前只运行一次的方法

    此外,如果您不想输入代码或创建新方法来执行此任务,可以在yout main.csproj中配置
    预编译
    后编译
    ,以执行cmd命令。无论何时运行测试或构建项目,它都会杀死打开的webdriver实例

    要配置它,您需要:

  • 在.csproj中单击鼠标右键,然后单击“属性”

  • 导航到“构建事件”

  • 将命令
    taskkill/f/fi“pid gt 0”/im IEDriverServer.exe
    粘贴到预编译文本区域、编译后或两者中


  • 我想你应该试试这个:

            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 { }
    
    InternetExplorerDriverService服务=InternetExplorerDriverService.CreateDefaultService();
    service.Start();
    IWebDriver driver=new ThreadLocal(()=>{返回新的InternetExplorerDriver(服务);});
    intpid=service.ProcessId;
    //对您的驱动程序执行任何您想要的自动化操作。。。
    driver.Quit();//它叫Dispose
    service.Dispose();
    //如果你想确保…:-)
    请尝试{Process.GetProcessById(pid.Kill();}
    捕获{}
    

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

    您是否在IWebDriver中尝试了
    .Quit()
    ?在最后一次拆卸时尝试一下。它将关闭浏览器并结束驱动程序进程。我没有。Quit()完成了任务。谢谢大家!@斯特里特·阿尔法:为什么不发表你的评论作为答案呢?顺便说一句,使用taskkill/f/fi“pid gt 0”/im MicrosoftWebDriver.exe作为Edge。你的解决方案让我手动启动服务。我更喜欢基于驱动程序实例的解决方案。