隐藏

C# Selenium的ChromeDriver无法关闭解决方案

发布:2021/2/19 16:21:28作者:管理员 来源:本站 浏览次数:1401

最近在做一个通用爬虫程序,我使用的是C#语言,用的是Selenium的ChromeDriver,这个开源组件的确好用,感谢Selenium开发者!

废话不多说,进入正题,我遇到了ChromeDriver无法关闭的问题,很头疼,先描述一下我的情况和代码结构:


var chromeDriverService = ChromeDriverService.CreateDefaultService();

OpenQA.Selenium.Chrome.ChromeOptions options = new OpenQA.Selenium.Chrome.ChromeOptions();

//options.AddArgument("enable-automation");

options.AddArgument("disable-infobars");

options.AddArgument("--no-sandbox");

options.AddArgument("disable-extensions");

//options.AddArgument("–window-size=1024,1024");

options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36");

options.AddArgument("--ignore-certificate-errors");

options.AddArgument("--ignore-ssl-errors");

//隐藏命令窗口

using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeDriverService, options)){

    try {

//业务逻辑

}

catch (Exception ex) {

       ConsoleLog(ex.Message);

       CloseChromeDriver(driver);

}

}

这是我目前代码结构,chromedriver对象我使用using引起来了,在程序运行正常不报错的情况下,运行完毕之后,通过using可以使chromedriver和那个黑窗口顺利关闭,但是一旦报错,及时代码出了using代码范围,chromedriver和黑窗口也不会自动关闭,所以在报错的catch里面我使用了driver.quit(),但是没有任何作用,还是关闭不了,在网上查了N多方法,这个问题我一直在网上找各种解决方法,从晚上10点到凌晨4点,各种方法尝试遍了,无果!看着外面黑乎乎的夜空和一烟灰缸的烟头,操,一股怒火油然而生,我他么还真拿你没办法么?一怒之下,使出下三滥的方法,三下五除二解决了这个问题。具体看下面:

using System.Runtime.InteropServices;

[DllImport("user32.dll", EntryPoint = "FindWindow")]

private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SendMessage")]

public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

public const int SW_HIDE = 0;

public const int SW_SHOW = 5;

[DllImport("user32.dll", EntryPoint = "ShowWindow")]

public static extern int ShowWindow(IntPtr hwnd,int nCmdShow);

/// <summary>

/// 获取窗口句柄

/// </summary>

/// <returns></returns>

public IntPtr GetWindowHandle() {

   string name = (Environment.CurrentDirectory + "\\chromedriver.exe");

   IntPtr hwd = FindWindow(null, name);

   return hwd;

}

/// <summary>

/// 关闭chromedriver窗口

/// </summary>

public void CloseWindow(){

   try{

       IntPtr hwd = GetWindowHandle();

       SendMessage(hwd, 0x10, 0, 0);

   }

   catch { }

}

/// <summary>

/// 退出chromedriver

/// </summary>

/// <param name="driver"></param>

public void CloseChromeDriver(IWebDriver driver) {

   try{

       driver.Quit();

       driver.Dispose();

   }

   catch { }

   CloseWindow();

}

对!你没看错,就是windows API,万物之源的API,API一上,问题立马解决,我居然解决了好多人无法解决的问题,心中大快!

在catch里面调用这个方法就可以了CloseChromeDriver,在这个方法里面记得调用driver.quit(),为的是在黑色窗口关闭前要确保chromedriver服务已关闭。