隐藏

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

发布:2020/9/24 16:02:47作者:管理员 来源:本站 浏览次数:917

最近在做一个通用爬虫程序,我使用的是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服务已关闭。