C# WebBrowser: часть1 - эмуляция разных версий IE

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

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

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

webBrowser1.ScriptErrorsSuppressed = true;

Данный трюк поможет мало, так как для современных сайтов все же нужен 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 со следующим кодом:

public static class IeMethods { [DllImport("urlmon.dll", CharSet = CharSet.Ansi)] private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved); public static void SetAnotherUserAgent(string ua) { const int urlmonOptionUseragent = 0x10000001; const int urlmonOptionUseragentRefresh = 0x10000002; var UserAgent = ua; UrlMkSetSessionOption(urlmonOptionUseragentRefresh, null, 0, 0); UrlMkSetSessionOption(urlmonOptionUseragent, UserAgent, UserAgent.Length, 0); } }

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

// IE8 IeMethods.SetAnotherUserAgent("Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)"); // IE11 IeMethods.SetAnotherUserAgent("Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"); // CHROME IeMethods.SetAnotherUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36");

Перейдем снова на 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 по адресу:

// Для 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.

public static void SetBrowserEmulation(int version) { string program = Application.ExecutablePath.Split('\\').Reverse().ToList()[0]; var key = "SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION"; RegistryKey hkcu = Registry.CurrentUser.CreateSubKey(key); hkcu.SetValue(program, version, RegistryValueKind.DWord); hkcu.Close(); }

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

public Form1() { IeMethods.SetBrowserEmulation(11001); InitializeComponent(); }

4. Вывод

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

  • Отключение ошибок скриптов
  • Изменение User-Agent Вашего браузера
  • Изменение версии эмуляции IE
0
Комментарии
-3 комментариев
Раскрывать всегда