Oppure

Loading
20/08/11 20:43
Metal
prima parte: pierotofy.it/pages/extras/forum/16/1030114-%5Bc%5D_aspettare_caricamento_pagina/

Allora, attualmente sto facendo in questo modo per attendere che la pagina sia stata caricata, prima di proseguire con altre istruzioni:
web.Navigate("indirizzo");
            do
            {
                Thread.Sleep(100);
                Application.DoEvents();
            } while (web.ReadyState != WebBrowserReadyState.Complete && web.Url.ToString() != "indirizzo");


web.ReadyState != WebBrowserReadyState.Complete mi garantisce che la pagina è stata caricata
web.Url.ToString() != "indirizzo" mi garantisce che la pagina caricata è quella che ho richiesto (e non about:blank)


A questo punto, non capisco perché una volta su due mi becco questo errore:
Eccezione non gestita di tipo 'System.NullReferenceException' in bot.exe

Informazioni aggiuntive: Riferimento a un oggetto non impostato su un'istanza di oggetto.


in merito a questa riga di codice (messa subito dopo il ciclo do...while):
web.Document.GetElementById("contact_username").SetAttribute("value", user.Text);


tra l'altro ho notato che l'errore compare quando il browser mostra ancora una pagina bianca, quindi non ha caricato/completato un bel nulla -.-"
aaa
21/08/11 0:17
HeDo
il motivo è perchè il Document (DOM) non è ancora stato parsato e quindi la proprietà Document è ancora nulla.
aaa
21/08/11 8:31
Citando quel che ti ho scritto nel commento al post dell'altro topic:
Le proprietà hanno lo stesso uso, però quella del webbrowser è modificabile e ti dice l'url attuale, senza garantirti che il download della pagina sia stato completato o meno (potresti avere un url e un source non corrispondenti)

Questo è esattamente quello che succede qua, prova mettendo un controllo sul null del Document (web.Document == null) nel while.
Ultima modifica effettuata da 21/08/11 8:37
21/08/11 10:23
Metal
Postato originariamente da VMikle:

Citando quel che ti ho scritto nel commento al post dell'altro topic:
Le proprietà hanno lo stesso uso, però quella del webbrowser è modificabile e ti dice l'url attuale, senza garantirti che il download della pagina sia stato completato o meno (potresti avere un url e un source non corrispondenti)

Questo è esattamente quello che succede qua, prova mettendo un controllo sul null del Document (web.Document == null) nel while.


appunto per questo nelle condizioni del while ho messo anche web.ReadyState != WebBrowserReadyState.Complete
dovrebbe rimanere nel ciclo di attesa finché la pagina non è completamente caricata e il suo url è quello che ho richiesto

per cercare di capire, ho aggiunto una riga al codice:
web.Navigate("indirizzo");
            do
            {
                Thread.Sleep(100);
                Application.DoEvents();
            } while (web.ReadyState != WebBrowserReadyState.Complete && web.Url.ToString() != "indirizzo");

            File.WriteAllText(path, web.DocumentText); //scrivo in un file sul desktop il sorgente della pagina
            web.Document.GetElementById("contact_username").SetAttribute("value", user.Text);


e leggendo il file creato ho scoperto che il sorgente della pagina è incompleta, quindi non l'ha scaricata tutta da internet :-|
aaa
21/08/11 16:54
E' esattamente quello che cercavo di dirti 8-|
21/08/11 20:20
Metal
Postato originariamente da VMikle:

E' esattamente quello che cercavo di dirti 8-|


se web.ReadyState è Complete, non implica che la pagina sia stata caricata (e dunque implica che web.Document sia qualcosa diverso da null)?

comunque, questo è il codice di adesso:
web.Navigate("indirizzo");
            do
            {
                Thread.Sleep(100);
                Application.DoEvents();
            } while (web.ReadyState != WebBrowserReadyState.Complete && web.Url.ToString() != "indirizzo" && web.Document == null);


e continua a dare il problema. Cos'altro devo guardare per essere sicuro che la pagina sia completamente caricata e visualizzata??
aaa
22/08/11 12:13
Innanzituto ti chiedo scusa perché ho confuso IsBusy con ReadyState, quindi il controllo su null è inutile.

Ritornando in topic, è strano che ti evidenzi
web.Document.GetElementById("contact_username").SetAttribute("value", user.Text);

Perché andando personalmente in Debug mi sono accorto che il valore null lo possiede Url, quindi quando provi a richiamare ToString() è logico che ti sollevi un'eccezione :yup:
C'è però da dire che questo accade solo nel caso in cui il webbrowser si trovi ancora nello stato iniziale.

Inoltre, ma ti invito a prendere quest'informazione con le pinze, sembra che WebBrowserReadyState.Complete non consideri about:blank come nuovo documento (l'evento DocumentCompleted invece sì;) e che quindi il controllo sia totalmente inutile.

Nel caso in cui il tuo codice restituisca effettivamente quell'eccezione nella riga sopra citata, significa che non esiste nessun elemento con id "contact_username" e che quindi GetElementById restituisca null :pat:
22/08/11 13:38
Metal
ma hai messo un indirizzo? Perché nel codice che ho postato ho messo "indirizzo" come url fittizio
e sì, "contact_username" esiste nella pagina <.<"

se con "debug" intendi la finestrella "Auto" (non ho mai usato visual studio prima d'ora), ho notato che quando lancia l'eccezione nella mia ci sono questi valori:
web.Url {about:blank}
web.ReadyState Loading
web.Document {System.Windows.Form.HtmlDocument}

espandendo la voce "web.Document", alla voce "url" mi da nuovamente {about:blank}

espandendo la voce "web", alla voce "IsBusy" mi da "true" (ho aggiunto web.IsBusy == true alle condizioni del while)

Aggiungendo una riga di codice per scrivere il sorgente della pagina subito dopo il ciclo do...while e prima della riga che lancia l'eccezione, mi da ancora un sorgente che contiene solo "<HTML></HTML>"


Ne deduco, per quanto assurdo, che se ne infischia dei controlli che ho messo nel ciclo do...while. Alternative a questa spiegazione?
Ultima modifica effettuata da Metal 22/08/11 13:55
aaa