setHtml is definitely asynchronous, as the WebKit/Blink architecture uses a separate process for the web content processing.
loadFinished() should however be the indicator of when the web content has been loaded.
Maybe the web content executes scripts as well which change the DOM tree after load?
Cheers,
_
Bookmarks