2017-10-09 97 views
4

我必須在WebBrowser中顯示它之前更改內部html代碼。在顯示到WPF WebBrowser控件之前操作HTML文檔

測試頁 - http://aksmod.ru/skajrim-mod-kukri-ot-aksyonov-v5-0/

我試圖用AngleSharp.Scripting,但它不能正常工作(廣告不加載

var config = new Configuration().WithDefaultLoader().WithJavaScript(); 
var document = BrowsingContext.New(config).OpenAsync(address).Result; 

//do something 

return document.DocumentElement.OuterHtml; 

後來我想過LoadCompleted,但結果是一樣的

private void Wb_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    Console.WriteLine("Loaded"); 
    string url = e.Uri.ToString(); 
    if (!(url.StartsWith("http://") || url.StartsWith("https://"))) 
    { } 
    if (e.Uri.AbsolutePath != wb.Source.AbsolutePath) 
    { } 
    else 
    { 
     Console.WriteLine("Full Loaded"); 
     HTMLDocument html = (HTMLDocument)wb.Document; 
     var value = html.getElementsByTagName("html").item(index: 0); 
     //do something 
     wb.NavigateToString(value.OuterHtml); 
    } 
} 

事件只是不會觸發(它工作正常我其他網站,雖然)。

那麼,我錯過了什麼呢?

更新1

MCVE

XAML

<Grid> 
    <WebBrowser Name="wb" /> 
</Grid> 

代碼背後

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     wb.Navigated += Wb_Navigated; 
     wb.LoadCompleted += Wb_LoadCompleted; 
     wb.Navigate("http://aksmod.ru/skajrim-mod-kukri-ot-aksyonov-v5-0/"); 
    } 

private void Wb_LoadCompleted(object sender, NavigationEventArgs e) 
{ 
    Console.WriteLine("Loaded"); 
    string url = e.Uri.ToString(); 
    if (!(url.StartsWith("http://") || url.StartsWith("https://"))) 
    { } 
    if (e.Uri.AbsolutePath != wb.Source.AbsolutePath) 
    { } 
    else 
    { 
     Console.WriteLine("Full Loaded"); 
     HTMLDocument html = (HTMLDocument)wb.Document; 
     var value = html.getElementsByTagName("html").item(index: 0); 
     //do something 
     wb.NavigateToString(value.OuterHtml); 
    } 
} 

    private void Wb_Navigated(object sender, NavigationEventArgs e) 
    { 

     FieldInfo fiComWebBrowser = typeof(WebBrowser) 
      .GetField("_axIWebBrowser2", 
         BindingFlags.Instance | BindingFlags.NonPublic); 
     if (fiComWebBrowser == null) return; 
     object objComWebBrowser = fiComWebBrowser.GetValue(wb); 
     if (objComWebBrowser == null) return; 
     objComWebBrowser.GetType().InvokeMember(
      "Silent", BindingFlags.SetProperty, null, objComWebBrowser, 
      new object[] { true }); 

     Console.WriteLine("Navigated"); 
    } 
} 
+0

「無法正常工作」 - 具體如何? – Evk

+3

我會使用WebClient加載完整的網站異步,更改HTML代碼,並加載WebBrowser中修改的字符串。 – Marco

+0

@Evk廣告不會加載 –

回答

3

的廣告嵌入的iFrame的你預先在頁面內sented。在我的情況下,在iFrame中加載的廣告URL類似於https://cdn.254a.com/images/hosted/elv/retargeting/v5/728x90.html?(使用網絡瀏覽器的檢查器工具檢查)

廣告不允許iframing在您的網頁中(檢查廣告在X-幀選項頭部字段)。如果出現這種問題,應該可以實現廣告代理,並讓代理更改X-Frame-Options標頭。

在這種情況下,如果廣告URL是https(而不僅僅是http),則需要創建一個充當中間人的代理。請參閱What's the point of the X-Frame-Options header?的接受答案。但是,您可以使用代理網址替換網址,並將其替換爲ARGS中的原始網址。代理充當HTTPS客戶端,獲取內容,代理能夠修改標題,並通過HTTP將內容返回到您的頁面。

相關問題