Запуск функции JavaScript в экземпляре Internet Explorer - PullRequest
7 голосов
/ 18 августа 2010

Я использую

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer()

для управления / автоматизации экземпляра Internet Explorer. На некоторых страницах я хотел бы запустить функцию JavaScript (init()). Кажется, лучший способ сделать это - использовать метод HtmlDocument InvokeScript, и я безуспешно пытаюсь сделать следующее:

void ie_DocumentComplete(object pDisp, ref object URL)
{
  System.Windows.Forms.HtmlDocument doc = ie.Document;
  doc.InvokeScript("init");
}

Что не получается, потому что doc равно нулю. Я не могу получить System.Windows.Forms.HtmlDocument от ie.Document. Помимо попыток описанного выше, я также попробовал:

System.Windows.Forms.HtmlDocument doc2 = (System.Windows.Forms.HtmlDocument)ie.Document;

и

System.Windows.Forms.HtmlDocument doc2 = ie.Document as System.Windows.Forms.HtmlDocument;

Любые идеи о том, как я могу заставить это работать - или еще лучший способ запуска сценариев на странице?

Спасибо !!

EDIT :

Другой способ запуска функции JavaScript выглядит следующим образом:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer()
mshtml.HTMLDocument doc = ie.Document;
mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;
win.execScript("init();", "javascript");

Но линия

mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;

выдает ошибку, что это недопустимое приведение (InvalidCastException) - даже если IntelliSense (и MSDN) говорят, что doc.parentWindow - это IHTMLWindow2. Есть идеи? (Также я убедился, что страница полностью загружена перед запуском этого кода)

Ответы [ 5 ]

6 голосов
/ 19 августа 2010

Проблема была связана с многопоточностью - я потратил так много времени на проблемы с STA, что вы уже подумали, что я бы научился:)

Так или иначе, я нашел способ получить второй кусок кода, который я разместил, работая и выполняя функции javascript в окне IE! Вот код:

this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
                {

                        mshtml.HTMLDocument doc = ie.Document;

                        mshtml.IHTMLWindow2 win = doc.parentWindow as IHTMLWindow2;
                        win.execScript("init();", "javascript");


                }));

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 19 мая 2011

Вы должны получить доступ к document.parentWindow в потоке STA.Это может помочь вам:

  private WebBrowser _webBrowser; //initialize this somewhere

  private void ExecuteJavaScript()
  {
     Thread aThread = new Thread(ExecuteJavaScriptWorker);
     aThread.SetApartmentState(ApartmentState.STA);
     aThread.Start(); 
  }

  private void ExecuteJavaScriptWorker()
  {
      HTMLDocument _document = _webBrowser.Document;
      _document.parentWindow.execScript("alert('Arbitrary javascript code')", "javascript");
  }
1 голос
/ 28 ноября 2015

Вы можете просто сделать:

ie.Navigate("javascript:" + jsScript);

где ie это ваш экземпляр internetexplorer

1 голос
/ 05 декабря 2014

Это пример того, как получить Документ какой-то страницы. Это близко к приведенным выше примерам с небольшим (но важным) отличием - я использую метод Navigate2 - этот работает правильно.

public static mshtml.HTMLDocument NavigateTo(String anUrl) {
  object locEmpty = 0;
  object locUrl = anUrl;
  SHDocVw.InternetExplorer _ie = new SHDocVw.InternetExplorer();
  _ie.Visible = true;
  _ie.Navigate2(locUrl, ref locEmpty, ref locEmpty, ref locEmpty, ref locEmpty);
  return(_ie.Document);
}   

Этот пример будет работать для всех страниц, которые открываются IE в обычном (не модальном) окне. Для модальных окон (или модальных диалогов) этот пример не работает.

0 голосов
/ 18 августа 2010

SHDocVw.InternetExplorer.Document имеет тип mshtmlHTMLDocumentClass, поэтому вам необходимо сослаться на Microsoft.mshtml

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;

Объект ie также должен где-то перемещаться, чтобы документ имел значение.например,

object test = new object();
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test);

Всего инициализации:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
object test = new object();
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test);
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...