2014-01-17 4 views
1

Я пытаюсь получить доступ к документу объекта Internet explorer com с окнами 2012. Код отлично работает в Windows 2008, но как только я попытаюсь запустить его на windows 2012 (свежая установка, опробованная на нескольких серверах), тот же код перестает работать. Другими словами, $ ie.document.documentHtml возвращается как null.InternetExplorer.Application com object и windows 2012 в powershell

Ниже приведен код:

$ie = new-object -com "InternetExplorer.Application" 
$ie.navigate2("http://www.example.com/") 
while($ie.busy) {start-sleep 1} 
$ie.document.documentHtml.innerhtml 

ли объект interexplorer ком изменилось в окнах 2012? и если да, как мне это сделать, я получаю содержимое документа в Windows 2012?

Заранее спасибо

редактирования: Добавлены щедроты, чтобы подсластить вещи. Invoke-WebRequest хорош, но он работает только на Windows 2012, но мне нужно использовать Internet Explorer и работать как на Windows 2008, так и на Windows 2012. Я где-то читал, что установка Microsoft Office решает эту проблему. Это тоже не вариант.

edit2: как мне нужно, чтобы удаленно вызывать скрипт на сервере несколько окон (2008 и 2012), я бы предпочел, чтобы не копировать файлы вручную

+0

Что значит «перестает работать»? Вы получили сообщение об ошибке? Какой результат вы ожидаете, и какой результат вы получаете? В какой строке это происходит? –

+0

Я имел в виду, что код не работает. Другими словами, $ ie.document.innerhtml пуст. Интересно, что я могу сделать браузер видимым с $ ie.visible = $ true, и он показывает, что браузер перешел на нужную страницу, но я не могу получить доступ к фактическому содержимому страницы. –

+0

Из поиска через Интернет, кажется, я не единственный, у кого есть эта проблема, и кажется, что в некоторых случаях установка office 2010 решает проблему - это не вариант для меня –

ответ

3

Это ноу ошибка: http://connect.microsoft.com/PowerShell/feedback/details/764756/powershell-v3-internetexplorer-application-issue

Выписка из обходного:

Итак, обходной путь:

  1. Копия Microsoft.html.dll от loca (например: из C: \ Program Files (x86) \ Microsoft.NET \ Primary Interop Assemblies в местоположение вашего скрипта (может быть сетевой диск)
  2. Используйте сценарий Load-Assembly.ps1 (код приведен ниже и по адресу: http://sdrv.ms/U6j7Wn), чтобы загрузить типы сборки в памяти например:.. \ Load-Assembly.ps1 -Path \ microsoft.mshtml.dll

Затем действуйте как обычно, чтобы создать объект IE и т.д. Внимание: при работе с методы write() и writeln() используют обратные совместимые методы: IHTMLDocument2_write() и IHTMLDocument2_writeln().

+0

Я проголосовал за это, но поскольку я использую powershell удаленно на нескольких машинах, это непрактично. Спасибо –

+0

Хотя я бы предпочел решение, которое не связано с копированием dll на несколько файлов, этот ответ пришел ближе всего, а щедрость истекала - Спасибо –

+0

@YounElan Добро пожаловать! Спасибо за награду! –

1

Насколько я могу судить, на Windows Server 2012, чтобы получить полный HTML страницы:

$ie.document.documentElement.outerhtml 

Существует также innerhtml свойство на documentElement, который отсекает корневой <html> элемент.

Конечно, если все, что вы хотите сделать, это получить сырье разметку, рекомендуется использовать Invoke-WebRequest:

$doc = Invoke-WebRequest 'http://www.example.com' 
$doc.Content 
+0

Я хотел написать $ ie.document.documentElement.innerhtml - он пуст в 2012 году. Редактировать мой пост. $ ie.document - это System .__ ComObject, но при вводе $ ie.document.documentElement ничего не возвращается. Информация о Invoke-WebRequest интересна, поэтому я буду голосовать, но, к сожалению, в моем случае мне нужно использовать Internet Explorer. –

2
$ie.document.documentHtml.innerhtml 

Вопрос в том, как это могло когда-либо сработать. Свойство Document возвращает ссылку на IHTMLDocument interface, у него нет свойства "documentHtml". Никогда не бывает ясно, что вы можете вернуть, когда используете последнее связывание, как это было сделано в этом коде. Существует прежнее свойство documentHtml, поддерживаемое элементом управления редактирования DHTML, который был надежно установлен в the pasture. По общему признанию, это скорее дикая догадка.

Anyhoo, правильный синтаксис использовать, скажем, body свойства:

$ie = new-object -com "InternetExplorer.Application" 
    $ie.navigate2("http://www.example.com/") 
    while($ie.busy) {start-sleep 1} 
    $txt = $ie.document.body.innerhtml 
    Write-Output $txt 

Если у вас есть проблемы, Powershell делает лечение нулевых ссылок, а undiagnosably, то попробуйте запустить эти C# код на машине. Должен дать вам лучшее сообщение:

using System; 

class Program { 
    static void Main(string[] args) { 
     try { 
      var comType = Type.GetTypeFromProgID("InternetExplorer.Application"); 
      dynamic browser = Activator.CreateInstance(comType); 
      browser.Navigate2("http://example.com"); 
      while (browser.Busy) System.Threading.Thread.Sleep(1); 
      dynamic doc = browser.Document; 
      Console.WriteLine(doc.Body.InnerHtml); 
     } 
     catch (Exception ex) { 
      Console.WriteLine(ex.ToString()); 
     } 
     Console.ReadLine(); 
    } 
} 
+0

на моих окнах 2012, не доступны $ ie.document.body или $ ie.document.body.innerhtml. Спасибо, хотя –

+0

Это необычно странно, объектная модель IE была очень долгое время и не отличается в 2012 году. Запустите Regedit.exe на этом компьютере и перейдите к 'HKCR \ InternetExplorer.Application'. Введите ключевое значение CLSID, которое вы видите там. И укажите версию IE в диалоговом окне «Справка + о себе». –

+0

Я ценю помощь. IE версии 10.0.9200.16384 и clsid {0002DF01-0000-0000-C000-000000000046} –