.NET WebBrowser InvokeScript提交和重定向

时间:2015-01-28 17:32:55

标签: c# asp.net .net webbrowser-control

我正在用C#开发一个应用程序(确实使用ASP .NET)。我正在使用WebBrowser控件,我在其中插入一些HTML代码(基本上是一个只提交表单的表单和javascript函数)。该表单的目的是登录一些网站(如果我在文档中插入HTML,我在Chrome或IE上打开它,它可以工作,我可以登录并将它重定向到网站)。

我需要WebBrowser控件来登录并重定向到表单操作字段中指向的url,就像真正的WebBrowser一样,但它似乎没有对这些命令做出任何反应:

  • browser.Document.InvokeScript( “重定向”);
  • browser.Document.Forms [0] .InvokeMember( “提交”);

我等到DocumentCompleted被触发,以避免代码未加载时出现任何问题。代码基本上是这样的:

private void LogIn(string user, string pass)
    {
        Thread thread = new Thread(delegate()
        {
            using (WebBrowser browser = new WebBrowser())
            {
                browser.AllowNavigation = true;
                browser.Visible = true;
                browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
                var sb = new System.Text.StringBuilder();
                sb.AppendFormat("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
                sb.AppendFormat("<html style=\"position:relative;overflow: hidden;\">");
                sb.Append("<head>");
                sb.AppendFormat("<script type=\"text/javascript\">");
                sb.Append("function Redirect(){");
                sb.AppendFormat("document.forms[0].submit();");
                sb.Append("}");
                sb.Append("</script>");
                sb.Append("</head>");
                sb.Append("<body onload=\"Redirect()\">");
                sb.AppendFormat("<form method=\"POST\" action=\"" + ConfigurationManager.AppSettings["URL_TEST"] + "\">");
                sb.AppendFormat("<input type=\"hidden\" name=\"loginName\" id=\"loginName\" value=\"" + user + "\" />");
                sb.AppendFormat("<input type=\"hidden\" name=\"password\" id=\"password\" value=\"" + pass + "\" />");
                sb.Append("</form>");
                sb.Append("</body>");
                sb.Append("</html>");
                browser.DocumentText = @sb.ToString();
                while (browser.ReadyState != WebBrowserReadyState.Complete)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
    }

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser browser = sender as WebBrowser;
        browser.Visible = true;
        if (!browser.Url.AbsoluteUri.Contains("MyView"))
        {
            browser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
            browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
            browser.Document.InvokeScript("Redirect");
            // browser.Document.Forms[0].InvokeMember("submit");
        }
        else
        {
            int  a = 1;
        }
    }

正如我所看到的,DocumentCompleted应该被调用两次,一次当我设置browser.DocumentText和其他提交表单时。我应该重定向的URL包含单词MyView,因此第二次调用它时应该进入else块。但是,它只被调用一次。我可以得到任何帮助吗?提前谢谢。

编辑:有些时候,DocumentCompleted甚至一次也没有。将browser.visible设置为true后,它总是至少触发一次。

1 个答案:

答案 0 :(得分:0)

我认为问题出在url上   ConfigurationManager.AppSettings["URL_TEST"] 因为在我的表单中,DocumentCompleted被调用了两次。您可以考虑的一个可能的问题可能是打开的URL上的javascript错误,或类似的东西。  我只是在表单上添加了按钮,这里是代码:

 private void button1_Click(object sender, EventArgs e)
        {
            LogIn("", "");
        }

        private void LogIn(string user, string pass)
        {

                   .
                   . 
                   . 

        }

        private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser browser = sender as WebBrowser;
            if (!browser.Url.AbsoluteUri.Contains("MyView"))
            {
                browser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
                browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
                browser.Document.InvokeScript("Redirect");
                // browser.Document.Forms[0].InvokeMember("submit");
            }
            else
            {
                int a = 1;
            }
        }