Подтвердить что ты не робот

Изменение HTML в веб-браузере до его отображения пользователю?

Я использую элемент управления WebBrowser, и я бы хотел обработать код HTML, прежде чем он будет отображаться в элементе управления.

Например, откройте сайт A со следующим содержимым:

<html>
  <body>
    <p id="Text">Hello</p>
  </body>
</html>

Я хотел бы изменить его на

<html>
  <body>
    <p id="Text">Bye</p>
  </body>
</html>

Я знаю, что могу сделать это с событием DocumentCompleted, а затем манипулировать им. Но если Веб-сайт выполняет JavaScript-материал, который запускается на этапе подготовки документа, не имеет смысла его изменять, поскольку он уже выполнен.

4b9b3361

Ответ 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, которые вы уже изменили, чтобы они не были изменены снова.