Изменение HTML в веб-браузере до его отображения пользователю?
Я использую элемент управления WebBrowser, и я бы хотел обработать код HTML, прежде чем он будет отображаться в элементе управления.
Например, откройте сайт A со следующим содержимым:
<html>
<body>
<p id="Text">Hello</p>
</body>
</html>
Я хотел бы изменить его на
<html>
<body>
<p id="Text">Bye</p>
</body>
</html>
Я знаю, что могу сделать это с событием DocumentCompleted, а затем манипулировать им. Но если Веб-сайт выполняет JavaScript-материал, который запускается на этапе подготовки документа, не имеет смысла его изменять, поскольку он уже выполнен.
Ответы
Ответ 1
Вы можете выполнить манипуляции с DOM внутри события Navigated
:
webBrowser1.Navigated += (sender, e) =>
{
((WebBrowser)sender).Document.GetElementById("Text").InnerHtml = "Bye";
};
Это будет выполнено перед любыми обработчиками DOM в документе. Например, если у вас был следующий HTML-код:
<html>
<head>
<title>Test</title>
</head>
<body onload="document.getElementById('Text').innerHTML = document.getElementById('Text').innerHTML + ' modified';">
<p id="Text">Hello</p>
</body>
</html>
При отображении этого кода в WebBrowser вы получите Bye modified
.
Ответ 2
Это не работает. Я столкнулся с той же проблемой. Что делать, если вы хотите изменить вызовы ajax? Метод навигации никогда не срабатывает. Также метод навигации никогда не срабатывает на iFrames.
Я думаю, единственное решение - использовать прокси. Просто нажмите на добавление пакетов NuGet. Поиск fiddlercore. После добавления ссылки на http://www.telerik.com/fiddler/fiddlercore. Теперь просто выполните поиск в Google по изменению ответа с помощью FiddlerCore. Я уверен, что будет много примеров.
Примечание. при запуске ядра Fiddler по умолчанию будут изменяться настройки прокси-сервера вашего компьютера. Вы этого не хотите! вы хотите, чтобы ваш веб-браузер не подключался к нему не всей вашей системой. Поэтому инициализируйте ядро fidderl для прослушивания на случайном порту без запуска в качестве системного прокси. Затем установите элемент управления веб-браузером для подключения к этому прокси.
При попытке доступа к сайтам HTTPS будет сложнее:/
Ответ 3
Вы можете сделать это в обратном вызове setInterval
с разумным интервалом (~ 20 мс), а затем очистить интервал в соответствующее время, например, при готовности DOM.
Единственное предостережение в том, что ваш обратный вызов должен быть идемпотентным, поскольку он будет вызван несколько раз. Я не подозреваю, что это должно быть сложно, если вы просто добавите атрибут данных или имя класса в узлы DOM, которые вы уже изменили, чтобы они не были изменены снова.