Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / DevOps / automation

C#: WebBrowser vs Gecko vs Awesomium vs OpenWebKitSharp: What To Choose And How to Use

4.90/5 (38 votes)
1 Feb 2015CPOL3 min read 364.3K   19.9K  
Comparison of 4 browser engines and controls + some tips for using them (in attached projects and in tip text). Short and clear.

Gecko & WebKit samples are under construction now, but are already working and may be used as a good start:

Who is Who?

WebBrowser

  • Default .NET browser engine.
  • Based on MSHTML + Active-X control based on COM IWebBrowser2. MSHTML+IWebBrowser2 are main components of Internet Explorer browser.
  • Has different Winforms and WPF ports.

Gecko

  • Third-party browser engine.
  • Based on XULRunner used in Firefox browser.
  • Has Winforms version only.

Warning! This tip is fully actually only for very, very old Gecko version (1.9). I'll change it to a newer and more powerful version (10.*..29.* probably), a bit later.

Awesomium WebControl

  • Third-party browser control with external customizable core.
  • Based on .NET Awesomium core wrapper based on Awesomium core based on modified Chromium (or WebKit) engine.
  • Has different Winforms, WPF, Mono ports.

OpenWebKitSharp

  • Third-party browser engine.
  • Based on WebKit engine used in Safari and Chromium browsers.
  • Has Winforms version only.

EO.WebBrowser

  • Third-party browser engine.
  • Based on Chromium project.
  • Has Winforms and WPF ports.

Who is Better?

Nobody! Programming language, framework, engine usually may be better only for a particular purpose.

You can define your objectives, weigh the pros and cons of engines listed in the table below, and select the engine, the best for you.

Tip: This tip has an extremely large width. Table can be not placed in browser window. If you use a fixed layout, it's recommended to change it to fluid.
Change it back to fixed.

  WebBrowser Gecko Awesomium OpenWebKitSharp EO.WebBrowser
License Free. Proprietary Free. Open-source: MPL 1.1/GPL 2.0/LGPL 2.1 Free if your revenue up
to $100K (or costs $2900).
Proprietary
Free. Open-source Free trial version with notification ads. Proprietary
OS/Platforms Winforms, WPF Winforms Winforms, WPF Cross-platform:
Unity, Mono, SDL
Winforms. Cross-platform: ? Winforms, WPF
CPU Any CPU ? x86 ? Any CPU
Page loading speed Low Medium (?). Control can freezing the form for few seconds on its create High High High
Required dlls size 0 MB (included in Win) 22.4 MB 40.5 MB 64.6 MB ?
Not freezing GUI
when page loads
No No Yes No Yes, excepts a 1st load
Minimal .NET Version .NET 2.0 or more older .NET 2.0 or more older .NET 4.0 ? ?

Object, method, property model

- WebBrowser-identical Not WebBrowser-identical WebBrowser-identical, but very unfinished, many methods and properties not working! ?
DOM manipulate - set HTML Yes Yes Yes Via Js only ?
DOM manipulate - get HTML Yes Yes Yes, but don't work with
disabled JS! Also, there is a bug, use JS analogue -
document.documentElement.<br />
			outerHTML
Via Js only ?
DOM - GetElementById Yes Yes Via Js only ? ?
DOM - GetElementsByClassName Via Js only Yes Via Js only ? ?
DOM - GetElementsByTagName Yes Yes Via Js only ? ?
Inject + exec / exec Js Inject + exec Yes, in newer versions Exec Exec ?
Disable Js No, only on all-IE level Yes Yes ? ?
Set proxy No, only on all-IE level Yes Yes ? ?
Dev - Built-in Visual HTML Builder Yes ? No No ?
Dev - HTML code syntax-hl viewer No ? Yes Yes ?
Dev - HTML code Visual Inspector & Editor No ? No Yes Yes
Built-in download manager ? ? ? Yes ?

WebBrowser Usage and Tricks

Built-in Visual HTML Editor

How to enable it:

C#
webBrowser1.Document.DomDocument.GetType().GetProperty("designMode").SetValue
    (webBrowser1.Document.DomDocument, "On", null);

How to paste HTML element programmatically:

C#
// 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 element selection - GetElementById

C#
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 element selection - GetElementsByTagName

C#
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 content manipulate - set HTML

C#
webBrowser1.DocumentText = "<html><head><script>alert('check!');
</script></head><body>lorem</body></html>";

Inject + exec Js

C#
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 Usage and Tricks

DOM content manipulate - set HTML

C#
geckoWebBrowser1.Document.DocumentElement.InnerHtml = 
"<html><head></head><body>
<a class=\"link\">f</a></body></html>";

DOM element selection - GetElementsByClassName

C#
(geckoWebBrowser1.Document.GetElementsByClassName("link")[0] as 
    Skybound.Gecko.GeckoElement).InnerHtml = "tt";

Awesomium WebControl Usage and Tricks

DOM content manipulate - set HTML

C#
webControl1.HTML = "<html><head><script>alert
('check!');</script></head><body>lorem</body></html>";

DOM content manipulate - get HTML

C#
var allhtml = webControl1.ExecuteJavascriptWithResult
    ("document.documentElement.outerHTML");

Exec Js

C#
webControl1.ExecuteJavascript
("document.body.innerHTML += '<i>Hello, World!</i>';");

Disable Js

C#
var ws = WebCore.CreateWebSession(new WebPreferences() { Javascript = true });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);

Set proxy

C#
var ws = WebCore.CreateWebSession(new WebPreferences() 
{ ProxyConfig = "255.255.255:8080" });
webControl1 = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
this.Controls.Add(webControl1);

OpenWebKitSharp Usage and Tricks

DOM content manipulate - set HTML

C#
webKitBrowser1.GetScriptManager.EvaluateScript("document.body.innerHTML='';");

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)