C#: WebBrowser vs Gecko vs Awesomium vs OpenWebKitSharp:如何选择和使用
4种浏览器引擎和控件的比较+一些使用技巧(包含在附件项目和提示文本中)。简洁明了。
Gecko & WebKit 示例正在构建中,但已可用,可作为良好的起点
它们都是什么?
WebBrowser
- 默认的 .NET 浏览器引擎。
- 基于
MSHTML
+Active-X
控件,该控件基于 COMIWebBrowser2
。MSHTML
+IWebBrowser2
是 Internet Explorer 浏览器的主要组件。 - 拥有不同的 Winforms 和 WPF 版本。
Gecko
- 第三方浏览器引擎。
- 基于 XULRunner,用于 Firefox 浏览器。
- 仅有Winforms版本。
警告!此提示完全仅适用于非常非常旧的 Gecko 版本(1.9)。我将在稍后更新为更新、更强大的版本(可能为 10.*..29.*)。
Awesomium WebControl
- 第三方浏览器控件,具有外部可定制的核心。
- 基于 .NET Awesomium 核心封装,该封装基于 Awesomium 核心,而 Awesomium 核心基于修改后的Chromium(或 WebKit)引擎。
- 拥有不同的 Winforms, WPF, Mono 版本。
OpenWebKitSharp
- 第三方浏览器引擎。
- 基于 WebKit 引擎,用于Safari 和Chromium 浏览器。
- 仅有Winforms版本。
EO.WebBrowser
- 第三方浏览器引擎。
- 基于Chromium项目。
- 拥有Winforms和 WPF版本。
哪个更好?
没有!编程语言、框架、引擎通常只会在特定目的下“更好”。
您可以定义您的目标,权衡下表中列出的引擎的优缺点,然后选择最适合您的引擎。
提示:此提示的宽度非常大。表格可能无法完全显示在浏览器窗口中。如果您使用固定布局,建议将其更改为流式布局。
改回固定布局.
WebBrowser | Gecko | Awesomium | OpenWebKitSharp | EO.WebBrowser | |
许可证 | 免费。闭源 | 免费。开源:MPL 1.1/GPL 2.0/LGPL 2.1 | 如果您的收入 up 高达 10 万美元(或花费 2900 美元)则免费。 闭源 |
免费。开源 | 带有通知广告的免费试用版。闭源 |
操作系统/平台 | Winforms, WPF | Winforms | Winforms, WPF 跨平台 Unity, Mono, SDL |
Winforms. 跨平台:? | Winforms, WPF |
CPU | Any CPU | ? | x86 | ? | Any CPU |
页面加载速度 | 低功耗 | 中等(?)。创建控件时可能会冻结窗体几秒钟 | 高 | 高 | 高 |
所需 DLL 文件大小 | 0 MB(包含在 Windows 中) | 22.4 MB | 40.5 MB | 64.6 MB | ? |
页面加载时 不冻结 GUI |
否 | 否 | 是 | 否 | 是,除了第一次加载 |
最低 .NET 版本 | .NET 2.0 或更旧版本 | .NET 2.0 或更旧版本 | .NET 4.0 | ? | ? |
对象、方法、属性模型 |
- | 与 WebBrowser 相同 | 与 WebBrowser 不同 | 与 WebBrowser 相同,但非常不完善,许多方法和属性无法工作! | ? |
DOM 操作 - 设置 HTML | 是 | 是 | 是 | 仅通过 Js | ? |
DOM 操作 - 获取 HTML | 是 | 是 | 是,但无法处理 禁用的 JS!另外,有一个 bug,请使用 JS 模拟 - document.documentElement. |
仅通过 Js | ? |
DOM - GetElementById | 是 | 是 | 仅通过 Js | ? | ? |
DOM - GetElementsByClassName | 仅通过 Js | 是 | 仅通过 Js | ? | ? |
DOM - GetElementsByTagName | 是 | 是 | 仅通过 Js | ? | ? |
注入 + 执行 / 执行 Js | 注入 + 执行 | 是,在新版本中 | Exec | Exec | ? |
禁用 Js | 否,仅在所有 IE 级别生效 | 是 | 是 | ? | ? |
设置代理 | 否,仅在所有 IE 级别生效 | 是 | 是 | ? | ? |
开发 - 内置 Visual HTML Builder | 是 | ? | 否 | 否 | ? |
开发 - HTML 代码语法高亮查看器 | 否 | ? | 是 | 是 | ? |
开发 - HTML 代码可视化检查器和编辑器 | 否 | ? | 否 | 是 | 是 |
内置下载管理器 | ? | ? | ? | 是 | ? |
WebBrowser 使用和技巧
内置 Visual HTML 编辑器
如何启用它
webBrowser1.Document.DomDocument.GetType().GetProperty("designMode").SetValue
(webBrowser1.Document.DomDocument, "On", null);
如何以编程方式粘贴 HTML 元素
// appends:
// <a id="mylink" href="http://codeproject.com/">
// <img id="myimg"
// src="http://dj9okeyxktdvd.cloudfront.net/App_Themes/CodeProject/Img/logo250x135.gif" />
// </a>
var mylink = webBrowser1.Document.CreateElement("a");
mylink.Id = "mylink";
mylink.SetAttribute("href", "http://codeproject.com/");
var myimg = webBrowser1.Document.CreateElement("img");
myimg.Id = "myimg";
myimg.SetAttribute("src",
"http://dj9okeyxktdvd.cloudfront.net/App_Themes/CodeProject/Img/logo250x135.gif");
mylink.AppendChild(myimg);
webBrowser1.Document.Body.AppendChild(mylink);
DOM 元素选择 - GetElementById
var id = "mylink";
var el = webBrowser1.Document.GetElementById(id);
if (el != null)
{
MessageBox.Show("Element with id=\"" + id + "\" has innerHTML: " + el.InnerHtml);
}
else
{
MessageBox.Show("Element with id=\"" + id + "\" not found.");
}
DOM 元素选择 - GetElementsByTagName
var tag = "img";
var elz = webBrowser1.Document.GetElementsByTagName(tag);
if (elz.Count > 0)
{
MessageBox.Show(elz.Count + " elements with tag <" + tag + "> found.");
}
else
{
MessageBox.Show("No elements with tag <" + tag + "> found.");
}
DOM 内容操作 - 设置 HTML
webBrowser1.DocumentText = "<html><head><script>alert('check!');
</script></head><body>lorem</body></html>";
注入 + 执行 Js
var head = webBrowser1.Document.GetElementsByTagName("head")[0];
var scriptEl = webBrowser1.Document.CreateElement("script");
scriptEl.SetAttribute("text", "function sayHello() { alert('hello') }");
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("sayHello");
Gecko 使用和技巧
DOM 内容操作 - 设置 HTML
geckoWebBrowser1.Document.DocumentElement.InnerHtml =
"<html><head></head><body>
<a class=\"link\">f</a></body></html>";
DOM 元素选择 - GetElementsByClassName
(geckoWebBrowser1.Document.GetElementsByClassName("link")[0] as
Skybound.Gecko.GeckoElement).InnerHtml = "tt";
Awesomium WebControl 使用和技巧
DOM 内容操作 - 设置 HTML
webControl1.HTML = "<html><head><script>alert
('check!');</script></head><body>lorem</body></html>";
DOM 内容操作 - 获取 HTML
var allhtml = webControl1.ExecuteJavascriptWithResult
("document.documentElement.outerHTML");
执行 Js
webControl1.ExecuteJavascript
("document.body.innerHTML += '<i>Hello, World!</i>';");
禁用 Js
var ws = WebCore.CreateWebSession(new WebPreferences() { Javascript = true });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);
设置代理
var ws = WebCore.CreateWebSession(new WebPreferences()
{ ProxyConfig = "255.255.255:8080" });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);
OpenWebKitSharp 使用和技巧
DOM 内容操作 - 设置 HTML
webKitBrowser1.GetScriptManager.EvaluateScript("document.body.innerHTML='';");