我必须在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 :(得分:3)
广告在您呈现的页面中嵌入为iFrame。在我的情况下,iFrame中加载的广告网址类似于https://cdn.254a.com/images/hosted/elv/retargeting/v5/728x90.html?...(使用网络浏览器的检查工具查看)
广告可能不允许在您的网页中进行iframing(检查广告在X-Frame-Options标题字段中返回的内容)。如果这是问题,则应该可以为广告实施代理,并让代理更改X-Frame-Options标头。
在这种情况下,如果广告网址是https(而不仅仅是http),则您需要创建一个充当中间人的代理。请参阅What's the point of the X-Frame-Options header?的已接受答案。但您可以使用代理URL替换URL,并使用ARGS中的原始URL。代理充当HTTPS客户端,获取内容,代理能够修改标头,并通过HTTP将内容返回到您的页面。
答案 1 :(得分:-1)
您可以使用:http://html-agility-pack.net来操纵C#上的Html代码。