¿Cómo inyectar Javascript en el control WebBrowser?
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?
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 IHTMLScriptElement
interfaz a su proyecto.
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.
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í .
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);
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.