Как отправить код JavaScript в IE с помощью C # (.Net 3.5), запустить его, а затем получить строковое возвращаемое значение из кода JS? - PullRequest
2 голосов
/ 11 ноября 2009

Мы разрабатываем приложение, которое должно взаимодействовать с активным документом в IE.

Контекст: Приложение представляет собой настольное приложение на C #, .Net 3.5. Целью является выделение определенных текстовых элементов на веб-странице по запросу пользователя. Для этого нам нужно извлечь и интерпретировать элементы веб-страницы (необходимость возвращаемого значения), а затем воздействовать на них посредством другого вызова JS. Операции, которые должны быть выполнены на веб-странице, не все выполняются одновременно, поэтому мы должны получить своего рода «снимок» интересных текстовых элементов (мы делаем это в версии нашего приложения для Mac, возвращая строку, содержащую XML представление этих элементов).

В .Net мы успешно использовали метод IHTMLDocument2 execScript для запуска некоторого JavaScript внутри активного документа IE, но мы не можем найти способ получить возвращаемое значение из вызова. На основании документа execScript возвращает константу успеха / неудачи выполнения, которая нам не нужна.

По сути, нам нужно загрузить JavaScript из текстового файла в строку, а затем отправить его в IE для выполнения. Затем нам нужно получить строку из вызванного скрипта.

Есть какие-нибудь подсказки, какие объекты использовать? Как приступить к получению этой функциональности?

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

Мой коллега нашел решение, основываясь на том, что сказал Алан Харфорд:

string jsToRun = "function myTest() { return document.title; } myTest();";
mshtml.IHTMLDocument2 myIHTMLDocument2 = GetSelectedIEWindow();
IE ie = IE.AttachToIE(Find.ByUrl(myIHTMLDocument2.url));
string jsReturn = ie.Eval(jsToRun);

jsReturn содержит строковое значение, возвращаемое из myTest() в JavaScript. Обратите внимание, что в скрипте нет return до вызова функции myTest()!

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Посмотрите на кодовую базу WatiN. Там IE.Eval делает именно то, что вы ищете.

2 голосов
/ 11 ноября 2009

Если вы предоставляете html и скрипт самостоятельно, вы можете сделать следующее:

  • выполнить функцию JavaScript
  • разрешить функции js поместить результат в элемент html
  • дождитесь завершения работы функции
  • получить элемент html, используя document.getElementById
  • и получить значение

Я не уверен, есть ли более простой способ сделать это.

1 голос
/ 11 ноября 2009

Ну, это противно, но это можно сделать.

Попробуйте это:

    [Guid("626FC520-A41E-11CF-A731-00A0C9082637"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    interface IHTMLDocument
    {
        void Script([Out, MarshalAs(UnmanagedType.Interface)] out object ppScript);
    }

    public object RunScript(InternetExplorer ie, string scriptText)
    {                        
        IHTMLDocument doc = (IHTMLDocument)ie.Document;
        object scriptObj;
        doc.Script(out scriptObj);

        Type t = scriptObj.GetType();
        return t.InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, scriptObj, new object[] { scriptText });            
    }

Это вернет ваше значение в объекте (просто приведите к тому типу, который вы ожидали). Конечно .NET 4 делает это еще проще;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...