none
[vb.net]cliccare immagini src con height e width uguali nel webbrowser RRS feed

  • Domanda

  • Salve, è possibile cliccare su delle immagini che hanno la stessa dimensione sia in altezza che lunghezza attraverso il webbrowswer?

    io mi sono fermato a scrivere questo 

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("image")
            For Each elem As HtmlElement In col
                If elem.GetAttribute("src").Contains(???) Then
                    elem.InvokeMember("click")
    
                End If

    Non so proprio che ricerca fare su google, se no non sarei qua a disturbarvi :)

    grazie!!

    martedì 26 agosto 2014 18:55

Risposte

  • Quindi dovrebbe essere cosi? 

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
    For Each elem As HtmlElement In col 
    If elem.GetAttribute("height") = 60 And elem.GetAttribute("width") = 468 Then 
     elem.InvokeMember("click") 
    End If 
    Next

    Scusate ma sono dal cellulare e non c e lo strumento per mettere il codice.

    Edit: mi sono appena accorto che ho scritto una cavolata con quell input. Ma sinceramente non saprei come muovermi.

    Fai conto che il documento è questo:

      <body>
    
        <form action="target.htm" method="get">
            <input type="text" name="text1" value="test">
            <br>
            <input type="image" src="imgbutton.png">
        </form>
    
      </body>

    Per prendere il tag input (che purtroppo non ha ne ID ne NAME) puoi fare così:

    Dim coll As System.Windows.Forms.HtmlElementCollection coll = WebBrowser1.Document.GetElementsByTagName("form") Dim primoForm As HtmlElement = coll(0) coll = primoForm.GetElementsByTagName("input") For Each input_tag As HtmlElement In coll Dim input_tag_dom As IHTMLInputElement = input_tag.DomElement

    If input_tag_dom.type = "image" Then input_tag.InvokeMember("click")
    Exit For End If Next


    per utilizzare:

    IHTMLInputElement 

    bisogna importare l'assembly mshtml.


    • Modificato BlueLed giovedì 28 agosto 2014 13:03
    • Contrassegnato come risposta Mattia Fanti sabato 30 agosto 2014 15:13
    giovedì 28 agosto 2014 12:51

Tutte le risposte

  • Ciao mattiasrk,

    prova a vedere se la soluzione indicata in questo thread fa il caso tuo

     [RESOLVED] Click image / webbrowser / HtmlElement Class / multiple identical images

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    martedì 26 agosto 2014 19:01
    Moderatore
  • Gli attributi si chiamano height e width.

    If elem.GetAttribute("height") = elem.GetAttribute("width") Then
        elem.InvokeMember("click")
    End If
    martedì 26 agosto 2014 19:02
  • ciao grazie a tutti e due però forse mi sono espresso male... uguali si intende

    immagine 1  h=10  w=15

    immagine 2 h=10 w=15

    e così via...

    martedì 26 agosto 2014 19:32
  • Vuoi controllare se esistono due o più immagini con le stesse dimensioni e, solo in tal caso, cliccarle entrambi?
    mercoledì 27 agosto 2014 06:21
  • ciao grazie a tutti e due però forse mi sono espresso male... uguali si intende

    immagine 1  h=10  w=15

    immagine 2 h=10 w=15

    e così via...

    Ciao mattiasrk,

    ok, e quindi perché non utilizzare la soluzione proposta da Joiner_?

    tu vuoi 'clikkare' su tutte le immagini con uguale dimensione oppure identificarne una precisa ?

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    mercoledì 27 agosto 2014 06:22
    Moderatore
  • Salve mi spiego meglio.

    Nella pagina sono presenti immagini src cliccabili. Queste immagini possono essere di numero variabile, ovvero ce ne possono essere 2 come ce ne possono essere 15. Io devo cliccarle una alla volta. 

    Renato Marzaro [MVP]

    il codice che mi ha proposto Joiner refresha il webbrowser senza  cliccare le immagini.. 

    Forse, ma correggetemi se sbaglio, il codice di Joiner fa in modo di cliccare le immagini con ad esempio h=1 e w=1 . 

    come ho scritto prima l' h=10 e w=15 così x ogni immagine.

    mercoledì 27 agosto 2014 14:16
  • il codice di Joiner fa in modo di cliccare le immagini con ad esempio h=1 e w=1
    Esatto.
    mercoledì 27 agosto 2014 16:38
  • come ho scritto prima l' h=10 e w=15 così x ogni immagine.
    Quindi vuoi cliccare tutte le immagini che hanno determinate dimensioni?

    • Modificato System_ mercoledì 27 agosto 2014 16:40
    mercoledì 27 agosto 2014 16:40
  • Nella pagina sono presenti immagini src cliccabili. Queste immagini possono essere di numero variabile, ovvero ce ne possono essere 2 come ce ne possono essere 15. Io devo cliccarle una alla volta. 

    il codice che mi ha proposto Joiner refresha il webbrowser senza  cliccare le immagini.. 

    Forse, ma correggetemi se sbaglio, il codice di Joiner fa in modo di cliccare le immagini con ad esempio h=1 e w=1 . 

    come ho scritto prima l' h=10 e w=15 così x ogni immagine.

    Ciao mattiasrk,

    come sai i Ns sono suggerimenti poi devi metterci un poco di tuo.

    Nel suo post  Joiner_ indicava la via per fare click su una immagine con Altezza e Larghezza uguali fra loro.

    Non è quello che vuoi fare tu ? Bene, però di fatto ti ha spiegato come trovare altezza e larghezza di una immagine.

    A questo punto ti dovrebbe essere semplice scrivere una riga di codice che dica

    SE Altezza = 10 E Larghezza = 15 ALLORA fai click.

    Ciao



    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    mercoledì 27 agosto 2014 16:42
    Moderatore
  • ciao Renato, ti ringrazio per portarmi a un  giusto ragionamento.

    ho scritto questo

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("image")
            For Each elem As HtmlElement In col
                If elem.GetAttribute("height") = 60 And elem.GetAttribute("width") = 468 Then
                    elem.InvokeMember("click")
                End If
            Next

    Noto che nessuna immagine viene cliccata , anzi, poche volte clicca un immagine di tipo flash player  della stessa dimensione..


    mercoledì 27 agosto 2014 20:03
  • Ciao mattiasrk,

    potrebbe dipendere dal sito che stai provando io ho provato questo  

    'http://www.clipartgratis.it/varie/paura.php

    così

      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            'http://www.clipartgratis.it/varie/paura.php
            Try
                Dim theElementCollection As HtmlElementCollection
                theElementCollection = WebBrowser1.Document.GetElementsByTagName("img")
                For Each curElement As HtmlElement In theElementCollection
                    If (CInt(curElement.GetAttribute("height")) = 130) And (CInt(curElement.GetAttribute("width")) = 90) Then
                        curElement.InvokeMember("click")
                    End If
    
                Next
                MessageBox.Show("Fine Analisi")
            Catch exc As Exception
                MessageBox.Show(exc.Message)
            End Try
    
        End Sub

    e funziona bene

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    mercoledì 27 agosto 2014 20:18
    Moderatore
  • Cao Renato, ho provato il tuo codice adattandolo al mio caso usando questo codice

     Dim theElementCollection As HtmlElementCollection
            theElementCollection = WebBrowser1.Document.GetElementsByTagName("image")
            For Each curElement As HtmlElement In theElementCollection
                If (CInt(curElement.GetAttribute("height")) = 60) And (CInt(curElement.GetAttribute("width")) = 468) Then
                    curElement.InvokeMember("click")
                End If
    
            Next


    chiarendo che il codice di una delle tante immagini è 

    immagine

    mercoledì 27 agosto 2014 23:48
  • Cao Renato, ho provato il tuo codice adattandolo al mio caso usando questo codice

    chiarendo che il codice di una delle tante immagini è 

    Ciao mattiasrk,

    e quindi ?

    Ciao


    Renato Marzaro  MVP Visual Basic

    http://community.visual-basic.it/renato

    giovedì 28 agosto 2014 04:03
    Moderatore
  • ciao Renato, ti ringrazio per portarmi a un  giusto ragionamento.

    ho scritto questo

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("image")
            For Each elem As HtmlElement In col
                If elem.GetAttribute("height") = 60 And elem.GetAttribute("width") = 468 Then
                    elem.InvokeMember("click")
                End If
            Next

    Noto che nessuna immagine viene cliccata , anzi, poche volte clicca un immagine di tipo flash player  della stessa dimensione..

    Public Function GetAttribute ( _
    	attributeName As String _
    ) As String

    Il bug sta nel fatto che si esegue un'equivalenza fra una costante intera e una stringa.

    • Modificato System_ giovedì 28 agosto 2014 06:24
    giovedì 28 agosto 2014 06:09
  • renato scusa non ho finito la frase. Dunque col codice da te proposto il programma non clicc messuna immagine. Joiner, scusami ma non ho afferrato la soluzione ...
    giovedì 28 agosto 2014 09:24
  • Salve, è possibile cliccare su delle immagini che hanno la stessa dimensione sia in altezza che lunghezza attraverso il webbrowswer?

    io mi sono fermato a scrivere questo 

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("image")
            For Each elem As HtmlElement In col
                If elem.GetAttribute("src").Contains(???) Then
                    elem.InvokeMember("click")
    
                End If

    Non so proprio che ricerca fare su google, se no non sarei qua a disturbarvi :)

    grazie!!

    Non c'è il tag "image", al limite c'è il tag "img", ma non è quello che serve a te.

    Dall'immagine che hai postato il tag è questo:         

        <input type="image"

    Quindi dovrai cercare quei tag input che hanno l'attributo type uguale ad "image".

    Inoltre considera che una volta simulato il click sulla prima immagine, la pagina cambia, lo stato del webbrowser cambia (e probabilmente la collection che avevi ottenuto non è più valida), quindi non riuscirai a fare gli altri click con questa strategia.

    giovedì 28 agosto 2014 11:47
  • Quindi dovrebbe essere cosi? 

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
    For Each elem As HtmlElement In col 
    If elem.GetAttribute("height") = 60 And elem.GetAttribute("width") = 468 Then 
     elem.InvokeMember("click") 
    End If 
    Next

    Scusate ma sono dal cellulare e non c e lo strumento per mettere il codice.

    Edit: mi sono appena accorto che ho scritto una cavolata con quell input. Ma sinceramente non saprei come muovermi.

    giovedì 28 agosto 2014 12:15
  • Quindi dovrebbe essere cosi? 

    Dim col As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("input")
    For Each elem As HtmlElement In col 
    If elem.GetAttribute("height") = 60 And elem.GetAttribute("width") = 468 Then 
     elem.InvokeMember("click") 
    End If 
    Next

    Scusate ma sono dal cellulare e non c e lo strumento per mettere il codice.

    Edit: mi sono appena accorto che ho scritto una cavolata con quell input. Ma sinceramente non saprei come muovermi.

    Fai conto che il documento è questo:

      <body>
    
        <form action="target.htm" method="get">
            <input type="text" name="text1" value="test">
            <br>
            <input type="image" src="imgbutton.png">
        </form>
    
      </body>

    Per prendere il tag input (che purtroppo non ha ne ID ne NAME) puoi fare così:

    Dim coll As System.Windows.Forms.HtmlElementCollection coll = WebBrowser1.Document.GetElementsByTagName("form") Dim primoForm As HtmlElement = coll(0) coll = primoForm.GetElementsByTagName("input") For Each input_tag As HtmlElement In coll Dim input_tag_dom As IHTMLInputElement = input_tag.DomElement

    If input_tag_dom.type = "image" Then input_tag.InvokeMember("click")
    Exit For End If Next


    per utilizzare:

    IHTMLInputElement 

    bisogna importare l'assembly mshtml.


    • Modificato BlueLed giovedì 28 agosto 2014 13:03
    • Contrassegnato come risposta Mattia Fanti sabato 30 agosto 2014 15:13
    giovedì 28 agosto 2014 12:51
  • Se non vuoi usare IHTMLInputElement, puoi sempre continuare con GetAttribute:

    input_tag.GetAttribute("type")


    • Modificato BlueLed giovedì 28 agosto 2014 13:06
    giovedì 28 agosto 2014 13:06
  • ok ho importato l'assembly mshtml, funziona alla perfezione. Ora devo solo impedire al webbrowser di aprire pagine di explorer esterne al programma e il gioco è fatto. 

    Ti chiedo un ultima cosa, con il tuo sistema, è possibile anche verificare che sulla pagina esistano le immagini con determinato h e w? grazie

    giovedì 28 agosto 2014 13:09
  • ok ho importato l'assembly mshtml, funziona alla perfezione. Ora devo solo impedire al webbrowser di aprire pagine di explorer esterne al programma e il gioco è fatto. 

    Ti chiedo un ultima cosa, con il tuo sistema, è possibile anche verificare che sulla pagina esistano le immagini con determinato h e w? grazie

    Puoi continuare ad usare i confronti con l'altezza e la larghezza aggiungendoli nell' If che controlla il Type. Ma sicuro che sono necessari? Non ho tutto il codice della pagina su cui stai lavorando, ma mi sembra che i tag input di tipo image sono solo quelli con le dimensioni che cerchi.

    giovedì 28 agosto 2014 13:14
  • era x evitare di usare un try catch quando il webbrowser non trova le immagini perchè sono terminate in quel determinato momento.  Però in realtà hai ragione tu in quanto i parametri altezza e larghezza non gli usi .

    Di solito per verificare se nella pagina esiste o no una cosa io uso la proprietà CONTAINS,  per porzioni di testo, in questo caso non ho mai provato a verirficare l'esistenza di un tag input. Esiste qualche metodo che fa a caso mio? 

    giovedì 28 agosto 2014 13:22
  • era x evitare di usare un try catch quando il webbrowser non trova le immagini perchè sono terminate in quel determinato momento.  Però in realtà hai ragione tu in quanto i parametri altezza e larghezza non gli usi .

    Di solito per verificare se nella pagina esiste o no una cosa io uso la proprietà CONTAINS,  per porzioni di testo, in questo caso non ho mai provato a verirficare l'esistenza di un tag input. Esiste qualche metodo che fa a caso mio? 

    Il browser, a partire dal testo html, crea oggetti collegati in una struttura ad albero, quindi se il tag esiste sta nella collection ottenuta in questo modo:

      coll = primoForm.GetElementsByTagName("input")

    altrimenti, se non esiste, non c'è.

    giovedì 28 agosto 2014 13:30
  • ciao blueled, grazie per la risposta.. Non essendo un programmatore esperto come lo sei tu, ti chiedo se per favore potresti spiegarmelo a parole più semplici.
    venerdì 29 agosto 2014 00:58
  • ciao blueled, grazie per la risposta.. Non essendo un programmatore esperto come lo sei tu, ti chiedo se per favore potresti spiegarmelo a parole più semplici.

    Il documento di testo html (la pagina) viene analizzato e per ogni tag viene creato un elemento html, HtmlElement (oggetto). Ogni elemento può contenere altri elementi se stanno all'interno del suo tag.

    Ad esempio, in questo caso:

     <body>
    
        <form action="target.htm" method="get">
            <input type="text" name="text1" value="test">
            <br>
            <input type="image" src="imgbutton.png">
        </form>
    
      </body>

    l'elemento Body contiene l'elemento Form, l'elemento Form contiene tre elementi: due tag Input ed il tag Br

    Ecco l'albero:

      Body
          Form
              Input (text)
              Br
              Input (image)

    Allora, se utilizzi GetElementsByTagName per sapere se un documento contiene uno o più tag di un determinato tipo,  il valore restituito, l'HtmlElementCollection, conterrà tutti gli elementi cercati. Se questi elementi non fossero presenti, la collection sarebbe vuota.

    Nel mio esempio utilizzo GetElementsByTagName sul form (primoForm) per ottenere i tag Input che contiene. Me ne restituisce due di cui uno è quello cercato, quello che ha l'attributo Type impostato su "image".

    Per esaminare tutti gli elementi contenuti in una collection, si può usare il ciclo For Each. Quando il ciclo termina, hai terminato di analizzare gli elementi che contiene.

    • Modificato BlueLed venerdì 29 agosto 2014 08:19
    venerdì 29 agosto 2014 08:15
  • ho capito , ma quello che non mi entra in mente è : cosa uso per verificare l'esistenza del tag nella pagina???

    Penso che raggirerò questo controllo attraverso il sorgente pagina che può contenere o meno la parte di html delle immagini

    sabato 30 agosto 2014 13:41
  • ho capito , ma quello che non mi entra in mente è : cosa uso per verificare l'esistenza del tag nella pagina???

    Penso che raggirerò questo controllo attraverso il sorgente pagina che può contenere o meno la parte di html delle immagini

    L'esempio è sempre questo:

      <body>
    
        <form action="target.htm" method="get">
            <input type="text" name="text1" value="test">
            <br>
            <input type="image" src="imgbutton.png">
        </form>
    
      </body>

    Se vuoi sapere se "nel documento" esiste il tag "input"

    Chiedi al documento tutti i tag input:

            Dim collection As System.Windows.Forms.HtmlElementCollection
            collection = WebBrowser1.Document.GetElementsByTagName("input")

    Se non ci sono tag input nel documento, la proprietà "Count" della collection ottenuta sarà 0.

    Nel caso dell'esempio, collection.Count vale 2 perchè ci sono due tag input.

    Volendo sapere se, nel documento d'esempio, ci sono tag "Div":

            Dim collection As System.Windows.Forms.HtmlElementCollection
            collection = WebBrowser1.Document.GetElementsByTagName("div")

    Ma poichè non ci sono tag Div, collection.Count vale 0.



    • Modificato BlueLed sabato 30 agosto 2014 21:18
    sabato 30 agosto 2014 21:17
  • In definitiva, se ci sono i tag che cerchi, il ciclo "For Each" viene eseguito tante volte quanti sono i tag che trova, se non ci sono i tag che cerchi il ciclo non viene eseguito.

    sabato 30 agosto 2014 21:22
  • ciao BlueLed ,

    purtroppo ho riscontato solo ora un problema con il codice che mi hai consigliato. Ti posto una gif per farti capire

    http://i.imgur.com/AvRfgjA.gif

    il codice, per evitare errori miei, è questo

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim coll As System.Windows.Forms.HtmlElementCollection
            coll = WebBrowser1.Document.GetElementsByTagName("form")
            Dim primoForm As HtmlElement = coll(0)
    
            coll = primoForm.GetElementsByTagName("input")
            For Each input_tag As HtmlElement In coll
    
                Dim input_tag_dom As IHTMLInputElement = input_tag.DomElement
    
                If input_tag_dom.type = "image" Then
                    input_tag.InvokeMember("click")
                    Exit For
                End If
    
            Next
    
        End Sub
    Il Problema sta nel fatto che con questo codice viene cliccata prima un immagine e dopo un altra ancora, per un  totale di due, mentre io invece vorrei che si cliccasse solo una immagini

    martedì 2 settembre 2014 20:17
  • ciao BlueLed ,

    purtroppo ho riscontato solo ora un problema con il codice che mi hai consigliato. Ti posto una gif per farti capire

    http://i.imgur.com/AvRfgjA.gif

    il codice, per evitare errori miei, è questo

      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim coll As System.Windows.Forms.HtmlElementCollection
            coll = WebBrowser1.Document.GetElementsByTagName("form")
            Dim primoForm As HtmlElement = coll(0)
    
            coll = primoForm.GetElementsByTagName("input")
            For Each input_tag As HtmlElement In coll
    
                Dim input_tag_dom As IHTMLInputElement = input_tag.DomElement
    
                If input_tag_dom.type = "image" Then
                    input_tag.InvokeMember("click")
                    Exit For
                End If
    
            Next
    
        End Sub
    Il Problema sta nel fatto che con questo codice viene cliccata prima un immagine e dopo un altra ancora, per un  totale di due, mentre io invece vorrei che si cliccasse solo una immagini

    In realtà, l'esempio mostra come recuperare la prima immagine e cliccarla.

    Non mi è chiaro cosa intendi per "cliccare solo un'immagine". Dato che ce ne dovrebbero essere molte, se devi cliccarne una sola... quale? Anche dal video non si capisce cosa stia succedendo. Comunque, l'esempio è solo un esempio, dovrai adattarlo.

    martedì 2 settembre 2014 20:56
  • cliccare un immagine>refresh pagina>cliccare immagine ... ora,è normale che se metto il codice che mi hai suggerito dentro ad un button, lo eseguirà una sola volta fino a che non verrà ri premuto. invece nel mio caso lo premo una sola volta e apre un immagine; dopo qualche secondo clicca anche un altra immagine e la apre in una nuova tab.. spero di essermi spiegato per bene. 
    martedì 2 settembre 2014 23:03
  • Al click del pulsante dovrai crearti una lista di quei tag input da cliccare e poi far partire un timer che eseguirà il click.
    mercoledì 3 settembre 2014 09:01