Проблемы 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 просмотра
ну.. раз уж 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 | Не поддерживается. |
Комманда, открывающая диалоговое окно "Печать". | |
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 не помогает, необходимо каждый раз менять значение свойства на противоположный!
Читайте также: