none
[Vb.net]Eseguire molteplici passaggi dentro timer RRS feed

  • Domanda

  • Salve, ho la necessità di eseguire molteplici passaggi dentro un timer..

    i passaggi sono questi:

     WebBrowser1.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text)
                WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text)
                If Val(KryptonLabel1.Text) < 80000 Then
                    WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=port&id=27284&position=2")
    
    
                    WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=transport&destinationCityId=" + KryptonTextBox5.Text)
    
                    WebBrowser2.Document.GetElementById("textfield_wine").SetAttribute("value", (KryptonTextBox13.Text))
                    For Each ul As HtmlElement In WebBrowser2.Document.All
                        If ul.GetAttribute("id") = "submit" Then
                            ul.InvokeMember("click")
                        End If
                    Next
                End If

    Però il timer runna  soltanto la prima riga..

    esiste un modo per fargli fare una cosa per volta?

    inoltre avendo il problema dell'intervallo.. pensavo di mettere tutto dentro bottone,ma comunque sempre con il problema dei passaggi..

    grazie, mattia :))

    lunedì 20 febbraio 2012 14:22

Risposte

Tutte le risposte

  • Il metodo WebBrowser.Navigate è asincrono, quindi non rimane in attesa che la pagina venga caricata.

    Se hai bisogno di fare elaborazioni o di interagire con la pagina, devi gestire l'evento DocumentCompleted del WebBrowser, che viene generato quando la pagina è disponibile.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 14:42
  • quindi, da quel che ho capito, mi consigli di inserire tutto dentro webbrowser?
    • Contrassegnato come risposta Mattia Fanti martedì 21 febbraio 2012 20:19
    lunedì 20 febbraio 2012 14:53
  • Quello che puoi fare è richiamare il metodo Navigate alla pressione di un pulsante, e poi gestire l'evento DocumentComepleted per fare le tue elaborazioni sulla pagina.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 14:59
  • ma io volevo fare una sorta di bot che facesse tutto in automatico..capito?

    lunedì 20 febbraio 2012 15:11
  • Allora nell'evento Tick del timer devi fare la Navigate, e poi andare a gestire l'evento DocumentCompleted.

    Nota che, poiché il timer potrebbe scattare di nuovo prima che la richiesta precedente sia finita, ti conviene disattivarlo nell'evento Tick e riattivarlo alla fine dell'elaborazione che farai in DocumentCompleted.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 15:25
  • uhm allora..quindi dovrebbe essere così:

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick Try WebBrowser1.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text) WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text) If Val(KryptonLabel1.Text) < 80000 Then WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=port&id=27284&position=2") WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=transport&destinationCityId=" + KryptonTextBox5.Text) WebBrowser2.Document.GetElementById("textfield_wine").SetAttribute("value", (KryptonTextBox13.Text)) End If Catch ex As Exception

    timer1.enabled=false End Try End Sub

    e nell'evento documentcompleted

    For Each ul As HtmlElement In WebBrowser2.Document.All If ul.GetAttribute("id") = "submit" Then ul.InvokeMember("click") End If Next

    timer1.enabled=true

    ...

    lunedì 20 febbraio 2012 16:07
  • No, non va bene. Se usi lo stesso WebBrowser, devi fare un'invocazione di Navigate, quindi gestire il relativo evento DocumentCompleted; quando finisci l'elaborazione della prima pagina, devi fare la seconda richiesta, quindi gestire l'evento, e così via. In particolare, mi riferisco a WebBrowser2, su cui invochi diverse Navigate una di seguito all'altra: se non fai così, la seconda Navigate "annulla" la prima (è come se cambiassi l'indirizzo del browser mentre stai aspettando che una pagina venga caricata).

    Inoltre, vedo che nell'evento Tick disattivi il timer solo se si verifica una eccezione, mentre dovresti farlo come prima operazione (prima di eseguire la Navigate). Poi, sempre in questo evento hai lasciato l'istruzione

    WebBrowser2.Document.GetElementById("textfield_wine").SetAttribute("value", (KryptonTextBox13.Text))

    Che invece, come detto, devi spostare nell'evento DocumentCompleted.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 16:12
  • No, non va bene. Se usi lo stesso WebBrowser, devi fare un'invocazione di Navigate, quindi gestire il relativo evento DocumentCompleted; quando finisci l'elaborazione della prima pagina, devi fare la seconda richiesta, quindi gestire l'evento, e così via. In particolare, mi riferisco a WebBrowser2, su cui invochi diverse Navigate una di seguito all'altra: se non fai così, la seconda Navigate "annulla" la prima (è come se cambiassi l'indirizzo del browser mentre stai aspettando che una pagina venga caricata).

    Scusami non ho capito questa parte.. potresti farmi l'esempio con il codice per favore?
    lunedì 20 febbraio 2012 16:23
  • Dovresti prima descrivere lo scopo del tuo algoritmo, altrimenti non posso sapere come organizzarlo.

    Inoltre, perché fai la Navigate della stessa pagina in due WebBrowser differenti?

    WebBrowser1.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text)
    WebBrowser2.Navigate("http://s10.it.ikariam.com/index.php?view=city&id=" + KryptonTextBox5.Text)
    


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 16:29
  • ok allora..  un webbrowser fa il giro di 8  polis nel gioco  e scrive in una label il valore del vino(1)

    il webbrowser(2) invece..se il valore della label è inferiore a 1000(anche se nel codice su c'è 80,000usato come esempio) allora  naviga nella polis che produce vino quindi(http://s10.it.ikariam.com/index.php?view=port&id=27284&position=2) e lo invia alla polis bisognosa attraverso questi passaggi:

    http://s10.it.ikariam.com/index.php?view=transport&destinationCityId=" + KryptonTextBox5.Text ' va nel porto

    WebBrowser2.Document.GetElementById("textfield_wine").SetAttribute("value", (KryptonTextBox13.Text)) imbarca il vino per x(kryptontextbox13.text)
                    For Each ul As HtmlElement In WebBrowser2.Document.All clicca il pulsante invia merci
                        If ul.GetAttribute("id") = "submit" Then
                            ul.InvokeMember("click")
                        End If
                    Next
                End If

    per spiegare meglio, inserisco delle screen

    puoi notare l'url.. paris è la polis che produce del vino.Mentre London è la polis  che (ipoteticamente) ha bisogno del vino.

    qua invece puoi notare il porto. Quindi immetto la quantità da trasferire e clicco il pulsante trasporta merci.

    SScusa per la confusione, ma è un pò lunga la cosa..

    lunedì 20 febbraio 2012 16:45
  • Se non spieghi bene, come ha già detto Marco, la logica del tuo algoritmo risulta difficile pensare a qualche soluzione. Non è necessario a mio avviso spiegare come funziona il gioco.

    Ruggiero

    lunedì 20 febbraio 2012 17:58
  • ciao, non c'è molto da spiegare, bisogna solo capire quello che ho sopra spiegato.. 

    il webbrowser deve fare un "giro" delle polis.. quella che ha meno vino attiva il porto della polis producente

    martedì 21 febbraio 2012 00:31
  • Scusami se mi permetto, ma per sicuramente non c'è molto da spiegare, perché conosci quel gioco online molto bene, ma per noi "profani", quello che dici può risultare un po' oscuro. Ad esempio, tu dici che si deve fare il "giro" delle polis, ma non sappiamo che cosa significhi questo precisamente.

    Detto questo, l'algoritmo di cui hai bisogno, come hai precisato tu stesso, è un po' lungo, quindi ti consiglio di procedere per gradi, ovvero iniziare ad implementare tutta la logica per step.

    Ad esempio, puoi partire da questi step:

    Quando scatta il timer,  disattivi il timer, fai la Navigate del tuo primo WebBrowser. Nel relativo DocumentCompleted, contolli se il valore della label è inferiore al numero che i serve, e in tal caso fai una Navigate del secondo WebBrowser. A questo punto, riattivi il timer. Se, invece, il valore della label è maggiore al numero, riattivi immediatamente il timer.

    Intanto prova ad implementare questo meccanismo e verifica che esso funzioni a dovere. Diciamo che questo ti serve per costruire lo scheletro della tua applicazione.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    martedì 21 febbraio 2012 08:43