我有一个C#应用程序在WebBrowser
中自动填写并提交表单,然后在表单提交并在服务器上处理后返回DocumentText
,我尝试了这段代码,但是我在提交表单之前收到了DocumentText
。
private String afterform()
{
String toreturnstring = "";
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
HtmlElement theform= webBrowser1.Document.GetElementById("theform");
theform.InvokeMember("Submit");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
toreturnstring = webBrowser1.DocumentText;
return toreturnstring;
}
注意:我看到在返回toreturnstring
后已经打开了表单目标页面。
答案 0 :(得分:1)
这种情况正在发生,因为您太快收到了DocumentText。当WebBrowsers状态返回到Complete时,不一定要设置DocumentText。
根据MSDN:
如果设置此属性的值,然后立即检索 再次,检索的值可能与设置的值不同 WebBrowser控件没有时间加载新内容。您 可以在DocumentCompleted事件处理程序中检索新值。 或者,您可以阻止线程,直到加载文档 通过在循环中调用Thread.Sleep方法直到DocumentText property返回您最初设置它的值。
虽然在这种情况下我们没有直接设置DocumentText的值,但我仍然想进行快速测试以查看页面导航是否发生了更改。在测试之后,注意到在调用DocumentCompleted事件处理程序时仍未设置DocumentTest。
我在页面网址更改后的某个时间创建了另一个事件(按钮)。然后,我检查了DocumentText,并将其更改为新页面。也尝试使用thread.sleep作为MSDN建议并且它可以工作。
我希望这会有所帮助。
public string NewDocumentTextForMeToPlayWith{ get; set; }
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
NewDocumentTextForMeToPlayWith = webBrowser1.DocumentText;
}
private void button1_Click(object sender, EventArgs e)
{
HtmlElement theform = webBrowser1.Document.GetElementsByTagName("form")[0];
theform.InvokeMember("Submit");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
Thread.Sleep(1000);
}