在VB2010中使用WebBrowser控件时,当页面包含Ajax异步加载内容时,直接获取Document属性可能无法获取完整内容,因为Ajax是异步加载的。
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
' 确保是所有框架都加载完成
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
' 获取完整的HTML内容
Dim htmlContent As String = WebBrowser1.Document.Body.OuterHtml
' 或者获取整个文档
' Dim htmlContent As String = WebBrowser1.Document.DocumentElement.OuterHtml
' 在这里处理获取到的HTML内容
MessageBox.Show("页面加载完成,HTML内容已获取")
End If
End Sub
' 添加一个Timer控件Timer1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
WebBrowser1.Navigate("http://example.com")
Timer1.Interval = 1000 ' 1秒检查一次
Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
' 检查特定元素是否存在或内容是否变化
If WebBrowser1.Document IsNot Nothing AndAlso WebBrowser1.Document.Body IsNot Nothing Then
Dim element = WebBrowser1.Document.GetElementById("ajaxContent")
If element IsNot Nothing AndAlso element.InnerHtml.Contains("expected content") Then
Timer1.Stop()
Dim htmlContent As String = WebBrowser1.Document.Body.OuterHtml
' 处理获取到的HTML内容
End If
End If
End Sub
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
' 注入JavaScript来监听Ajax请求完成
Dim head As HtmlElement = WebBrowser1.Document.GetElementsByTagName("head")(0)
Dim scriptEl As HtmlElement = WebBrowser1.Document.CreateElement("script")
Dim element As IHTMLScriptElement = DirectCast(scriptEl.DomElement, IHTMLScriptElement)
element.text = "
var oldXHROpen = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
this.addEventListener('load', function() {
window.external.AjaxComplete();
});
return oldXHROpen.apply(this, arguments);
}
"
head.AppendChild(scriptEl)
End If
End Sub
' 需要在类中添加以下代码
<System.Runtime.InteropServices.ComVisibleAttribute(True)>
Public Class ExternalMethods
Public Sub AjaxComplete()
' Ajax请求完成时调用
Dim htmlContent As String = WebBrowser1.Document.Body.OuterHtml
' 处理获取到的HTML内容
End Sub
End Class
' 在Form_Load中设置
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
WebBrowser1.ObjectForScripting = New ExternalMethods()
End Sub
没有搜到相关的文章