Управление HTML-документом перед отображением в элементе управления WPF WebBrowser

Мне нужно изменить внутренний 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");
    }
}

person Ev_Hyper    schedule 09.10.2017    source источник
comment
Не работает правильно - как именно?   -  person Evk    schedule 09.10.2017
comment
Я бы использовал WebClient для асинхронной загрузки всего сайта, изменения html-кода и загрузки измененной строки в WebBrowser.   -  person Marco    schedule 09.10.2017
comment
@Evk реклама не загружается   -  person Ev_Hyper    schedule 09.10.2017
comment
@Marco, вы уверены, что будет какая-то разница между загруженной страницей с AngleSharp и WebClient?   -  person Ev_Hyper    schedule 09.10.2017
comment
Что делать, если подождать, пока страница загрузится, а затем изменить ее с помощью javascript (то есть - не использовать NavigateToString, а изменять напрямую).   -  person Evk    schedule 16.10.2017
comment
@Evk Я рад сделать это, но не могу поймать, когда страница загружается   -  person Ev_Hyper    schedule 16.10.2017
comment
У вас есть демонстрационный проект git, который можно отлаживать?   -  person Tarun Lalwani    schedule 18.10.2017
comment
@TarunLalwani mcve слишком мал для создания репозитория git - я добавлю некоторые детали к вопросу   -  person Ev_Hyper    schedule 19.10.2017
comment
@TarunLalwani спасибо за совет - добавил полную версию   -  person Ev_Hyper    schedule 19.10.2017
comment
Это очень странный вопрос. Прежде всего - чем вы хотите манипулировать? Почему для этой манипуляции должен быть активен JavaScript? Почему вы не можете просто внедрить JavaScript, который выполняет необходимые манипуляции? Также вы используете AngleSharp синхронно, что очень плохо. Ваш интерфейс будет зависать.   -  person Florian Rappl    schedule 14.12.2017
comment
@FlorianRappl First of all - what do you want to manipulate? Мне нужно удалить часть HTML-страницы.   -  person Ev_Hyper    schedule 23.12.2017
comment
@Florian Rappl Why has JavaScript to be active for this manipulation? Я должен показывать рекламу там же, где она находится на исходной странице.   -  person Ev_Hyper    schedule 23.12.2017
comment
@FlorianRappl Why can't you just inject a JavaScript that performs the required manipulation? потому что я вообще не знаю JS - я даже не уверен, возможно ли это   -  person Ev_Hyper    schedule 23.12.2017
comment
Also you are using AngleSharp synchronously, which is very bad. Your UI will be hanging да, спасибо - я это знаю. Это только для MCVE (мой настоящий проект в основном написан на F #)   -  person Ev_Hyper    schedule 23.12.2017
comment
@Ev_Hyper Спасибо за ответ. Если это возможно с AngleSharp (теоретически), то это будет возможно и с JS. Также обратите внимание, что API почти такой же (за исключением camelCase вместо PascalCase). Сам по себе JS не должен быть здесь большим препятствием. Таким образом, проблема с AngleSharp потенциально будет связана с интеграцией JS. Поскольку вы все равно хотите загрузить страницу в браузере, внедрение JS-скрипта для меня звучит как самый простой (и самый надежный) путь.   -  person Florian Rappl    schedule 23.12.2017


Ответы (2)


Объявления встроены в iFrame на представленной вами странице. В моем случае URL-адрес объявления, загруженный в iFrame, выглядит примерно так: https://cdn.254a.com/images/hosted/elv/retargeting/v5/728x90.html? ... (проверьте с помощью инструмента инспектора веб-браузера)

Вероятно, в объявлении нельзя использовать iframe на вашей странице (проверьте, что возвращает объявление, в поле заголовка X-Frame-Options). Если это проблема, должна быть возможность реализовать прокси для объявления и позволить прокси изменять заголовок X-Frame-Options.

В этом случае, если URL-адрес объявления - https (а не только http), вам нужно будет создать прокси-сервер, который будет действовать как Man-in-the-Middle. См. Принятый ответ В чем смысл X-Frame-Options заголовок?. Но вы можете заменить URL-адрес своим URL-адресом прокси с исходным URL-адресом в ARGS. прокси действует как клиент HTTPS, получает контент, прокси может изменять заголовок и возвращает контент на вашу страницу только через HTTP.

person Christoph Bimminger    schedule 22.10.2017

Вы можете использовать: http://html-agility-pack.net для управления кодом Html на C # .

person Valfar Developer    schedule 23.10.2017