Oppure

Loading
18/08/11 19:47
Metal
Sono ancora qui con sto bot.

Posto il codice che uso per fare il login (funzionante, il login lo fa), così si capisce meglio:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (stage == 0)
            {
                webBrowser1.Navigate("indirizzo1");

                txtState.Text = "State " + stage;
                stage++;
            }
            else if (stage == 1)
            {
                webBrowser1.Document.GetElementById("contact_username").SetAttribute("value", txtUser.Text);
                webBrowser1.Document.GetElementById("contact_password").SetAttribute("value", txtPass.Text);

                HtmlElementCollection allElements = webBrowser1.Document.All;

                foreach (HtmlElement webPageElement in allElements)
                {
                    if (webPageElement.GetAttribute("value") == "Login")
                        webPageElement.InvokeMember("click");
                }
                
                txtState.Text = "State " + stage;
                stage++;
            }
            else if (stage == 2)
            {
                webBrowser1.Navigate("indirizzo2");
                
                txtState.Text = "State " + stage;
                stage++;
            }
            else if (stage == 3)
            {
                webBrowser1.Navigate("indirizzo3");
                
                txtState.Text = "State " + stage;
                stage++;
            }
            else if (stage == 4)
            {
                oBot.WriteToTxt(webBrowser1.DocumentText);

                txtState.Text = "State " + stage;
                stage++;
            }
}


indirizzo1 = pagina di login
indirizzo2 = dopo il login, devo navigare a questo indirizzo (finita di caricare la pagina, l'url diventa indirizzo2.5)
indirizzo3 = pagina della quale mi serve il sorgente
WriteToTxt = funzione che mi crea sul desktop un file di testo contenente il sorgente della pagina

Il problema è che nel file che mi crea sul desktop c'è il sorgente della pagina "indirizzo2.5" anziché quello della pagina "indirizzo3". E' come se non aspettasse il caricamento della pagina "indirizzo3" prima di eseguire lo stage == 4

Ho provato anche a mettere il tutto in una funzione separata, chiamata dalla pressione di un bottone nella GUI, fatta così:
web.Navigate("indirizzo1");
            while (web.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();

            web.Document.GetElementById("contact_username").SetAttribute("value", user.Text);
            web.Document.GetElementById("contact_password").SetAttribute("value", pass.Text);

            HtmlElementCollection allElements = web.Document.All;

            foreach (HtmlElement webPageElement in allElements)
            {
                if (webPageElement.GetAttribute("value") == "Login")
                    webPageElement.InvokeMember("click");
            }
            while (web.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();

            web.Navigate("indirizzo2");
            while (web.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();

            web.Navigate("indirizzo3");
            while (web.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
            oBot.WriteToTxt(webBrowser1.DocumentText);


ma il risultato non è cambiato...
Ultima modifica effettuata da Metal 18/08/11 19:51
aaa
19/08/11 7:12
Qwertj
Devi aspettare il caricamento della pagina in un ciclo Do-Loop da cui esci in caso di caricamento che puoi verificare con la proprietà ReadyState di WebBrowser

Do
    Threading.Thread.Sleep(100)   'per non appensatire
    Application.DoEvents()            'il processo
Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete
aaa
19/08/11 17:24
Semplicemente perché prima di cambiare pagina il controllo si muove su about:blank e quindi sfasa completamente l'ordine che volevi.

Potresti risolvere mettendo un if su WebBrowserDocumentCompletedEventArgs.Url (e.Url nel tuo caso).
Questa proprietà restituisce l'URL dove si trova al momento il browser, quindi puoi evitare di appoggiarti su stage.

@Qwertj considerando un caso dove il tuo snippet sia utile, non sarebbe meglio scrivere un Do Until Loop rispetto al Do Loop Until?
Ultima modifica effettuata da 19/08/11 18:02