Проблемы webbrowser windows forms

Обновлено: 06.07.2024

Коротко суть проблемы: по умолчанию компонент WebBrowser работает под версией IE7. Сейчас 2020 год и уже давно последней версией Internet Explorer служит 11-я версия. Можно было бы использовать и старую версию, но с тех пор появились новые JavaScript-методы, например, GetElementsByClassName. Поэтому в старой версии IE7 современные сайты откроются с многочисленными ошибками JavaScript.

1. Отключение ошибок скриптов.

В первую очередь, Вы можете воспользоваться настройкой отключения отображения ошибок JavaScript:

Данный трюк поможет мало, так как для современных сайтов все же нужен IE более новой версии. Зато браузер перестанет сыпать MessageBox с ошибками.

2. Изменение User-Agent Вашего браузера.

Сайт определил Ваш браузер как IE7, так как браузер в отправленном GET-запросе добавил заголовок:

Данное значение User-Agent соответствует IE7.

Данный момент решается следующим образом: создадим статический класс IeMethods со следующим кодом:

Из кода программы перед выполнением перехода на сайт вызовем метод SetAnotherUserAgent класса IeMethods и передадим строку со значением необходимого User-Agent:

Решит ли данный способ проблему ? Скорее всего нет. Все дело в том, что сайт на основании полученного от Вас заголовка User-Agent сформирует необходимый HTML-код. Программисты при разработке могут заложить поддержку IE9, IE11, Chrome и других браузеров. Но вряд ли кто-то будет закладывать поддержку IE7, все-таки слишком старый движок.

3. Изменение версии эмуляции IE.

Итак, мы добрались до основного. Эмулировать мы можем любую версию Internet Explorer. Главное понимать, что если в Вашей ОС установлен IE10, то в нем не будет поддержки IE11 или если в ОС установлен IE8, то нельзя эмулировать более поздние версии ))) Правило простое.

Еще раз, зачем что-то эмулировать?

Компания Microsoft заложила следующий функционал в каждую свою версию IE - возможность эмулировать более старую свою версию из новой версии. И по умолчанию компонент WebBrowser открывает сайты не под той версией Internet Explorer, который установлен в Вашей ОС, а под версией IE7 (а это старый движок, как я написал в начале статьи).

Как эмулировать версию IE ? Вариант только один, создать в реестре ключ типа DWord в Current User по адресу:

// Для x64 приложений SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION // Для x32 приложений SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

Имя ключа - это имя Вашего приложения (пример: WindowsFormsApp1.exe)

Значение ключа - специальный код версии IE, который нужно ввести в десятичном формате. Пример для эмуляции IE11 используя код 11001:

Таблица кодов для разных версий IE:

11001 (0x2AF9) - Internet Explorer 11. Webpages are displayed in IE11 edge mode, regardless of the !DOCTYPE directive.

11000 (0x2AF8) - IE11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 edge mode. Default value for IE11.

10001 (0×2711) - Internet Explorer 10. Webpages are displayed in IE10 Standards mode, regardless of the !DOCTYPE directive

10000 (0×02710) - Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10.

9999 (0x270F) - Windows Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the !DOCTYPE directive.

9000 (0×2328) - Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9.Important In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.

8888 (0x22B8) - Webpages are displayed in IE8 Standards mode, regardless of the !DOCTYPE directive.

8000 (0x1F40) - Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8Important In Internet Explorer 10, Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode.

7000 (0x1B58) - Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control.

Пора сделать метод эмуляции в коде нашего приложения. В класс IeMethods добавим метод SetBrowserEmulation с возможностью передачи ему параметра version типа integer.

В коде формы нашего приложения вызовем этот метод и передадим ему код 11001. Метод необходимо вызвать до создания компонента WebBrowser, поэтому поместим его вызов перед InitializeComponent.

Чтобы добиться максимального результата, необходимо использовать все 3 перечисленных выше способа, а именно:

При работе с элементом управления WebBrowser, который входит в состав большинства библиотек для разработки под Windows, довольно часто возникают проблема некорректного отображения веб страниц. Особенно, если речь на странице используются достаточно современные технологии.

Дело в том, что элемент управления WebBrowser это ни что иное как COM-оболочка для Internet Explorer, которая к тому же работает в режиме Internet Explorer 7. При этом данный режим используется по умолчанию не зависимо о того какая именно версия для Internet Explorer установлена на компьютере.

Существует два способа изменить режим работы WebBrowser:

  • Изменить режим работы по умолчанию через реестр;
  • Включить в заголовок веб страницы специальный мета-тег.

1.Изменение режима работы через реестр

Для этого необходимо изменить следующее значение в реестре Windows:

Последние цифры этого значения должны быть указаны в соответствии со следующей таблицей.

Таким образом для работы WebBrowser в режиме Internet Explorer 11 в режиме по умолчанию для этого браузера значение в реестре должно быть следующим:

Более подробную информацию о конфигурировании через реестр можно прочитать в статье на MSDN: Internet Feature Controls (B..C).

У этого способа, помимо всего прочего, есть ещё целый ряд существенных «минусов»:

  • Вносимые изменение будут относиться не только к данной конкретной программе, а носить глобальный характер (HKEY_LOCAL_MACHINE определяет параметры всей операционной системы);
  • Для работы с реестром необходимы соответствующие права.

Поэтому, данный способ применять нежелательно.

2.Использование специального мета-тега

Для управления режимом отображения содержимого веб страниц в браузерах Internet Explorer 8 и выше используется мета тег X-UA-Compatible. Её синтаксис:

Режим отображение задаётся в атрибуте content в соответствии со следующей таблицей:

При помощи данного мета тега можно переключить браузер в режим отображения соответствующий и более ранним версиям, чем Internet Explorer 7. Однако вследствие их глубокого морального устаревания подробно останавливаться на этом не имеет смысла.

Данный способ является наиболее предпочтительным, но и он также имеет два серьёзных недостатка:

  • Мета-тег X-UA-Compatible должен располагаться на каждой отображаемой странице;
  • Вследствие предыдущего недостатка, если мета-тег X-UA-Compatible отсутствуе и нет возможности добавить его на страницу, проблема с отображением содержимого становится практически неустранимой при помощи данного способа.

Как показано выше задача обеспечения корректного отображения содержимого веб страниц в элементе управления WebBrowser, в любом случае, вполне решаема. В тоже время исходя из всего вышесказанного, если веб страница изначально разрабатывается с учётом возможного просмотра с помощью данного элемента управления, при её создании имеет придерживаться следующих простых рекомендаций:

ScriptErrorsSuppressed включен для WebBrowser.

  • Вопрос задан более трёх лет назад
  • 1823 просмотра

mindtester

ну.. раз уж WebBrowser а не WebView (как WPF и UWP) то WinForms.. кстати, стоит сразу уточнять подобные нюансы ;)

дело в том, что в формах, и в WPF - это старый, "добрый", "ослик" (IE, я даже не знаю когда и почему его стали звать "осликом", но какие то годы, это было весьма распространено).. (и ради бога - если у вас вин 10 - не путайте с Edge. только в UWP контроле WebView используется движок Edge, и все что ниже НЕ о нем)

.. ну и раз уж это IE. то:

1 - для начала проверьте сайт в IE той же системы, где разрабатываете и дебажите программу. если вдруг в "просто" IE, сайт отрабатывает вполне себе адекватно.. см пункт 2 .. если нет.. проверьте в Хроме, и читайте п3.. или ругайтесь с создателями сайта и/или с МС..

2 - у "встраиваемого" IE есть особенность (была до последних лет точно) - "опускать" себя на пару версий. это может показаться диким, но это был тактический ход, для обеспечения совместимости огромного количества корпоративного софта.. дальше я немного расскажу об этом..

- гуглите про ветку реестра HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION - что и как в нее писать. досадное неудобство, состоит в том, что каждый экзешник, который пользует именно IE, но хочет новейшие фичи - надо там прописать

- .. что еще досаднее, если вы планируете распространять свое творение (прогу) то ее надо будет обучить самопрописке (освоить работу с реестром)

. в любом случае копать вам в эту сторону

ну и - UWP с Edge.. для винды оч даже хороший выбор ;))). полный сапорт в МСДН. опять же короткий путь на витрину "магазина МС". и ни каких "корпоративных" заморочек с версионностью движка. ;)))

плохая новость. ваша ссылка из текста вопроса - в "осле" 10ки (классическом IE) без всякого ограничения версионности - работает не адекватно.. так что либо ругачки с разрабами сайта/МС.. либо смена инструмента. WinForms/WPF с дефолтным контролом - вам не помогут..

WEbbrowser отключить вывод ошибки сценария

Создал веббраузер и выводится ошибка сценария
QIP Shot - Screen 002.jpg

Как ее убрать? в Visual C++ там просто Put_Silent(TRUE) устанавливали, а здесь такого свойства нету.
И вообще от с описания похоже какой то он по функционалу слабинький. Visual C++ тот браузер получше был.

Что делать или как то через CoM попробовать подключить и использовать инерфейс напрямую, потому что этот класс какой то убоги по функционалу.

В этом браузере хоть можно форму заполнить и кликнуть по кнопке?

Ну у него вроде тоже есть какое-то свойство типа Silent.

Вообще я б Selenium взял если для автоматизации.

Хз. где оно находится. В виндовс форм оно по другому называется ScriptErrorsSuppressed = True
А тут нету. Не ясно как получить интерфейсы IHTML_Element, IHTML_Document и другие. Что то не ясно что с этим контролом делать. Объект с функциями и все, ниче нету. Мб. он урезан по функционалу или такое наврятли может быть в Visual C++ там веббраузер все что хочешь можно было делать.

Наверно класс урезали по функционалу, нужно подключить как то iframe.dll через COM и из него использовать наверно.

Последний раз редактировалось ninja2; 30.09.2015 в 19:53 .

Ну дык на скриншоте ошибка JS. ScriptErrorsSuppressed собственно и отключает их.

Не ясно как получить интерфейсы IHTML_Element, IHTML_Document и другие
Ну дык на скриншоте ошибка JS. ScriptErrorsSuppressed собственно и отключает их.

Такого свойства нету в WPF браузере System.Windows.Controls.Webbrowser
В WindowsForm отключает.

В WPF нада как то встроить браузер из Winform или как то получить интерфейсы из того браузера что есть.
Хорошо бы встроить, хоть понять как конролы левые добавляются в WPF. ССылку добавил, нужно как то его отобразить.

Элемент управления WebBrowser очень часто является хорошим вариантом для решения задач, связанных с Web Mining, отображением и работе с HTML данными. Несмотря на кажущуюся простоту работы с этим элементом управления, существует много проблем. На форумах очень часто можно встретить вопросы по работе с WebBrowser, на некоторые из наиболее часто задаваемых попробую ответить, а также расскажу о других приемах / трюках, с которыми пришлось столкнуться.

Работаем с WebBrowser в Windows Forms приложениях

После чего получим такой результат:

Шаблон проекта создан, приступим к выполнению некоторых задач.

Создание HTML Editor

Мы все привыкли к онлайн-редакторам HTML, но если нам необходимо сделать это в Windows Forms приложении? WebBroser может нам помочь в этом.

В первую очередь мы должны добавить в проект ссылку на Microsoft.mshtml, после чего перепишем наш код таким образом:

Нужно еще заметить, что многие свойства WebBrowser являются COM объектами, т.е. по сути WebBrowser - это обвертка (wrapper) над более старым элементом управления AxSHDocVw.AxWebBrowser. Поэтому следующим этапом является приведение hd.DomElement к интерфейсу mshtml.IHTMLDocument2. дальше мы добрались до самой сути - изменение режима браузера с помощью строки axObj.designMode = "On";

После этого наша страница будет редактируемой (добавим строку "Welcome from WebBrowser Demo!"):

Рассмотрим как можно менять стили в нашем HTML Editor.

Расширяем функционал HTML Editor

Понятно, что в таком виде наш редактор никому не нужен, поэтому добавим ему немного функционала.

Для этого нам необходимо разобраться, как можно управлять содержимым веб-браузера программно. А сделать это можно с помощью команды ExecCommand класса HtmlDocument, но для этого необходимо знать, какие параметры необходимо передавать.

Рассмотрим синтаксис метода execCommand, который принимает на вход три аргумента:

  • имя команды: указывает на действия, которые необходимо совершить с выделением.
  • флаг: булево значение, указывающее отображать ли интерфейс пользователя, вызванный командой.
  • параметры команды

Из этих трех аргументов обязательным является только первый. Пример:

Список команд:

Команда Описание
2D-Position Команда, позволяющая пользователю передвигать абсолютно позиционированные элементы.
AbsolutePosition Команда, устанавливающая свойство position данного элемента в значение "absolute".
BackColor Команда, устанавливающая или возвращающая цвет фона данного выделеного текста.
BlockDirLTR Не поддерживается.
BlockDirRTL Не поддерживается.
Bold Команда, переключающая состояние шрифта выделенного фрагмента текста между жирным и нормальным.
BrowseMode Не поддерживается.
Copy Команда, помещающая копию данного выделенного фрагмента текста в буфер обмена.
CreateBookmark Команда, создающая "якорь" из выделенного фрагмента текста или возвращает имя "якоря" для выделенного фрагмента текста.
CreateLink Команда, создающая гиперссылку из выделенного фрагмента текста.
Cut Команда, помещающая копию данного выделенного фрагмента текста в буфер обмена и удаляющая этот фрагмент из документа.
Delete Команда, удаляющая выделенный фрагмент текста.
DirLTR Не поддерживается.
DirRTL Не поддерживается.
EditMode Не поддерживается.
FontName Команда, задающая или возвращающая имя шрифта текста.
FontSize Команда, задающая или возвращающая размер шрифта текста
ForeColor Команда, задающая или возвращающая цвет текста.
FormatBlock Команда, форматирующая выделенный фрагмент текста как блок "DIV", "P" или "SPAN".
Indent Команда, увеличивающая отступ выделенного фрагмента текста.
InlineDirLTR Не поддерживается.
InlineDirRTL Не поддерживается.
InsertButton Команда, вставляющая в документ кнопку("BUTTON").
InsertFieldset Команда, вставляющая в документ группу "FIELDSET".
InsertHorizontalRule Команда, вставляющая в документ горизонтальную полосу прокрутки.
InsertIFrame Команда, вставляющая в документ "плавающий" фрейм.
InsertImage Команда, вставляющая в документ изображение.
InsertInputButton Команда, вставляющая в документ командную кнопку.
InsertInputCheckbox Команда, вставляющая в документ кнопку-"флажок".
InsertInputFileUpload Команда, вставляющая в документ элемент управления для отправки файла на сервер.
InsertInputHidden Команда, вставляющая в документ скрытое поле.
InsertInputImage Команда, вставляющая в документ изображение как элемент управления.
InsertInputPassword Команда, вставляющая в документ поле ввода пароля.
InsertInputRadio Команда, вставляющая в документ радиокнопку.
InsertInputReset Команда, вставляющая в документ кнопку сброса данных формы.
InsertInputSubmit Команда, вставляющая в документ кнопку отправки данных из формы на сервер.
InsertInputText Команда, вставляющая в документ поле ввода текста.
InsertMarquee Комманда, вставляющая в документ прокручивающийся текст.
InsertOrderedList Комманда, вставляющая в документ нумерованный список.
InsertParagraph Комманда, создающая абзац из выделенного фрагмента текста.
InsertSelectDropdown Комманда, вставляющая в документ выпадающий список.
InsertSelectListbox Комманда, вставляющая в документ список.
InsertTextArea Комманда, вставляющая в документ область редактирования текста.
InsertUnorderedList Комманда, вставляющая в документ маркированный список.
Italic Комманда, переключающая состояние шрифта выделенного фрагмента текста между наклонным и нормальным.
JustifyCenter Комманда, выравнивающая абзац, в который входит фрагмент выделенного текста, по центру.
JustifyFull Не поддерживается.
JustifyLeft Комманда, выравнивающая абзац, в который входит фрагмент выделенного текста, по левому краю.
JustifyNone Не поддерживается.
JustifyRight Комманда, выравнивающая абзац, в который входит фрагмент выделенного текста, по правому краю.
LiveResize Комманда, включающая или выключающая режим мгновенного("живого") отображения размеров или местоположения элементов страницы во время изменения размеров последней.
MultipleSelection Комманда, позволяющая или запрещающая выделение сразу нескольких элементов web-строницы.
Open Не поддерживается.
Outdent Комманда, уменьшающая отступ выделенного фрагмента текста.
OverWrite Комманда, переключающая режим ввода текста между вставкой и заменой.
Paste Комманда, заменяющая данный выделенный фрагмент текста на содержимое буфера обмена.
PlayImage Не поддерживается.
Print Комманда, открывающая диалоговое окно "Печать".
Redo Не поддерживается.
Refresh Комманда, перезагружающая данный документ с сервера.
RemoveFormat Комманда, удаляющая все тэги форматирования текста из выделенного фрагмента текста.
RemoveParaFormat Не поддерживается.
SaveAs Комманда, сохраняющая текущую web-страницу в файл.
SelectAll Комманда, выделяющая весь документ.
SizeToControl Не поддерживается.
SizeToControlHeight Не поддерживается.
SizeToControlWidth Не поддерживается.
Stop Не поддерживается.
StopImage Не поддерживается.
StrikeThrough Не поддерживается.
Subscript Не поддерживается.
Superscript Не поддерживается.
UnBookmark Комманда, удаляющая элемент закладки из текущего фрагмента выделенного текста.
Underline Комманда, устанавливающая подчёркивание для выделенного фрагмента текста или снимающая это подчёркивание.
Undo Не поддерживается.
Unlink Комманда, удаляющая элемент гиперссылки из текущего фрагмента выделенного текста.
Unselect Комманда, очищающая данный фрагмент выделенного текста.

При запуске приложения вы можете выделить произвольный текст и установить стиль шрифта жирным путем нажатия на нашу кнопку. Таким образом вы можете написать полноценный HTML Editor, который будет поддерживать все команды форматирования.

Переход на новую страницу

В случае, если мы ничего не меняли в исходном шаблоне, переход при нажатии на кнопку пройдет успешно, но если вы хоть что-то поменяли в исходном документе, то при переходе вы увидите такое окно:

Я обшарил весь интернет в поисках решения, но ответа не нашел ни на одном из ресурсов, свойства типа ShowWarningPopup нет. В итоге решение пришло в виде такого трюка:

Эта функция изменяла свойство веб-браузера на противоположный, ее нужно вызывать перед тем как осуществлять переход на новую страницу. Вся соль в том, что простое присвоение true или false не помогает, необходимо каждый раз менять значение свойства на противоположный!

Читайте также: