如何获取WebView2加载的网页源码并写入DataGridView指定单元格
问题根源
- 你调用的
ExecuteScriptAsync是异步方法,返回的是Task(Of String)类型,直接调用ToString只会输出类型名称,不会拿到实际执行结果,也不会等待方法执行完成 - 你注释了给WebView2设置Source加载URL的代码,而且就算启用这行代码,也没有等待页面加载完成的逻辑,直接执行拿源码的操作当然拿不到正确内容
- 你没有处理异步等待逻辑,导致单元格赋值操作早于页面加载、JS执行步骤完成
修正后代码
' 首先给按钮点击事件添加Async修饰符 Private Async Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click Dim rowindex As Integer = DataGridView1.CurrentCell.RowIndex Dim targetUrl As String = DataGridView1.Rows(rowindex).Cells(0).Value.ToString() ' 自动补全URL前缀,避免缺http/https导致加载失败 If Not targetUrl.StartsWith("http") Then targetUrl = "https://" & targetUrl End If Try ' 等待WebView2运行环境初始化完成 Await WebView21.EnsureCoreWebView2Async() ' 用TaskCompletionSource监听页面加载状态 Dim tcs As New TaskCompletionSource(Of Boolean) Dim navHandler As EventHandler(Of CoreWebView2NavigationCompletedEventArgs) = Sub(s, args) If args.IsSuccess Then tcs.TrySetResult(True) Else tcs.TrySetException(New Exception($"页面加载失败,错误码:{args.WebErrorStatus}")) End If End Sub AddHandler WebView21.CoreWebView2.NavigationCompleted, navHandler Try ' 触发页面导航 WebView21.CoreWebView2.Navigate(targetUrl) ' 等待页面加载完成后再执行后续逻辑 Await tcs.Task Finally ' 及时移除事件绑定,避免内存泄漏 RemoveHandler WebView21.CoreWebView2.NavigationCompleted, navHandler End Try ' 等待JS执行完成,拿到页面源码结果 Dim src As String = Await WebView21.CoreWebView2.ExecuteScriptAsync("new XMLSerializer().serializeToString(document);") ' 处理返回字符串的转义和首尾引号 src = System.Text.RegularExpressions.Regex.Unescape(src) src = src.Trim(""""c) ' 赋值到目标单元格 DataGridView1.Rows(rowindex).Cells(4).Value = src Catch ex As Exception DataGridView1.Rows(rowindex).Cells(4).Value = $"处理失败:{ex.Message}" End Try End Sub
注意事项
- 批量加载场景不要用循环直接连续触发导航,需要等上一行的加载、取值、赋值逻辑全部执行完成后,再处理下一行,避免导航冲突
- 如果页面包含懒加载内容,可以在执行获取源码的JS前添加适当延迟,或者增加等待指定元素出现的逻辑,保证拿到完整源码
- 若WebView2已提前初始化完成,可以移除重复的
EnsureCoreWebView2Async调用,提升执行效率
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

