Click here to Skip to main content
15,881,803 members
Articles / DevOps / Automation
Tip/Trick

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

Rate me:
Please Sign up or sign in to vote.
4.90/5 (38 votes)
1 Feb 2015CPOL3 min read 357.1K   19.8K   84   32
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)



Comments and Discussions

 
QuestionGecko to open pdf files Pin
EyalY9-Jan-17 2:10
EyalY9-Jan-17 2:10 
SuggestionAdd CefSharp details Pin
Member 1044748618-Feb-16 23:40
Member 1044748618-Feb-16 23:40 
QuestionMultiple profiles Pin
sjc99923-Sep-15 12:55
sjc99923-Sep-15 12:55 
QuestionCefSharp Pin
Cristanov210-Jul-15 1:20
Cristanov210-Jul-15 1:20 
QuestionOpenWebKitSharp code is missing Pin
Member 1136557415-Feb-15 9:14
Member 1136557415-Feb-15 9:14 
AnswerRe: OpenWebKitSharp code is missing Pin
naxer1425-Feb-15 16:32
naxer1425-Feb-15 16:32 
QuestionGeckoFX is actively developed and version 29 works great Pin
Sire4047-Jan-15 4:24
Sire4047-Jan-15 4:24 
AnswerRe: GeckoFX is actively developed and version 29 works great Pin
Emiliarge7-Jan-15 9:37
professionalEmiliarge7-Jan-15 9:37 
SuggestionWebBrowser and Proxy Pin
Markus Eßmayr7-Jan-15 2:05
Markus Eßmayr7-Jan-15 2:05 
QuestionEO.Webbrowser Pin
include767-Jan-15 1:46
include767-Jan-15 1:46 
GeneralRe: EO.Webbrowser Pin
GMariakis7-Jan-15 6:22
GMariakis7-Jan-15 6:22 
AnswerRe: EO.Webbrowser Pin
Emiliarge7-Jan-15 9:40
professionalEmiliarge7-Jan-15 9:40 
GeneralRe: EO.Webbrowser Pin
Member 1026752328-Jan-15 3:43
Member 1026752328-Jan-15 3:43 
QuestionwebRTC Pin
hynsey6-Jan-15 22:32
hynsey6-Jan-15 22:32 
AnswerRe: webRTC Pin
Emiliarge7-Jan-15 1:38
professionalEmiliarge7-Jan-15 1:38 
GeneralRe: webRTC Pin
hynsey8-Sep-15 3:14
hynsey8-Sep-15 3:14 
GeneralCoherent UI .Net Pin
nishantcop5-Jan-15 20:04
nishantcop5-Jan-15 20:04 
GeneralRe: Coherent UI .Net Pin
Emiliarge6-Jan-15 7:33
professionalEmiliarge6-Jan-15 7:33 
GeneralRe: Coherent UI .Net Pin
Emiliarge6-Jan-15 9:02
professionalEmiliarge6-Jan-15 9:02 
GeneralRe: Coherent UI .Net Pin
nishantcop12-Jan-15 22:31
nishantcop12-Jan-15 22:31 
GeneralRe: Coherent UI .Net Pin
nishantcop12-Jan-15 23:01
nishantcop12-Jan-15 23:01 
QuestionWhat about 64 bit support? Pin
i0028-Dec-14 3:30
i0028-Dec-14 3:30 
Add this maybe??

WebBrowserAwesomium
32/64 bit support32,64 (same dll)32


Also the WebBrowser control doesn't seem to freeze the interface when it loads?

Kris
AnswerRe: What about 64 bit support? Pin
Emiliarge28-Dec-14 5:42
professionalEmiliarge28-Dec-14 5:42 
AnswerRe: What about 64 bit support? Pin
ISanti29-Dec-14 3:29
ISanti29-Dec-14 3:29 
QuestionActually, there's a definitive answer to who is better Pin
Marc Clifton19-Dec-14 11:45
mvaMarc Clifton19-Dec-14 11:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.