IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB] Webbrowser et "Specified cast is not valid."


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Points : 95
    Points
    95
    Par défaut [VB] Webbrowser et "Specified cast is not valid."
    Bonjour,

    J'ai un petit probleme avec une application winform que j essais de mettre au point.

    le but est de mettre en place un webbrowser, dans l appli, et de récuperer certaines informations contenu dans l html.
    ( je precise que je ne souhaite pas injecter du js dans les pages, via invoke )

    Donc l application, charge l url au demarage, une fois que celle ci est complete je met en place un timer afin de recuperer les infos ( timer car des requetes ajax décalle le chargement de certaines parties de l html ...)


    en gros cela donne ca ( simplifié ... ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Public Class navigateur
        Public journal As log = Nothing
        Private time As System.Timers.Timer
     
     
     Private Sub navigateur_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.journal = New log(Me.RichTextBox1)
            journal.assert_debug("navigateur_Load") 
        End Sub
     
     
         Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            WebBrowser1.ScriptErrorsSuppressed = False
            journal.assert_debug("DocumentCompleted")
                add_event_timer()
     
        End Sub
     
      Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
     
            supp_event_timer()
             journal.assert_debug("navigating")
        End Sub
     
      Protected Sub add_event_timer()
            time = New System.Timers.Timer()
            time.Interval = 500
            time.Start()
                  AddHandler time.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf analyse_page)
     
        End Sub
     
     
      Public Sub analyse_page()
     
     
                If (WebBrowser1.Document IsNot Nothing) Then
                    Dim TableElem As HtmlElement = WebBrowser1.Document.GetElementById("contentWrapper")
                    RichTextBox1.Text = RichTextBox1.Text & TableElem.InnerHtml.ToString & vbCrLf
     
                End If
     
        End Sub

    cela me retourne un

    System.InvalidCastException was unhandled by user code
    HResult=-2147467262
    Message=Specified cast is not valid.
    Source=System.Windows.Forms
    StackTrace:
    at System.Windows.Forms.UnsafeNativeMethods.IHTMLDocument2.GetLocation()
    at System.Windows.Forms.WebBrowser.get_Document()
    at iextense.navigateur.analyse_page()
    at iextense.navigateur._Lambda$__1(Object a0, ElapsedEventArgs a1)
    at System.Timers.Timer.MyTimerCallback(Object state)
    InnerException:

    je precise que via un button ca fonctionne :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Private Sub TestToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TestToolStripMenuItem.Click
             If (WebBrowser1.Document IsNot Nothing) Then
            Dim TableElem As HtmlElement = Me.WebBrowser1.Document.GetElementById("contentWrapper")
            RichTextBox1.Text = RichTextBox1.Text & TableElem.InnerText & vbCrLf
           end if
      End Sub

    voila, vous savez tout

    visual basic 12
    seven
    .net 4


    je pense que le webbrowser doit etre innacessible, ...
    j ai testé plein de solution sans trouvé la bonne

    avez vous des pistes de recherche ...
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Il est probable que la fonction GetElementById("contentWrapper") renvoie nothing. Pourquoi utilises-tu un Timer au lieu de l'event DocumentCompleted du WebBrowser ?
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Points : 95
    Points
    95
    Par défaut
    bonjour,

    je ne pense pas qu'on retourne nothing puisque j utilise une condition

    If (WebBrowser1.Document IsNot Nothing) Then
    // blabla
    End If


    je ne peux pas utilise l événement DocumentCompleted car l html ne sera pas complètement formé : des requêtes asynchrones viennent modifier le dom
    ( ca arrive juste apres le DocumentCompleted ou meme en fn des actions utilisateurs ( click , ... ))
    le timer vient dans ce contexte ... , je voulais l utiliser a intervalle régulier afin que rien ne m echappe au niveau du contenu html ( meme si modifié par ajax )

    j ai cherché mais pas d événement indiquant qu une requête ajax était en cours ou même que le contenu de la requête ajax était ajouté ...
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Points : 95
    Points
    95
    Par défaut
    Je me permets de double poster afin d apporter un début de réponse

    j ai eu une petite étincelle en regardant l 'erreur au niveau debugger ...

    il semble que celle ci survienne à cause du timer ...


    afin de tester cela j ai ajouté :



    Private Sub navigateur_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove

    If ready = True Then
    If (WebBrowser1.Document IsNot Nothing) Then
    Dim TableElem As HtmlElement = WebBrowser1.Document.GetElementById("contentWrapper")
    Dim retour As String = "pas de contenu "

    If TableElem <> Nothing Then
    retour = "contenu oki"
    End If
    RichTextBox1.Text = RichTextBox1.Text & retour & vbCrLf

    End If



    End If

    End Sub

    et donc l évènement se déclenche au mvt de la souris ...
    et la miracle, cela fonctionne ...
    du coup je v lié l évènement d analyse de page aux mvts souris / voir click en limitant le nb de traitement afin de pouvoir poursuivre ....

    par contre si quelqu'un à une astuce pour le timer ...
    je suis prenneur ....
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    If 
    (WebBrowser1.Document IsNot Nothing) 
    And 
    (WebBrowser1.Document.GetElementById("contentWrapper") IsNot Nothing)
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Points : 95
    Points
    95
    Par défaut
    le resultat est le meme ...

    c'est la loose ....
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Voici 2 petites modifications à essayer, mais j'y crois pas vraiment.

    1. Utiliser un System.Winforms.Timer au lieu d'un System.Timer,
    2. Dans l'event Tick du Timer, faire au début MyTimer.Enabled=false et à la fin MyTimer.Enabled=true.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 89
    Points : 95
    Points
    95
    Par défaut
    bon, j ai testé et effectivement ca ne fonctionne pas ...

    pour contourner mon pb

    sur le formulaire principale, j ai ajouter des evenements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
      Private Sub navigateur_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
            simuli_event()
        End Sub
     
        Private Sub navigateur_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
            simuli_event()
        End Sub
     
        Private Sub navigateur_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
            simuli_event()
        End Sub
     
     
     
     
    Private Sub simuli_event()
            If ready = True And IsNothing(ie) = False Then
                ie.my_event()
            End If
        End Sub

    l évènement déclenché renvoi à cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       Dim now As Integer = Environment.TickCount
                    Dim diff As Integer
     
                    diff = now - _time
     
                    If diff > 100 Then
                        _time = now
                        analyse_page()
                        journal.assert_debug("new ticks : " & diff.ToString)
                    Else
                        journal.assert_debug("old ticks ticks : " & diff.ToString)
                    End If
                End If


    ce qui donne dans mon debug perso :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    [debug]add_event_timer
    detection page 
    [debug]AccessibleEvents wb impossible
    [debug]AccessibleEvents wb impossible
    [debug]analyse_page oki
    [debug]new ticks : 448650092
    [debug]analyse_page oki
    [debug]new ticks : 11825
    [debug]analyse_page oki
    [debug]new ticks : 2995
    [debug]analyse_page oki
    [debug]new ticks : 531
    [debug]old ticks ticks : 15
    [debug]old ticks ticks : 15

    pour eviter bug de cast sur le webbrowser, j ai mis un try catch qui se met en route, au debut puis plus meme si je laisse tourner
    ce qui continue a me faire penser que c bien un pb de com avec le webbrowser .. ( non pret ou autre ... mais comme je ne peux accéder a ses propriétés, je ne peux pas savoir ... )
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)

Discussions similaires

  1. Specified cast is not valid
    Par Titi41 dans le forum ASP.NET
    Réponses: 11
    Dernier message: 29/05/2008, 17h38
  2. [VB.NET][ASP.Net]Specified cast is not valid
    Par Irish dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/12/2006, 12h35
  3. Réponses: 3
    Dernier message: 25/09/2006, 15h48
  4. Erreur "specified cast is not valid"
    Par [DreaMs] dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 30/01/2006, 21h15
  5. Problème "The specified service does not exist as an ..
    Par Rimak2 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/05/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo