C#:使用CefSharp(Chromium)开发多选项卡浏览器

1、开发场景

  • 在使用winform自带的webbrowser控件时,要考虑IE的版本以及HTML5的渲染问题,使用体验十分糟糕。毕竟webbrowser只是IE浏览器的一个包装壳罢了。
  • 因此,考虑使用chromium的开源版本,开发一个可以使用多种应用场景的浏览器控件。 经过几番周折,终于基于CefSharp完成了该控件的设计,并结合选项卡控件开发了一款“多选项卡浏览器”。
  • 此浏览器的基本功能和使用体验,接近Chrome浏览器,可以内嵌使用,可以用来做爬虫程序,可以与JavaScript交互进行自动化控制。
  • 但毕竟精力有限,还存在一些问题尚未解决。
    在这里插入图片描述

2、效果展示

在这里插入图片描述

3、开发环境

  • vs2017
  • .net framework 4.6.1
  • CefSharp版本:63.0.3
  • 选项卡控件:TabStrip.dll
  • winform进行窗体设计

4、实现功能

  1. 支持浏览器播放视频(这一点很关键)。
  2. 输入网址,打开网页。
  3. 浏览器的前进、回退功能。
  4. 点击网页链接,在新选项卡打开。
  5. 在新的窗口,打开当前网页。
  6. 按F12键,进行网页调试。
  7. 查看网页源代码。
  8. 浏览器右键菜单设计。
  9. ctrl+T 新建选项卡; ctrl+N 新建窗口;等常用快捷键的实现。
  10. 关闭左侧、右侧、其他选项卡。
  11. 与JavaScript的交互设计。
    在这里插入图片描述

5、关键说明

问题1:使用默认的cefsharp,编译后的浏览器无法播放视频。

因为cefsharp默认是不支持H.264编码,因此无法播放视频。
解决办法:
使用支持H.264编码的【cef.redist.x64.3.3239.1723】、【cef.redist.x86.3.3239.1723】替换Nuget下载安装使用的两个文件夹。
在这里插入图片描述
这里设置【cef.redist.x64.3.3239.1723】、【cef.redist.x86.3.3239.1723】编译的复杂性,因此自己编译对应版本很困难。不如直接替换。这也是选择“CefSharp版本:63.0.3”的原因。
这两个“支持H.264编码”的版本很难找,如有需要,可以联系我。

问题2:增加CefSharp对AnyCPU支持

使用Nuget安装CefSharp版本后,编译时会有Warning:提示不支持AnyCPU。

1、修改项目的csproj文件:将<CefSharpAnyCpuSupport> true </ CefSharpAnyCpuSupport>添加到项目中的第一个<PropertyGroup>配置节。
2、在生成=》配置管理器中,将活动解决方案平台改成 x86 (CEF不能自适应 x86 | x64,必须选择一个目标),目标平台也必须和解决方案平台一致。

问题3:对Cookie的管理

CefSharp以Chromium内核为基础进行封装,默认支持Cookie的保存,与常用浏览器并无区别。
只需在代码中指定Cache(缓存)的保存目录即可。
指定缓存目录后,会自动保存Cookie。

string cachePath = currentPath + @"\Cache";
CefSettings settings = new CefSettings
{
    IgnoreCertificateErrors = true, //忽略证书错误问题
    UserAgent = userAgent, //浏览器的请求头
    Locale = "zh-CN", // 将传递给Blink的语言环境字符串。如果为空,则将使用默认语言环境“ en-US”
    BrowserSubprocessPath = currentPath + @"\CefSharp.BrowserSubprocess.exe",
    AcceptLanguageList = "zh-CN,zh;q=0.8",//浏览器引擎的语言
    PersistSessionCookies = true,//保存回话
    CachePath = cachePath, //缓存文件保存目录:默认情况下,CEF使用内存缓存来保存缓存的数据,例如 要保留cookie,您需要指定一个缓存路径
};
Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);

指定缓存目录后,会自动保存Cookie。在此实现浏览器上登录账号,下次打开时,会维持登录状态。
在这里插入图片描述

6、部分代码说明

控制CefSharp浏览器中点击连接时的弹出位置,需要实现ILifeSpanHandler接口。
这也是实现多选项卡浏览器的关键。

    class C_LifeSpanHandler: ILifeSpanHandler
    {
        UserControlWebBrowser myForm;
        public C_LifeSpanHandler(UserControlWebBrowser myForm)
        {
            this.myForm = myForm;
        }

        public bool DoClose(IWebBrowser browserControl, IBrowser browser)
        {
            //throw new NotImplementedException();
            return false;
        }

        public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
        {
            //throw new NotImplementedException();
        }

        public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
        {
            //throw new NotImplementedException();
        }

        public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            //throw new NotImplementedException();
            // 目的是:在新标签页上,打开网页上的链接
            newBrowser = null;
            myForm.AddNewBrowserTab(targetUrl);
            return true;
            //return false;
        }
    }

关于浏览器的其他功能,也需要实现对应的接口。比如:

IDownloadHandler:与浏览器的下载功能有关。
IContextMenuHandler:与右键菜单功能有关。
IKeyboardHandler:与快捷键有关。

7、待解决问题:

  • CefSharp与JavaScript的交互资料很多,但本人JS功底一般,无法实现用js控制网页自动化的需求。
  • 类似Chrome浏览器插件的调用与支持,CefSharp官方资料提到的不多,因此暂时没办法解决。

CefSharp无法支持crx插件文件的调用,导致一些常用的比如”去广告插件“没办法使用,无法有效地去除”网页广告“。

浏览器插件的实质也是JavaScript的脚本实现,可以考虑CefSharp与js的交互,从而进行解决。
(如果有大神可以解决,可以联系我,交流一下咯!~)

8、源码下载

由于本次实现依赖文件比较多,尤其是支持H.264编码的【cef.redist.x64.3.3239.1723】、【cef.redist.x86.3.3239.1723】比较大,因此无法上传(csdn只能上传1000MB以内)。

如果有需要,可以私信我,或者加Q(见评论)!!!

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 36
    评论
您好,针对您的问题,CefSharp.Wpf 是一个基于 Chromium Embedded Framework(CEF)的 .NET 库,用于在 WPF 应用程序中嵌入浏览器。要实现多个浏览器隔离 Cookie,您可以在代码中创建多个 CefSharp.BrowserSubprocess 对象,并为每个对象设置独立的 cookie 存储路径。 具体实现步骤如下: 1. 在代码中创建多个 CefSharp.BrowserSubprocess 对象,例如: ``` var browser1 = new CefSharp.Wpf.ChromiumWebBrowser(); var browser2 = new CefSharp.Wpf.ChromiumWebBrowser(); ``` 2. 设置每个浏览器的 cookie 存储路径,例如: ``` browser1.BrowserSettings = new CefSharp.BrowserSettings { ApplicationCache = CefState.Disabled, WebSecurity = CefState.Enabled, FileAccessFromFileUrls = CefState.Enabled, UniversalAccessFromFileUrls = CefState.Enabled, DefaultEncoding = "UTF-8", JavaScript = CefState.Enabled, JavaScriptAccessClipboard = CefState.Disabled, JavaScriptCloseWindows = CefState.Disabled, JavaScriptDomPaste = CefState.Disabled, LocalStorage = CefState.Enabled, Plugins = CefState.Enabled, RemoteFonts = CefState.Enabled, WebGl = CefState.Enabled, WebAudio = CefState.Enabled, FileAccessFromUrls = CefState.Enabled, ImageLoading = CefState.Enabled, TextAreaResize = CefState.Enabled, WebSecurityEnabled = true, CefCommandLineArgs = new Dictionary<string, string> { { "disable-gpu", "1" }, { "disable-gpu-compositing", "1" }, { "disable-software-rasterizer", "1" } }, PersistSessionCookies = true, FilePath = @"C:\Users\user1\AppData\Local\Temp\cefsharp_cookies1" }; browser2.BrowserSettings = new CefSharp.BrowserSettings { ApplicationCache = CefState.Disabled, WebSecurity = CefState.Enabled, FileAccessFromFileUrls = CefState.Enabled, UniversalAccessFromFileUrls = CefState.Enabled, DefaultEncoding = "UTF-8", JavaScript = CefState.Enabled, JavaScriptAccessClipboard = CefState.Disabled, JavaScriptCloseWindows = CefState.Disabled, JavaScriptDomPaste = CefState.Disabled, LocalStorage = CefState.Enabled, Plugins = CefState.Enabled, RemoteFonts = CefState.Enabled, WebGl = CefState.Enabled, WebAudio = CefState.Enabled, FileAccessFromUrls = CefState.Enabled, ImageLoading = CefState.Enabled, TextAreaResize = CefState.Enabled, WebSecurityEnabled = true, CefCommandLineArgs = new Dictionary<string, string> { { "disable-gpu", "1" }, { "disable-gpu-compositing", "1" }, { "disable-software-rasterizer", "1" } }, PersistSessionCookies = true, FilePath = @"C:\Users\user1\AppData\Local\Temp\cefsharp_cookies2" }; ``` 3. 将浏览器对象添加到 WPF 窗口中,例如: ``` grid.Children.Add(browser1); grid.Children.Add(browser2); ``` 通过以上步骤,您就可以实现多个浏览器隔离 Cookie 的功能了。需要注意的是,每个浏览器的 cookie 存储路径应该是独立的,以避免 cookie 冲突。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指尖码动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值