从Web浏览器控件中读取Javascript变量

我试图读取从我的表单上的WebBrowser控件加载和调用的Javascript变量的值。

例:

index.html引用一个名为’test.js’的javascript。在test.js上,创建并填充了几个变量。

index.html然后调用这个JS。

Index.html被加载并显示在WebBrowser控件中。

我已经找到了很多关于如何调用/调用驻留在Web浏览器控件中的函数的帮助。 如何轻松读取变量值?

你可以这样做:

Document.InvokeScript("eval", new object[] { "my_var_name" }); 

您可以使用IHTMLDocument :: Script来检索脚本引擎的自动化接口。 如果在C#中使用Windows窗体Web浏览器控件,则意味着将HtmlDocument.DomDocument属性强制转换为mshtml.IHTMLDocument。 对于WPF,您可以直接转换文档。

全局变量作为属性和全局函数作为方法添加到脚本引擎中。 在IE9之前,如果您知道其名称,则可以使用IDispatch接口访问这些函数/变量。 HtmlDocument.InvokeScript和WPF的WebBrowser.InvokeScript以一种很好的方式包装它,但仅适用于System.Reflection.BindingFlags.InvokeMethod。 要访问变量,您需要在调用Invoke时传递DISPATCH_PROPERTYGET,即在托管代码中使用BindingFlags.GetProperty。

手动后期绑定并不好玩。如果您想知道后期绑定是多么费力,请使用Visual C#.NET检查Office自动化服务器的绑定 。

IE9中存在一个问题,即变量/函数无法通过IDispatch访问 ,但您仍然可以通过IDispatchEx以类似的方式访问变量/函数。

我不认为你能够从JS中获取变量的值,因为你的C#将在你的js var存在之前运行。 我自己也有同样的问题获取我的js变量的值,而我无法直接做到这一点。 你可以做的是使用HtmlTextWriter方法来获取值。 这将允许您使用C#呈现的js调用,该调用将允许您访问变量值。

例如:

  protected override void RenderContents(HtmlTextWriter writer) { EnsureChildControls(); base.RenderContents(writer); writer.BeginRender(); writer.RenderBeginTag(HtmlTextWriterTag.Script); writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); writer.RenderEndTag(); 

不是100%它会起作用,但我知道你可以通过这种方式访问​​你的js变量。 我已经完成了其他项目。 希望这可以帮助。

为了访问全局范围的JavaScript变量,我使用了一个名为GetGlobalVariable()的自定义方法。 (它使用了Juan的回答中的 Document.InvokeScript 。+ 1)

假设您在全局范围内创建的JavaScript变量如下:

 var foo = "bar"; var person = {}; var person.name = "Bob"; 

然后,您可以使用C# GetGlobalVariable()方法访问这些值。 (您可能需要设置计时器以持续检查是否填充了变量。)

 var foo = GetGlobalVariable(webBrowser, "foo"); var name = GetGlobalVariable(webBrowser, "person.name"); 

这是GetGlobalVariable()方法。 请注意,它会检查变量引用的每个部分以避免exception。

 private object GetGlobalVariable(WebBrowser browser, string variable) { string[] variablePath = variable.Split('.'); int i = 0; object result = null; string variableName = "window"; while (i < variablePath.Length) { variableName = variableName + "." + variablePath[i]; result = browser.Document.InvokeScript("eval", new object[] { variableName }); if (result == null) { return result; } i++; } return result; } 

看一下HtmlWindow类 。 您可以从WebBrowser.Document.Window获取它的实例。 如果你的js变量具有全局范围,它们将属于Window对象,并且应该可以从C#中的WebBrowser.Document.Window.DomWindow访问。

我认为这确实是一个范围问题。 如果你包含一个名为test.js的文件,那么在这个文件中你有这一行:

 var myVariable; 

然后,该变量使用全局范围创建,并且可以从页面中的任何位置以及您包含的任何其他JavaScript文件中访问。 如果在函数之外声明一个这样的变量,它将使用全局范围创建。

一想法。 如果您无法在主页面中访问变量,请确保在页面上的JavaScript尝试使用之前包含声明它并指定值的脚本。 您可能会遇到执行问题。