如何从webbrowser控件获取onclick中的实际JavaScript值?

我正在寻找一种方法来获取onclick中定义的JavaScript代码。 我正在使用.NET 2.0 C#Visual Studio 2005。

例:

click here 

我的目标是获取字符串“window.location.href =’someURL’”

场景:

用户点击Web页面元素,例如上面显示的标签,在WebBrowser控件内部。 然后将单击的标记tmlElement object到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,我做错了什么?

为什么HtmlElement的GetAttribute()方法返回“mshtml.HTMLInputElementClass”而不是属性的值? 这家伙说它在他的情况下工作,我跟着它,但我的有点不工作……

UPDATE

研究,研究…..

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

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

输出:

 JScriptTypeInfo 

看起来这是一个JScript类型……我该如何访问这个对象?

更多详情

以上描述基于我目前的项目。 该项目旨在创建像Selenium IDE这样的东西。 它使用WebBrowser控件。

Selenium IDE创建了3种不同的东西来记录Web文档中的元素。

 1. actionType 2. xpath 3. value 

例如,

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

Selenium IDE识别页面加载,因此它在"click""clickAndWait"之间更改actionType。 我的情况,我想简单一点。

如果我单击该元素,如果它是anchor tag或具有页面加载类型的javascript,如onclick=window.location.href='blah'那么我想将actionType设置为"clickAndWait"

有很多方法可以做到。

  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。如果它包含任何此类,请将cancel设置为true。 (这将停止浏览器导航)。
  3. 然后,您可以从C#代码导航Webbrowser代码并将cancel传递为true。

另一种Alternative方法是使用External对象,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,然后通过IHTMLDOMNode.attributes读取属性 。 HtmlElement.GetAttribute获取从嵌入属性生成的jscript函数的IDispatch接口。

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

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

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

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

您可以通过首先阅读obj.outerHtml轻松地自己解析它。 那应该给你这个obj的整个html,然后搜索它的值onclick =“????” 并提取???? 部分。