专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

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

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:45:02       共计:3634 浏览

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

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:selenium初探:WebDriverException解决方法探索(以Chrome浏览器|IE浏览器|Edge浏览器为例) | ·下一条:IIs6如何让html文件经过asp.net管道处理

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有