C# WebBrowser: часть1 - эмуляция разных версий IE
Коротко суть проблемы: по умолчанию компонент WebBrowser работает под версией IE7. Сейчас 2020 год и уже давно последней версией Internet Explorer служит 11-я версия. Можно было бы использовать и старую версию, но с тех пор появились новые JavaScript-методы, например, GetElementsByClassName. Поэтому в старой версии IE7 современные сайты откроются с многочисленными ошибками JavaScript.
1. Отключение ошибок скриптов.
В первую очередь, Вы можете воспользоваться настройкой отключения отображения ошибок JavaScript:
Данный трюк поможет мало, так как для современных сайтов все же нужен IE более новой версии. Зато браузер перестанет сыпать MessageBox с ошибками.
2. Изменение User-Agent Вашего браузера.
Если Вы откроете сайт https://2ip.ru из WebBrowser, то увидите следующее:
Сайт определил Ваш браузер как IE7, так как браузер в отправленном GET-запросе добавил заголовок:
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Zoom 3.6.0
Данное значение User-Agent соответствует IE7.
Данный момент решается следующим образом: создадим статический класс IeMethods со следующим кодом:
Из кода программы перед выполнением перехода на сайт вызовем метод SetAnotherUserAgent класса IeMethods и передадим строку со значением необходимого User-Agent:
Перейдем снова на https://2ip.ru и увиди результат для IE11:
Решит ли данный способ проблему ? Скорее всего нет. Все дело в том, что сайт на основании полученного от Вас заголовка User-Agent сформирует необходимый HTML-код. Программисты при разработке могут заложить поддержку IE9, IE11, Chrome и других браузеров. Но вряд ли кто-то будет закладывать поддержку IE7, все-таки слишком старый движок.
3. Изменение версии эмуляции IE.
Итак, мы добрались до основного. Эмулировать мы можем любую версию Internet Explorer. Главное понимать, что если в Вашей ОС установлен IE10, то в нем не будет поддержки IE11 или если в ОС установлен IE8, то нельзя эмулировать более поздние версии ))) Правило простое.
Еще раз, зачем что-то эмулировать?
Компания Microsoft заложила следующий функционал в каждую свою версию IE - возможность эмулировать более старую свою версию из новой версии. И по умолчанию компонент WebBrowser открывает сайты не под той версией Internet Explorer, который установлен в Вашей ОС, а под версией IE7 (а это старый движок, как я написал в начале статьи).
Как эмулировать версию IE ? Вариант только один, создать в реестре ключ типа DWord в Current User по адресу:
Имя ключа - это имя Вашего приложения (пример: 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.
4. Вывод
Чтобы добиться максимального результата, необходимо использовать все 3 перечисленных выше способа, а именно:
- Отключение ошибок скриптов
- Изменение User-Agent Вашего браузера
- Изменение версии эмуляции IE