我正在用C#开发一个应用程序(确实使用ASP .NET)。我正在使用WebBrowser控件,我在其中插入一些HTML代码(基本上是一个只提交表单的表单和javascript函数)。该表单的目的是登录一些网站(如果我在文档中插入HTML,我在Chrome或IE上打开它,它可以工作,我可以登录并将它重定向到网站)。
我需要WebBrowser控件来登录并重定向到表单操作字段中指向的url,就像真正的WebBrowser一样,但它似乎没有对这些命令做出任何反应:
我等到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后,它总是至少触发一次。答案 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;
}
}