我很困惑我的程序是如何工作的。我使用线程(从另一个堆栈溢出响应中被告知这样做),以便webBrowser2.Navigate(Url);
in TestScenarios()
在GetScenarios()
的while
循环中异步运行。这一切都很好。
现在,我在WebBrowser
控件中添加了一段代码来注入和运行一些javascript。然而,每次我打电话给HtmlElement head = webBrowser2.Document
..。行中,我得到了“指定的强制转换无效错误”。
我知道这个错误与在一个单独的UI线程中访问WebBrowser
控件有关,并且无法以这种方式工作,但我不知道这到底意味着什么,以及如何修复它。
如果您需要更多的上下文,只需评论。
public void GetScenarios()
{
new Thread(() =>
{
while() {
...
TestScenarios();
}
}).Start();
}
TestScenarios() {
...
Action action = () =>
{
webBrowser2.Tag = signal;
webBrowser2.Navigate(Url);
webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted;
webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted;
};
webBrowser2.Invoke(action);
signal.WaitOne();
...
//Run some javascript on the WebBrowser control
HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser2.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello') }";
head.AppendChild(scriptEl);
webBrowser2.Document.InvokeScript("sayHello");
}
发布于 2013-07-29 08:21:39
您正面临这个问题,因为在加载文档之前正在访问webBrowser的元素。你应该移动这段代码
HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser2.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function sayHello() { alert('hello') }";
head.AppendChild(scriptEl);
webBrowser2.Document.InvokeScript("sayHello");
至
WebBrowserDocumentCompleted
事件。
发布于 2013-07-29 08:15:13
首先..。你真的应该在调试器中完成它,找出你要转换的对象是什么.这看起来不像是一个线程问题。
根据您的错误,webBrowser2.Document.GetElementsByTagName("head")[0]
不能转换为HtmlElement
。
你也可以试试这样的方法看看物体是什么.
var head = webBrowser2.Document.GetElementsByTagName("head")[0] as HtmlElement;
if (head == null)
{
Console.WriteLine(typeof(head); // output the object type somehow
}
发布于 2013-07-29 08:18:44
通过将JS脚本块封装到:
webBrowser2.Invoke(new Action(() =>
{
//......
}
https://stackoverflow.com/questions/17928767
复制相似问题