Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从webbrowser控件获取onclick中的实际JavaScript值?_C#_Visual Studio 2005_Browser_Selenium Ide_Comobject - Fatal编程技术网

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

C# 如何从webbrowser控件获取onclick中的实际JavaScript值?,c#,visual-studio-2005,browser,selenium-ide,comobject,C#,Visual Studio 2005,Browser,Selenium Ide,Comobject,我正在寻找一种在onclick中定义JavaScript代码的方法。 我正在使用.NET2.0C#VisualStudio2005 示例: <span id="foo" onclick+"window.location.href='someURL'>click here</span> dom elem >>>>>>>>>>> mshtml.HTMLSpanElementClass js value ==

我正在寻找一种在onclick中定义JavaScript代码的方法。 我正在使用.NET2.0C#VisualStudio2005

示例:

<span id="foo" onclick+"window.location.href='someURL'>click here</span>
dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject
JScriptTypeInfo
输出:

<span id="foo" onclick+"window.location.href='someURL'>click here</span>
dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject
JScriptTypeInfo
如图所示,span.onclick仍然为我提供系统。\u ComObject,我做错了什么

在这件事上,这家伙说这在他的案子中起了作用,我也跟着做了,但我的有点不起作用

更新

研究,研究

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

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

<span id="foo" onclick+"window.location.href='someURL'>click here</span>
dom elem  >>>>>>>>>>> mshtml.HTMLSpanElementClass
js value ===> System.__ComObject
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可以识别页面加载,因此它可以在
“单击”
“单击并等待”
之间更改操作类型。我的情况是,我想让它变得简单

如果我点击元素,如果它是
锚定标记
,或者具有页面加载类型的javascript
例如
onclick=window.location.href='blah'
,然后我想将actionType设置为
“clickAndWait”

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

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

  • DOM中有一个事件对象,它将为您提供有关生成此事件的元素的信息
  • 你可以看看这里
  • 这一个很好,您可以很容易地使用它,您将获得事件对象作为方法参数,您可以调查参数以找出事件的源 另一种选择是使用自定义导航url并对其进行操作

  • 覆盖BeforeNavigate事件
  • 检查导航url是否包含“mycommand:click”或“mycommand:clickandwait”3。如果它包含以下任何内容,则将“取消”设置为true。(这将停止通过浏览器进行导航)
  • 然后,您可以从C#代码导航webbrowser代码,并将cancel作为true传递
  • 另一种替代方法是使用外部对象,WebBrowser允许您设置一个可以在HTML的Javascript中访问的对象

    你可以打电话

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

    如果您不必使用C#(您可以使用JS并创建回发),您应该看看这个问题。

    将元素对象强制转换为mshtml.IHTMLDOMNode,然后。HtmleElement.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;
            }
        }
    }
    

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

    看起来span.onclick实际上是一个属性,也许我完全走错了方向,但你不能只添加runat=“server”并访问onclick属性吗?@RBaarda:我不知道runat=“server”是什么,它看起来像是我可以添加到html标记中的属性,但就我而言,我不是网页作者。我只是对一些随机站点使用WebBrowser控件。您正在开发带有web浏览器控件的Windows应用程序吗?您想实现IE开发者Inspect元素所具有的相同功能吗?@masato san您最后是如何解决此问题的?谢谢您提供的信息。问题是我需要在webbrowser中单击带有onclick(ex)的元素,然后需要查找onclick中的内容(即foo();)。在我的场景中,我无法事先知道xpath。感谢这个列表,因为#2它只在IE9上可用,但我的环境是带有IE6的.NET framework 2.0,所以我认为我不能依赖于#2。至于#3,我没有使用SHDocVw.dll,我只是使用mshtml.dll。像我的事件处理程序一样,只声明了:private void ClickEventHandler(object sender,HtmlElementEventArgs e)所以#3我认为这不是一个选项……但是为什么不尝试使用自己的URL方案的替代方法,并取消导航,在导航中您将获得通过的URL。@Akash Kava:是的,我想我会尝试这种方法。如果它能起作用的话,那就相当顺利了!:)是的,但是您可以创建自己的urlscheme,就像您可以放置mycommand:Command1、mycommand:Command2一样,并且基于Command1和Command2您可以控制您的逻辑,这是每个软件的工作方式。导航和BeforeNavigate是相同的事件,我认为一个在WinForm中,另一个在WPF中。您是否尝试过外部接口访问?如果您设置webBrowser.ExteranlObject(我不知道确切名称)=myClass,myClass应该是Com可见的,您也可以直接从javascript调用其方法。谢谢,但我使用System.Windows.Form.HtmleElement并将其实例转换为mshtml。IHTMLDOMNode是编译错误。我可以执行mshtml.IHTMLDOMNode castedElement=(mshtml.IHTMLDOMNode)多姆文件;Console.WriteLine(castedElement.attributes);若要强制转换但仍为我提供System.COM_Object.IHTMLDOMNode.attributes,则返回属性集合的IDispatch接口(请注意属性名称末尾的s)。链接的示例通过IHTMLAttributeCollection接口枚举集合,并通过IHTMLDOMAttribute接口检查集合中每个项的属性名称。是否有任何方法可以在不枚举所有属性的情况下执行此操作(速度非常慢)但是直接使用某个东西
    getAttribute
    ?我在IE中隔离了这个bug-它失败了
    ,但是它不会
    ,所以你不能有一个带有你试图读取的属性名称的表单项。对于
    GetAttribute(“操作”)
    ,此操作将失败;对于
    GetAttribute(“方法”)
    >
    ,此操作将失败。我