首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WPF WebBrowser 獲取跳轉後頁面源碼:NavigationCompleted 事件與 Document 物件

     編輯:程式設計綜合問答

問題

`LoadCompleted` 事件觸發時,`WebBrowser.Document` 仍為**跳轉前**的頁面 (含 JS `location.replace` 的來源頁),無法直接取得目標頁 HTML。

解決方案:監聽 Navigated / NavigationCompleted 事件

public MainWindow() {
    InitializeComponent();
    webBrowser.Navigated += WebBrowser_Navigated; // 或 NavigationCompleted (需 .NET 4.6+)
    webBrowser.Navigate("https://example.com/pageA");
}

private void WebBrowser_Navigated(object sender, NavigationEventArgs e) {
    // e.Uri 為**最終導向後的實際網址**
    string finalUrl = e.Uri.ToString();
    Console.WriteLine("最終 URL: " + finalUrl);

    // 取得文檔內容 (需等待 Document 完全載入)
    if (webBrowser.Document != null) {
        // 方法 1: MSHTML (需參考 Microsoft.mshtml)
        dynamic doc = webBrowser.Document;
        string html = doc.documentElement.outerHTML;
        Console.WriteLine("HTML 長度: " + html.Length);

        // 方法 2: 另存為字串 (無需 MSHTML)
        // webBrowser.SaveAs("page.html", System.Windows.Forms.WebBrowserSaveType.HTML);
    }
}

關鍵點

  • `NavigationEventArgs.Uri` **即為跳轉後的真實 URL**,無需解析 JS。
  • `WebBrowser.Document` 在 `Navigated` 後已更新為新頁面 DOM,可直接存取。
  • 若頁面含 **iframe 跨域**,`outerHTML` 可能拋安全性例外,需 `try-catch`。

替代方案:CefSharp (Chromium 嵌入)

WPF 原生 `WebBrowser` 基於 IE 內核,**已淘汰**、不支援現代 JS/CSS。建議改用 **CefSharp.Wpf** (NuGet) 獲得完整 Chromium 渲染、DevTools、非同步 DOM 操作:

// CefSharp 範例
var browser = new ChromiumWebBrowser("https://example.com");
browser.FrameLoadEnd += (s, e) => {
    if (e.Frame.IsMain) {
        string html = await e.Frame.GetSourceAsync(); // 非同步取得完整 HTML
        // 處理 html...
    }
};
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved