¿Cómo inyectar Javascript en el control WebBrowser?

Resuelto jsight asked hace 16 años • 16 respuestas

He probado esto:

string newScript = textBox1.Text;
HtmlElement head = browserCtrl.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = browserCtrl.Document.CreateElement("script");
lblStatus.Text = scriptEl.GetType().ToString();
scriptEl.SetAttribute("type", "text/javascript");
head.AppendChild(scriptEl);
scriptEl.InnerHtml = "function sayHello() { alert('hello') }";

scriptEl.InnerHtml y scriptEl.InnerText dan errores:

System.NotSupportedException: Property is not supported on this type of HtmlElement.
   at System.Windows.Forms.HtmlElement.set_InnerHtml(String value)
   at SForceApp.Form1.button1_Click(Object sender, EventArgs e) in d:\jsight\installs\SForceApp\SForceApp\Form1.cs:line 31
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

¿Existe una manera fácil de inyectar un script en el dom?

jsight avatar Sep 30 '08 23:09 jsight
Aceptado

Por alguna razón, la solución de Richard no funcionó por mi parte (insertAdjacentText falló con una excepción). Sin embargo, esto parece funcionar:

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello') }";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("sayHello");

Esta respuesta explica cómo incorporar la IHTMLScriptElementinterfaz a su proyecto.

Atanas Korchev avatar Sep 30 '2008 19:09 Atanas Korchev
HtmlDocument doc = browser.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("text","function sayHello() { alert('hello'); }");
head.AppendChild(s);
browser.Document.InvokeScript("sayHello");

(probado en .NET 4/aplicación Windows Forms)

Editar: problema de caso solucionado en el conjunto de funciones.

typpo avatar Jun 03 '2011 02:06 typpo

Esta es la forma más fácil que encontré después de trabajar en esto:

string javascript = "alert('Hello');";
// or any combination of your JavaScript commands
// (including function calls, variables... etc)

// WebBrowser webBrowser1 is what you are using for your web browser
webBrowser1.Document.InvokeScript("eval", new object[] { javascript });

Lo que hace la función global de JavaScript eval(str)es analizar y ejecutar todo lo que esté escrito en str. Consulte la referencia de w3schools aquí .

Ilya Rosikhin avatar Dec 31 '2011 07:12 Ilya Rosikhin

Además, en .NET 4 esto es aún más fácil si usas la palabra clave dinámica:

dynamic document = this.browser.Document;
dynamic head = document.GetElementsByTagName("head")[0];
dynamic scriptEl = document.CreateElement("script");
scriptEl.text = ...;
head.AppendChild(scriptEl);
justin.m.chase avatar Jun 16 '2010 22:06 justin.m.chase

Si lo único que realmente desea es ejecutar JavaScript, esto sería lo más fácil (VB .Net):

MyWebBrowser.Navigate("javascript:function foo(){alert('hello');}foo();")

Supongo que esto no lo "inyectará", pero ejecutará su función, si eso es lo que busca. (En caso de que haya complicado demasiado el problema). Y si puede descubrir cómo inyectar en javascript, colóquelo en el cuerpo de la función "foo" y deje que javascript haga la inyección por usted.

Eyal avatar Feb 15 '2010 20:02 Eyal