
Metal (Normal User)
Newbie
    
Messaggi: 16
Iscritto: 04/04/2011
|
prima parte: http://www.pierotofy.it/pages/extras/forum/16/1030114-%5Bc ...
Allora, attualmente sto facendo in questo modo per attendere che la pagina sia stata caricata, prima di proseguire con altre istruzioni:
Codice sorgente - presumibilmente C# / VB.NET |
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):
Codice sorgente - presumibilmente Plain Text |
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 -.-" |
|

HeDo (Founder Member)
Guru^2
    
Messaggi: 2765
Iscritto: 21/09/2007
|
il motivo è perchè il Document (DOM) non è ancora stato parsato e quindi la proprietà Document è ancora nulla.
|
|

()
Newbie
    
Messaggi:
Iscritto:
|
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 il 21/08/2011 alle 10:37 |
|

Metal (Normal User)
Newbie
    
Messaggi: 16
Iscritto: 04/04/2011
|
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:
Codice sorgente - presumibilmente Delphi |
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 |
|

()
Newbie
    
Messaggi:
Iscritto:
|
E' esattamente quello che cercavo di dirti
|
|

Metal (Normal User)
Newbie
    
Messaggi: 16
Iscritto: 04/04/2011
|
Postato originariamente da VMikle:
E' esattamente quello che cercavo di dirti |
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:
Codice sorgente - presumibilmente C# / VB.NET |
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?? |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Innanzituto ti chiedo scusa perché ho confuso IsBusy con ReadyState, quindi il controllo su null è inutile.
Ritornando in topic, è strano che ti evidenzi
Codice sorgente - presumibilmente Plain Text |
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
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
|
|

Metal (Normal User)
Newbie
    
Messaggi: 16
Iscritto: 04/04/2011
|
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 il 22/08/2011 alle 15:55 |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Scusa ho riletto meglio il tuo snippet, ma nel while hai messo &&? Perché dovresti mettere ||
|
|