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

mas*_*san 13 c# browser visual-studio-2005 selenium-ide comobject

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

例:

<span id="foo" onclick+"window.location.href='someURL'>click here</span>
Run Code Online (Sandbox Code Playgroud)

我的目标是获取字符串"window.location.href ='someURL'".

场景:

用户点击Web页面元素,例如上面显示的标记,在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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject
Run Code Online (Sandbox Code Playgroud)

如图所示,span.onclick仍然给我System .__ ComObject,我做错了什么?

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

UPDATE

研究,研究.....

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

Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(span.onclick));
Run Code Online (Sandbox Code Playgroud)

输出:

JScriptTypeInfo
Run Code Online (Sandbox Code Playgroud)

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

更多详情

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

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

1. actionType
2. xpath
3. value
Run Code Online (Sandbox Code Playgroud)

例如,

type, //input[@id=foo], "hello world"
clickAndWait, //link=login, ""
Run Code Online (Sandbox Code Playgroud)

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

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

Aka*_*ava 9

有很多方法可以做到.

  1. DOM中有一个Event对象,它将为您提供有关生成此事件的元素的信息.
  2. 你可以在这里查看,http://msdn.microsoft.com/en-us/library/ff975965%28v=VS.85%29.aspx
  3. 这个很好,您可以轻松使用它,您将获取事件对象作为方法参数,您可以调查参数以找出事件的来源.http://support.microsoft.com/kb/312777

另一种方法是使用自定义导航网址并对其进行操作

  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
Run Code Online (Sandbox Code Playgroud)

你可以打电话,

window.external.ShowMessageBox("This was called from JavaScript");
Run Code Online (Sandbox Code Playgroud)


Pom*_*oma 2

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