Как получить фактическое значение JavaScript в onclick из управления веб-браузером?

Я ищу способ получить код JavaScript, определенный внутри onclick. Я использую .NET 2.0 С# Visual Studio 2005.

Пример:

<span id="foo" onclick+"window.location.href='someURL'>click here</span>

Моя цель - получить строку "window.location.href= 'someURL'" .

Сценарий:

Пользователь нажимает элемент веб-страницы, например, тег, показанный выше, внутри элемента управления WebBrowser. Затем тег с щелчком ссылается на H tmlElement object.

В элементе управления WebBrowser я вызываю HtmlElement object getAttribute("onclick"), он просто дает мне " System.__ ComObject".

Я искал, как с этим разобраться, а затем обнаружил, что его можно отличить, а затем получить значение.

if (tag.GetAttribute("onclick").Equals("System.__ComObject"))
{
    Console.WriteLine("dom elem  >>>>>>>>>>> " + tag.DomElement.ToString());
    mshtml.HTMLSpanElementClass span = (mshtml.HTMLSpanElementClass)tag.DomElement;

    Console.WriteLine("js value ===>" + span.onclick);
}

Вывод:

dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject

Как показано, span.onclick все равно дает мне System.__ ComObject, что я делаю неправильно?

В Почему метод HtmlElement GetAttribute() возвращает "mshtml.HTMLInputElementClass" вместо значения атрибута? этот парень сказал, что это сработало в его случае, и я последовали за ним, но моя несколько не работает...

UPDATE

Исследования, исследования.....

Я могу добавить ссылку VisualBasic.dll в мой проект С#, а затем вызвать метод, чтобы узнать, кто является этой Системой.__ ComObject действительно есть.

Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(span.onclick));

Вывод:

JScriptTypeInfo

Похоже, это тип JScript... как я могу получить доступ к этому объекту?

Подробнее

Вышеприведенное описание основано на моем текущем проекте. Проект должен создать нечто вроде Selenium IDE. Вместо этого он использует управление WebBrowser.

Selenium IDE создает 3 разных объекта для записи элемента в веб-документе.

1. actionType
2. xpath
3. value

Например,

type, //input[@id=foo], "hello world"
clickAndWait, //link=login, ""

Selenium IDE распознает загрузку страницы, чтобы она изменяла тип действия между "click" и "clickAndWait". В моем случае я хочу сделать это простым.

Если я нажму на элемент и если он anchor tag или имеет тип загрузки страницы javascript например onclick=window.location.href='blah', тогда я хочу установить для actionType значение "clickAndWait".

Ответ 1

Существует несколько способов сделать это.

  • В DOM есть объект Event, который предоставит вам информацию о том, какой элемент сгенерировал это событие.
  • Здесь вы можете посмотреть http://msdn.microsoft.com/en-us/library/ff975965%28v=VS.85%29.aspx
  • Это хорошо, вы можете использовать это легко, вы получите объект события как параметр метода, который вы можете исследовать параметры, чтобы узнать источник события. http://support.microsoft.com/kb/312777

Другой альтернативой является использование настраиваемого навигационного url и действие на него

  • Переопределить событие BeforeNavigate
  • Проверьте URL-адрес навигации, если он содержит "mycommand: click" или "mycommand: clickandwait" 3. Если он содержит все это, установите для параметра "Отменить" как истинный. (это остановит навигацию браузером).
  • Затем вы можете перемещать свой код веб-браузера с вашего кода на С# и передавать его как true.

Другим альтернативным методом является использование внешнего объекта, WebBrowser позволяет вам установить ObjectForScripting, который вы можете получить в Javascript HTML.

ObjectForScripting в .NET 2.0

[ComVisible(true)]
public class MyClass
{
   // can be called from JavaScript
   public void ShowMessageBox(string msg){
       MessageBox.Show(msg);
   }
}

myBrowser.ObjectForScripting = new MyClass(); 
// or you can reuse instance of MyClass

И вы можете позвонить,

window.external.ShowMessageBox("This was called from JavaScript");

Ответ 3

Вы можете попытаться проанализировать свойство webBrowser1.DocumentText, используя HtmlAgilityPack, а затем получить желаемый результат с помощью XPath.

Ответ 4

Если вам не нужно делать это с помощью С# (вы можете сделать это с помощью JS и создать Postback), вы должны взглянуть на ЭТО вопрос.

Ответ 5

В соответствии с ответом Sheng Jiang, вот несколько рабочих примеров:

IHTMLElement element = YourCodeToGetElement();
string onclick = string.Empty;

IHTMLDOMNode domNode = element as IHTMLDOMNode;
IHTMLAttributeCollection attrs = domNode.attributes;

foreach (IHTMLDOMAttribute attr in attrs)
{
    if (attr.nodeName.Equals("onclick"))
    {
        string attrValue = attr.nodeValue as string;
        if (!string.IsNullOrEmpty(attrValue))
        {
            onclick = attr.nodeValue;
            break;
        }
    }
}

Ответ 6

Вы можете легко разобрать его, сначала прочитав obj.outerHtml. Это должно дать вам весь html для этого obj, а затем искать его для значения onclick = "????" и вытащить???? часть.