Why is WebBrowser_DocumentCompleted() firing twice?
You can check the WebBrowser.ReadyState when the event is fired: if (browser.ReadyState != WebBrowserReadyState.Complete) return; ReadyState will be set to Complete once the whole document is ready.