2016-03-09 19 views
7

Bir web sayfasını yüklemek için bir CefSharp.Wpf.ChromiumWebBrowser (Sürüm 47.0.3.0) kullanıyorum. Sayfa yüklendikten sonra bir nokta kaynak kodunu almak istiyorum.HTML kaynak kodunu CefSharp web tarayıcısından edinin

Ben çağrıda:

wb.GetBrowser().MainFrame.GetSourceAsync() 

ancak tüm kaynak kodunu (Ben alt çerçeveler vardır bu olduğuna inanıyorum) iade görünmüyor.

ben ararsam:

wb.GetBrowser().MainFrame.ViewSource() 

Ben (iç çerçeveler dahil) tüm kaynak kodunu listeleyen görebilirsiniz.

Aynı sonucu ViewSource() ile almak istiyorum. Biri bana doğru yönde işaret edebilir mi lütfen?

Güncelleme -

Not Eklendi Kod örnek: web tarayıcısı çok işaret adresi yalnızca ve 10/03/2016 dahil kadar çalışacak. Bundan sonra, baktığım gibi olmayan farklı veriler gösterebilir. frmSelection.xaml yılında

frmSelection.xaml.cs ise

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

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

Bazı kodları paylaşabilir misiniz? Sorunu yeniden oluşturamıyorum, "ViewSourceAsync" ile aynı metni "ViewSource" ile aldım. 'Http: // stackoverflow.com' olarak ayarlanmış 'Adres' ile çalıştı (iki çerçeveye, bir 'iframe' ve ana çerçeveye sahiptir) –

+0

Bir bakış ayırdığınız için teşekkürler. Orijinal yayına örnek kaynak ekledim. – Scott

cevap

11

Ben oldukça bu DispatcherTimer çözüm olsun sanmıyorum dosya dosya.

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; 
     }); 
    } 
} 

Ben ViewSource çıkışında ve html değişkeninde metin üzerinde yapılmış bir fark yaptı ve aynı, bu yüzden burada sorunu yeniden edemez: Ben böyle yapardı.

Bu, ana çerçevenin oldukça geç yüklendiğini fark ettim, bu yüzden not defteri kaynağa kadar açılana kadar beklemek zorundasınız.

+0

Kodumla ilgili geri bildiriminiz için teşekkür ederiz, örneğinizi yansıtacak şekilde güncelledim. Örneği yayınladığınızdan beri kodu başka bir bilgisayarda çalıştırdım ve sizlerle aynı sonuçları elde ediyorum (her ikisi de tam kaynak kodunu döndürür). Sadece makinemde garip bir şey olduğu sonucuna varabilirim ve bir format yapmayı düşüneceğim. – Scott

1

Ana çerçevede değil, çerçevede bulunan öğeyi tıklatmaya çalışırken aynı sorunu yaşıyordum. Cevabınız örnek kullanıldığında, aşağıdaki uzatma yöntemi yazdı:

 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; 
    } 

bir gibi bir şey yapabilirsiniz bu yöntemi içeren modül için formunuzda "kullanarak" varsa:

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

Tabii ki, bunu kullanmadan önce sayfa yükünün tamamlandığından emin olmalısınız, ancak bunu çok kullanmayı planlıyorum. Umarım yardımcı olur!

Jim

İlgili konular