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

C++/WinRT WinUI3:使用WebView2获取网页Body文本无结果求助

问题分析与修复方案

你的代码存在几个关键问题,导致无法获取并显示网页Body文本:

  • WebView2未加入可视化树:你创建了WebView2实例,但没有将它添加到窗口的布局容器(比如Grid、StackPanel等)中。WebView2需要处于可视化树内才能正常触发页面加载流程,否则页面可能不会实际加载。
  • 未等待页面加载完成就执行脚本:EnsureCoreWebView2Async()仅保证CoreWebView2初始化完成,不代表页面已经加载完毕。此时执行ExecuteScriptAsync获取document.body.innerText,页面DOM可能还未渲染完成,导致返回空内容。
  • TextBlock是临时对象:TextBlock().Text(obj);创建了一个临时的TextBlock控件,没有添加到窗口的可视化树中,所以即使获取到内容也无法显示。
  • 提前关闭WebView2:在获取内容后立即调用web.close(),可能中断后续异步操作,且控件未加入可视化树的情况下,这个操作没有实际意义。

修复后的代码示例

假设你的窗口中有一个名为rootGrid的Grid作为主布局容器,修改后的代码如下:

winrt::Windows::Foundation::IAsyncAction MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    myButton().Content(box_value(L"Clicked"));

    // 创建WebView2并添加到可视化树
    winrt::Microsoft::UI::Xaml::Controls::WebView2 web;
    rootGrid().Children().Append(web);

    // 初始化CoreWebView2
    co_await web.EnsureCoreWebView2Async();
    
    // 订阅页面加载完成事件,确保DOM就绪后执行脚本
    auto navToken = web.NavigationCompleted([this, web](auto const&, WebView2NavigationCompletedEventArgs const& args)
    {
        if (args.IsSuccess())
        {
            // 异步执行脚本获取Body文本
            auto scriptTask = web.CoreWebView2().ExecuteScriptAsync(L"document.body.innerText");
            scriptTask.Completed([this](auto const& asyncOp, auto const& status)
            {
                if (status == winrt::Windows::Foundation::AsyncStatus::Completed)
                {
                    winrt::hstring bodyText = asyncOp.GetResults();
                    // 创建TextBlock并添加到可视化树显示内容
                    winrt::Microsoft::UI::Xaml::Controls::TextBlock textBlock;
                    textBlock.Text(bodyText);
                    textBlock.Margin(winrt::Microsoft::UI::Xaml::Thickness(10, 60, 10, 10)); // 避免被按钮遮挡
                    rootGrid().Children().Append(textBlock);
                }
            });
        }
    });

    // 设置要加载的网址
    std::wstring uriToLaunch{ L"http://www.bing.com" };
    Windows::Foundation::Uri uri{ uriToLaunch };
    web.Source(uri);
}

额外说明

  1. 布局容器配置:确保你的窗口布局中有一个命名的容器(如示例中的rootGrid),否则无法将WebView2和TextBlock添加到可视化树中。
  2. 页面加载事件:通过NavigationCompleted事件监听页面加载状态,能保证脚本在DOM完全就绪后执行,避免获取空内容。
  3. 异步任务处理:ExecuteScriptAsync是异步操作,需通过回调或co_await等待结果返回,再更新UI。

内容的提问来源于stack exchange,提问作者Extremeer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:45:28