Powershell System.__ComObject.document свойство больше не работает под IE 9
Я писал сценарий, который запускает некоторые функции сервера с использованием интерфейса веб-браузера. Я закодировал скрипт на Windows 7 с Internet Explorer 8, и он отлично работает. Как только я перевожу его на рабочий сервер под управлением Windows 2008 с Internet Explorer 9, он ломается. Наконец-то проследил это до точки отказа, но я немного озадачен, как это исправить. Вот код, который вызовет проблему:
$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("http://www.google.com")
$ie.visible = $True
$doc = $ie.document
$Object1 = $doc.getElementByID("pocs")
Это открывает окна IE, и он должен иметь возможность поиска элементов по идентификатору. Беда в том, что теперь я получаю ошибку
Msgstr "Невозможно найти перегрузку для" getElementById "и счетчика аргументов: "1"."
Я могу найти очень очень мало об этой ошибке. Фактическая проблема - фактически переменная $doc. Если я делаю "$doc | get-member" в IE 9, я получаю:
TypeName: System.__ComObject#{c59c6b12-f6c1-11cf-8835-00a0c911e8b2}
Но под IE 8 я получаю:
TypeName: mshtml.HTMLDocumentClass
Итак, по сути, IE 9 / Windows 2008 не может загрузить содержимое веб-документа, когда я вызываю $ie.document. Я пытался установить IE9 в режим совместимости, но не повезло.
Документ $ie.document | get-member действительно показывает метод: "getElementById Method Variant getElementById () ", так что он там, но нет документа для его анализа.
Любые идеи очень приветствуются.
3 ответа
Я также удивлен, что это еще не исправлено, учитывая долговечность проблемы на различных технических форумах. Тем не менее, я думаю, что нашел решение, хотя в какой-то момент команда Microsoft IE обратилась бы к нему.
Как и во всех ссылках, которые рассматривали это, у меня возникла та же проблема с getElementById
метод, который без каких-либо других изменений на пару тестовых машин (один Windows 2008R2 Enterprise 64-разрядных и один Windows 7 32-разрядных), я могу получить тот же сценарий для работы.
Обходные пути, которые работали как временное решение, которое мне не нравилось:
- Используя консоль разработчика в IE11, переключите режим документа на 8 (9,10,11,Edge (по умолчанию) не работает) - мой скрипт автоматизации работает мгновенно. Никаких изменений в доверенных сайтах IE, безопасности зоны, защищенном режиме, привилегиях сеанса PowerShell). Ясно, что это просто проблема с компонентом установки IE11.
- Устанавливая Office 2013, даже не запуская и не лицензируя его, тот же сценарий работает мгновенно, не меняя Режим документа IE11. Очевидно, что Office устанавливает / регистрирует что-то, что решает проблему (как говорит Рис Эдвардс)
Поэтому я решил сузить возможности Office для включения COM-объекта, необходимого для автоматизации IE:
Подготовка нового виртуального сервера Windows 2008R2, без обновлений. Запустил тестовый скрипт под IE8 - без проблем.
Обновлен до IE11. Пробежал тестовый скрипт - не получилось как обычно.
Сделал снимок виртуальной машины
Используется Regshot для записи реестра и файловой системы.
Запустил установку Office 2013 Pro_SP1, без изменений параметров по умолчанию. После завершения установки Office не запускался офис один раз (вообще никогда). Запустил тестовый скрипт снова - все работает, автоматизация IE с
getElementById
зовет всех обратно в стройСделал второй снимок виртуальной машины
Пробежал 2-е сканирование с
regshot
и проанализировал различияСвалил свойства моего
$ie
объект, а также заметил, что там гораздо больше, чем до запуска установки Office. Рекомендацииmshtml.dll
а такжеHTMLDocument
занятия по всему - выглядит как надоЯ могу видеть из
RegShot
файл различий, которыйMSHTML.dll
ДОБАВЛЕНО и зарегистрировано в GAC (версия 7.0.3300.0) при установке в офисе
То, что я сделал дальше, может быть не полностью одобрено, но:
Я нашел
microsoft.mshtml.dll
в"c:\program files(x86)\Microsoft.net\primary interop assemblies"
папку и сохранил ее из виртуальной машины на рабочий стол моей локальной машинывернулся к снимку до офиса 2013
скопировал
microsoft.mshtml.dll
в виртуальную машину и установлен в GAC (помните, что это сервер 2008R2, все еще на.net 2, я не обновлял.net до или после установки IE11, только офис). Я установил в GAC, просто перетащив файл вc:\windows\assembly
просмотр в проводнике. В более поздних версиях.Net вам нужно использоватьgacutil /l
Протестировал тот же скрипт и BOOM, все отлично работает. Нет необходимости изменять какие-либо настройки IE или повышать привилегии скрипта или устанавливать Office
Итак, подведем итоги. Если вы устанавливаете IE11, чтобы PowerShell автоматизировал модель документа, мне пришлось (пере) зарегистрировать mshtml.dll
в GAC. Почему установка IE11 не гарантирует, что это произойдет, мне не понятно, но я думаю, что команде IE нужно разобраться с этим.
Я также думаю, что для тех, кто "просто работает" в IE10/11, вы должны иметь продукт на компьютере, который уже зарегистрировал mshtml.dll
в GAC (возможно, Office, возможно, Visual Studio или другое приложение MS). Следовательно, почему вы не видите ту же проблему, которая определенно существует.
Надеюсь, это кому-то поможет - это сводило меня с ума!
Эндрю
Как подробно описано в комментариях к вопросу, кажется, что есть три решения этой проблемы.
- Обновление до PowerShell 3.0: версия 2.0 совместима только с IE8, когда дело доходит до очистки веб-страниц и использования IE в качестве объекта. Тем не менее, версия 3.0 будет работать с IE9. Вы можете получить это здесь.
- Отключение защищенного режима в IE: мне показалось, что включение защищенного режима для зоны Интернета на вкладке "Безопасность" в настройках Это имеет последствия для безопасности, которые следует тщательно рассмотреть.
- Запустите сценарий в режиме администратора: просто запустите сценарий в командной строке PowerShell с повышенными привилегиями.
Последние два решения приходят из другого ответа SO.
У меня была похожая проблема, и она была решена с помощью следующих шагов:
Проверьте наличие Microsoft.mshtml.dll на вашем компьютере. Он должен быть доступен по адресу C:\Program Files (x86)\Microsoft.NET\ Первичные сборки взаимодействия. Если вы не найдете его в этом месте, это может быть случай, когда у вас нет этой DLL, и это причина, по которой вы получаете эту проблему.
Найдите dll и попробуйте загрузить сборку во время выполнения. Вы можете разместить DLL в любом месте на вашем компьютере и сделать это. Ниже приведена ссылка на метод загрузки сборки во время выполнения. https://onedrive.live.com/?cid=21ad54fd70600673&id=21AD54FD70600673%211922