我正在使用Awesomium 1.7.0.5来加载页面,填充一些文本框并单击按钮。我正在尝试使用此线程中的示例来填充文本框:http://answers.awesomium.com/questions/857/webcontrol-type-in-webbrowser.html
这是我的代码(我正在使用WPF控件):
private void WbAwsOnDocumentReady(object sender, UrlEventArgs urlEventArgs)
{
if (wbAws == null || !wbAws.IsLive)
return;
//Thread.Sleep(555);
dynamic document = (JSObject)wbAws.ExecuteJavascriptWithResult("document");
if (document == null)
return;
using (document)
{
dynamic textbox = document.getElementById("email");
if (textbox == null)
return;
using (textbox)
{
textbox.value = "gaaffa";
}
}
}
它可以工作,但只能使用Thread.Sleep 0.1-0.5秒。否则,文档为空(非空)和/或文本框为空。我该怎么办?为什么在DocumentReadyEvent中没有准备好?
这是我解决它的方式:
WbAws.LoadingFrameCompleted += OnLoadingFrameCompleted;
WbAws.Source = new Uri("http://google.com");
private void OnLoadingFrameCompleted(...)
{
if (webView == null || !webView.IsLive ||
webView.ParentView != null || !e.IsMainFrame)
return;
LoadingFrameCompleted -= OnLoadingFrameCompleted;
// do something
}
LoadingFrameCompleted而不是DocumentReady,因为它不仅在我需要时触发,而且在应用程序启动时触发,我在导航之前订阅它并在之后取消订阅。还检查它是IsMainFrame。
编辑:但是使用此解决方案有时会抛出文档未准备好的异常。所以我也在使用Thread.Sleep等待它。
很老的问题。但对于像我这样的人,正面临着这个问题 - 使用LoadingFrameCompleted
事件与WebControl.IsNavigating == false
和e.IsMainFrame == true
条件。如果在这个事件中这些条件成立,则页面加载完毕,您就可以获得HTML内容了。