表单提交后获取webBrowser的DocumentText

时间:2014-12-03 18:14:56

标签: c# .net browser

我有一个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后已经打开了表单目标页面。

1 个答案:

答案 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);


}