如何从Web浏览器控件中获取onclick中的实际JavaScript值

本文关键字:JavaScript onclick 获取 Web 浏览器 控件 | 更新日期: 2023-09-27 17:58:14

我正在寻找一种方法来获得在onclick中定义的JavaScript代码。我使用的是.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仍然给我系统__ComObject,我做错了什么?

中,为什么HtmlElement的GetAttribute()方法返回"mshtml.HTMLInputElementClass"而不是属性的值

更新

研究,研究。。。。。

我可以将引用VisualBasic.dll添加到我的C#项目中,然后调用该方法来找出谁是这个系统__ComObject确实是。

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

输出:

JScriptTypeInfo

看起来这是一个JScript类型。。。如何访问此对象?

更多详细信息

以上描述是基于我目前的项目。该项目旨在创建类似SeleniumIDE的东西。它使用WebBrowser控件。

SeleniumIDE创建了3个不同的东西来记录web文档中的元素。

1. actionType
2. xpath
3. value

例如,

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

SeleniumIDE识别页面加载,因此它在"click""clickAndWait"之间更改actionType。我的案子,我想简单一点。

如果我点击元素,并且它是anchor tag或具有页面加载类型的javascript例如CCD_ 6,那么我想要将actionType设置为CCD_。

如何从Web浏览器控件中获取onclick中的实际JavaScript值

有很多方法可以做到这一点。

  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"或"mycommard:clickandwait"3,请检查导航url。如果它包含其中任何一个,则将cancel设置为true。(这将停止浏览器导航)
  3. 然后,您可以从C#代码中导航您的网络浏览器代码,并将cancel作为true传递

另一种替代方法是使用外部对象,WebBrowser允许您设置一个ObjectForScripting,您可以在HTML的Javascript中访问它。

.NET 2.0 中的ObjectForScripting

[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");

将元素对象强制转换为mshtml。然后通过IHTMLDOMNode.attributes.HtmlElement.GetAttribute获取嵌入属性生成的jscript函数的IDispatch接口。

根据盛江的回应,这里有一些工作样本:

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;
        }
    }
}

您可以尝试使用HtmlAgilityPack解析webBrowser1.DocumentText属性,然后使用XPath获得所需结果。

如果你不必用C#来做(你可以用JS来做,并创建一个Postback),你应该看看这个问题。

您可以通过首先读取obj.outerHtml来轻松地自己解析它。这将为您提供该obj的整个html,然后搜索值onclick="???"并提取????部分