You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:00