如何从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确实是。 输出: 看起来这是一个JScript类型。。。如何访问此对象? 更多详细信息 以上描述是基于我目前的项目。该项目旨在创建类似SeleniumIDE的东西。它使用WebBrowser控件。 SeleniumIDE创建了3个不同的东西来记录web文档中的元素。 例如, SeleniumIDE识别页面加载,因此它在 如果我点击元素,并且它是Console.WriteLine(Microsoft.VisualBasic.Information.TypeName(span.onclick));
JScriptTypeInfo
1. actionType
2. xpath
3. value
type, //input[@id=foo], "hello world"
clickAndWait, //link=login, ""
"click"
和"clickAndWait"
之间更改actionType。我的案子,我想简单一点。anchor tag
或具有页面加载类型的javascript例如CCD_ 6,那么我想要将actionType设置为CCD_。
有很多方法可以做到这一点。
- DOM中有一个Event对象,它将为您提供有关哪个元素生成了此事件的信息
- 你可以看看这里,http://msdn.microsoft.com/en-us/library/ff975965%28v=VS.85%29.aspx
- 这个很好,你可以很容易地使用它,你会得到事件对象作为方法参数,你可以调查参数来找出事件的来源。http://support.microsoft.com/kb/312777
另一种选择是使用自定义导航url并对其进行操作
- 覆盖BeforeNavigate事件
- 如果导航url包含"mycommand:click"或"mycommard:clickandwait"3,请检查导航url。如果它包含其中任何一个,则将cancel设置为true。(这将停止浏览器导航)
- 然后,您可以从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="???"并提取????部分