0

我对我的程序如何工作感到困惑。我正在使用线程(从另一个 Stack Overflow 答案中被告知这样做),以便webBrowser2.Navigate(Url);in在循环中TestScenarios()异步运行。这一切都很好。whileGetScenarios()

WebBrowser现在,我添加了一段代码来在控件内注入和运行一些 javascript 。但是,每次我调用HtmlElement head = webBrowser2.Document.... 行时,都会收到“Specified cast is not valid error”。

我知道这个错误与WebBrowser在单独的 UI 线程中访问的控件有关,并且无法以这种方式工作,但我对这到底意味着什么以及如何修复它感到困惑。

如果您需要更多上下文,请发表评论。

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");
    }
4

3 回答 3

2

您正面临这个问题,因为您甚至在加载文档之前就访问了 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-29T16:21:39.743 回答
1

首先...您应该真正在调试器中逐步完成它并弄清楚您要投射的对象是什么...这似乎不是线程问题。

根据您的错误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-29T16:15:13.843 回答
0

设法通过将 JS 脚本块包装在以下内容中来修复它:

webBrowser2.Invoke(new Action(() =>
{
     //......
}
于 2013-07-29T16:18:44.147 回答