2016-03-09 12 views
7

Ich benutze aCefSharp.Wpf.ChromiumWebBrowser (Version 47.0.3.0), um eine Webseite zu laden. Irgendwann nach dem Laden der Seite möchte ich den Quellcode bekommen.Get HTML-Quellcode von CefSharp Web-Browser

Ich habe genannt:

wb.GetBrowser().MainFrame.GetSourceAsync() 

jedoch nicht alle den Quellcode zu sein scheint Rückkehr (ich glaube, das ist, weil es Kind Rahmen werden).

Wenn ich nennen:

wb.GetBrowser().MainFrame.ViewSource() 

Ich kann sehen, es den gesamten Quellcode Listen (einschließlich der Innenrahmen).

Ich möchte das gleiche Ergebnis wie ViewSource() erhalten. Kann mir bitte jemand in die richtige Richtung zeigen?

Update - Added-Code Beispiel

Hinweis: Die Adresse der Web-Browser auch zeigt wird nur funktionieren, bis zu und einschließlich 2016.10.03. Danach kann es andere Daten anzeigen, die ich nicht sehen würde.

Im frmSelection.xaml

<cefSharp:ChromiumWebBrowser Name="wb" Grid.Column="1" Grid.Row="0" /> 

In den frmSelection.xaml.cs

public partial class frmSelection : UserControl 
{ 
    private System.Windows.Threading.DispatcherTimer wbTimer = new System.Windows.Threading.DispatcherTimer(); 

    public frmSelection() 
    { 

     InitializeComponent(); 

     // This timer will start when a web page has been loaded. 
     // It will wait 4 seconds and then call wbTimer_Tick which 
     // will then see if data can be extracted from the web page. 
     wbTimer.Interval = new TimeSpan(0, 0, 4); 
     wbTimer.Tick += new EventHandler(wbTimer_Tick); 

     wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_"; 

     wb.FrameLoadEnd += new EventHandler<CefSharp.FrameLoadEndEventArgs>(wb_FrameLoadEnd); 

    } 

     void wb_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) 
     { 
      if (wbTimer.IsEnabled) 
       wbTimer.Stop(); 

      wbTimer.Start(); 
     } 

    void wbTimer_Tick(object sender, EventArgs e) 
    { 
     wbTimer.Stop(); 
     string html = GetHTMLFromWebBrowser(); 
    } 

    private string GetHTMLFromWebBrowser() 
    { 
     // call the ViewSource method which will open up notepad and display the html. 
     // this is just so I can compare it to the html returned in GetSourceAsync() 
     // This is displaying all the html code (including child frames) 
      wb.GetBrowser().MainFrame.ViewSource(); 

     // Get the html source code from the main Frame. 
      // This is displaying only code in the main frame and not any child frames of it. 
      Task<String> taskHtml = wb.GetBrowser().MainFrame.GetSourceAsync(); 

      string response = taskHtml.Result; 
    return response; 
    } 

} 
+0

Können Sie etwas mehr Code teilen? Ich kann Ihr Problem nicht reproduzieren, ich bekomme den gleichen Text mit 'GetSourceAsync' wie mit' ViewSource'. Versuchte es mit 'Address' eingestellt auf' http: // stackoverflow.com' (es hat zwei Frames, einen 'iframe' und den Hauptrahmen) –

+0

Danke für einen Blick. Ich habe eine Beispielquelle zum ursprünglichen Beitrag hinzugefügt. – Scott

Antwort

11

ich, dass ich ziemlich diese DispatcherTimer Lösung nicht bekommen, denken Datei einreichen. Ich würde es tun, wie folgt:

public frmSelection() 
{ 
    InitializeComponent(); 

    wb.FrameLoadEnd += WebBrowserFrameLoadEnded; 
    wb.Address = "http://www.racingpost.com/horses2/cards/card.sd?race_id=644222&r_date=2016-03-10#raceTabs=sc_"; 
} 

private void WebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e) 
{ 
    if (e.Frame.IsMain) 
    { 
     wb.ViewSource(); 
     wb.GetSourceAsync().ContinueWith(taskHtml => 
     { 
      var html = taskHtml.Result; 
     }); 
    } 
} 

ich ein diff auf der Ausgabe von ViewSource und dem Text in der html Variable hat, und sie sind die gleichen, also kann ich Ihr Problem hier nicht reproduzieren.

Das sagte, ich bemerkte, dass der Hauptrahmen ziemlich spät geladen wird, so dass Sie eine Weile warten müssen, bis der Notizblock mit der Quelle erscheint.

+0

Vielen Dank für die Rückmeldung zu meinem Code, ich habe Sinus aktualisiert, um Ihr Beispiel zu reflektieren. Ich habe den Code auf einem anderen Computer seit der Veröffentlichung des Beispiels ausgeführt und ich bekomme die gleichen Ergebnisse wie Sie (beide geben den vollständigen Quellcode zurück). Ich kann nur schlussfolgern, dass mit meiner Maschine etwas Seltsames vor sich geht, und ich werde darüber nachdenken, ein Format zu erstellen. – Scott

1

Ich hatte das gleiche Problem versucht, klicken Sie auf und Artikel in einem Rahmen und nicht auf dem Hauptrahmen. Am Beispiel in Ihrer Antwort, schrieb ich die folgende Erweiterungsmethode:

 public static IFrame GetFrame(this ChromiumWebBrowser browser, string FrameName) 
    { 
     IFrame frame = null; 

     var identifiers = browser.GetBrowser().GetFrameIdentifiers(); 

     foreach (var i in identifiers) 
     { 
      frame = browser.GetBrowser().GetFrame(i); 
      if (frame.Name == FrameName) 
       return frame; 
     } 

     return null; 
    } 

Wenn Sie eine „Verwendung“ auf dem Formular für das Modul, das diese Methode enthält, die Sie so etwas wie zu tun:

var frame = browser.GetFrame("nameofframe"); 
     if (frame != null) 
     { 
      string HTML = await frame.GetSourceAsync(); 
     } 

Natürlich müssen Sie sicherstellen, dass das Laden der Seite abgeschlossen ist, bevor Sie dieses verwenden, aber ich habe vor, es sehr zu verwenden. Ich hoffe es hilft!

Jim