Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#] aspettare caricamento pagina 2
Forum - C# / VB.NET - [C#] aspettare caricamento pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Metal (Normal User)
Newbie


Messaggi: 16
Iscritto: 04/04/2011

Segnala al moderatore
Postato alle 22:43
Sabato, 20/08/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

  1. web.Navigate("indirizzo");
  2.             do
  3.             {
  4.                 Thread.Sleep(100);
  5.                 Application.DoEvents();
  6.             } 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:
Testo quotato

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

  1. 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 -.-"


yep
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 2:17
Domenica, 21/08/2011
il motivo è perchè il Document (DOM) non è ancora stato parsato e quindi la proprietà Document è ancora nulla.


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 10:31
Domenica, 21/08/2011
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
PM Quote
Avatar
Metal (Normal User)
Newbie


Messaggi: 16
Iscritto: 04/04/2011

Segnala al moderatore
Postato alle 12:23
Domenica, 21/08/2011
Testo quotato

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

  1. web.Navigate("indirizzo");
  2.             do
  3.             {
  4.                 Thread.Sleep(100);
  5.                 Application.DoEvents();
  6.             } while (web.ReadyState != WebBrowserReadyState.Complete && web.Url.ToString() != "indirizzo");
  7.  
  8.             File.WriteAllText(path, web.DocumentText); //scrivo in un file sul desktop il sorgente della pagina
  9.             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 :-|


yep
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:54
Domenica, 21/08/2011
E' esattamente quello che cercavo di dirti 8-|

PM Quote
Avatar
Metal (Normal User)
Newbie


Messaggi: 16
Iscritto: 04/04/2011

Segnala al moderatore
Postato alle 22:20
Domenica, 21/08/2011
Testo quotato

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:
Codice sorgente - presumibilmente C# / VB.NET

  1. web.Navigate("indirizzo");
  2.             do
  3.             {
  4.                 Thread.Sleep(100);
  5.                 Application.DoEvents();
  6.             } 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??


yep
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:13
Lunedì, 22/08/2011
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

  1. 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:

PM Quote
Avatar
Metal (Normal User)
Newbie


Messaggi: 16
Iscritto: 04/04/2011

Segnala al moderatore
Postato alle 15:38
Lunedì, 22/08/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


yep
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:14
Lunedì, 22/08/2011
Scusa ho riletto meglio il tuo snippet, ma nel while hai messo &&? Perché dovresti mettere || :D

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo