Как получить реальное значение JavaScript в onclick из элемента управления веб-браузера? - PullRequest
13 голосов
/ 03 июня 2011

Я ищу способ получить код JavaScript, определенный внутри onclick.Я использую .NET 2.0 C # 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's 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, что я делаю не так?

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

ОБНОВЛЕНИЕ

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

Я могу добавить ссылку VisualBasic.dll в мой проект C #, а затем вызвать метод, чтобы выяснить, кто эта Система .__ 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 распознает загрузку страницы, поэтому она изменяет actionType между "click" и "clickAndWait".Мой случай, я хочу сделать это просто.

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

Ответы [ 6 ]

9 голосов
/ 09 июня 2011

Есть несколько способов сделать это.

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

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

  1. Переопределить событие BeforeNavigate
  2. Проверьте URL-адрес навигации, если он содержит «mycommand: click» или «mycommand: clickandwait» 3. Если он содержит что-либо из этого, установите отмену как true. (это прекратит навигацию по браузеру).
  3. Затем вы можете перемещаться по коду веб-браузера из кода C # и проходить отмену как 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 голосов
/ 14 июня 2011

Приведите объект элемента к mshtml.IHTMLDOMNode, затем прочитайте атрибуты через IHTMLDOMNode.attributes .HtmlElement.GetAttribute получает интерфейс IDispatch функции jscript, созданной из встроенного атрибута.

2 голосов
/ 10 ноября 2011

Согласно ответу Шэн Цзяна, вот несколько рабочих образцов:

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;
        }
    }
}
2 голосов
/ 09 июня 2011

Если вы НЕ ДОЛЖНЫ делать это с C # (вы можете сделать это с JS и создать обратную передачу), вам следует взглянуть на ЭТОТ вопрос.

2 голосов
/ 06 июня 2011

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

1 голос
/ 10 апреля 2012

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

...