Мне нужно изменить внутренний html-код, прежде чем показывать его в WebBrowser.
Тестовая страница - 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");
}
}
First of all - what do you want to manipulate?
Мне нужно удалить часть HTML-страницы. - person Ev_Hyper   schedule 23.12.2017Why has JavaScript to be active for this manipulation?
Я должен показывать рекламу там же, где она находится на исходной странице. - person Ev_Hyper   schedule 23.12.2017Why can't you just inject a JavaScript that performs the required manipulation?
потому что я вообще не знаю JS - я даже не уверен, возможно ли это - person Ev_Hyper   schedule 23.12.2017Also you are using AngleSharp synchronously, which is very bad. Your UI will be hanging
да, спасибо - я это знаю. Это только для MCVE (мой настоящий проект в основном написан на F #) - person Ev_Hyper   schedule 23.12.2017