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 仍然给我 System.__ComObject,我做错了什么?

为什么 HtmlElement 的 GetAttribute() 方法返回“mshtml.HTMLInputElementClass”而不是属性的值? 这家伙说它在他的情况下有效,我已经按照它,但我的有点不起作用......

更新

研究,研究……

我可以将引用 VisualBasic.dll 添加到我的 C# 项目中,然后调用该方法来找出这个 System.__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"和之间更改 actionType "clickAndWait"。我的情况,我想让它变得简单。

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

4

6 回答 6

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

另一种选择是使用自定义导航 url 并对其进行操作

  1. 覆盖 BeforeNavigate 事件
  2. 检查 Navigation url 是否包含“mycommand:click”或“mycommand:clickandwait” 3. 如果它包含其中任何一个,则将取消设置为 true。(这将停止浏览器导航)。
  3. 然后您可以从您的 C# 代码导航您的网络浏览器代码,并将取消作为 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");
于 2011-06-09T13:23:20.153 回答
4

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

于 2011-06-14T06:11:54.930 回答
3

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

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;
        }
    }
}
于 2011-11-10T03:24:43.770 回答
2

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

于 2011-06-06T12:37:18.803 回答
2

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

于 2012-04-09T23:27:35.923 回答
2

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

于 2011-06-09T14:36:15.287 回答