2017-10-09 123 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将内容返回到您的页面。