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

Contribuez Discussion :

[Pilotage Internet Explorer] Comment attendre la mise à jour d'un élément d'une page web …


Sujet :

Contribuez

  1. #41
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Merci itwoo ! Mais en fait la méthode tient dès la contribution d'origine car si tu relis juste le point avant le code,
    tout est là en clair noir sur blanc : c'est juste une question de correctement pointer sur une collection d'un élément,
    simple respect de la programmation objet ! Et c'est donc universel !
    Toujours dans le même point juste après le code, j'explique pourtant le pourquoi du comment …

    En respectant cela, la contribution d'origine ne peut être prise en défaut,
    car c'est l'essence même du fonctionnement des pointeurs d'objets !

    Et comment veux-tu qu'IE mette moins de 4 millièmes de seconde pour mettre à jour la table ?!

    S'il y a un problème, c'est soit une erreur de programmation, donc logique objet non respectée,
    soit c'est un cas non prévu, hors cadre de fonctionnement normal d'une page web valide,
    et là c'est un manque de contrôle en amont comme pas d'objet attendu, table vide, etc …
    Image de la division par zéro, il ne faut pas oublier de contrôler d'abord si le diviseur est différent de zéro !
    Certes il y a une erreur mais pourtant le principe de la division ne peut être remis en question et,
    ici, c'est exactement le même cas de figure : si respect de la logique objet, cela fonctionne forcément …

    Tout ce que je fais depuis le post #3 est de me répéter !
    J'ai peur que cela en décourage quelques uns pensant que cette manière ne tient pas la route
    alors qu'elle est forcément viable car reposant sur le fondement de la programmation objet …

    La version à venir apporte un niveau de sécurité supplémentaire en verrouillant une collection de la table
    avant la mise à jour, même si c'est inutile à mon avis …
    En fait la vrai amélioration niveau sécurité est apportée par des contrôles en amont.
    Et sans utiliser de variable objet inutile …

    Quand tu seras prêt, je posterais cette nouvelle version agrémentée de quelques précisions
    et accompagnée d'une variante démontrant bien l'universalité de cette méthode !

    A suivre …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  2. #42
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    itwoo, Patrick, depuis hier soir je reproduis enfin un cas de boucle infinie ‼

    Il m'a fallu trente secondes pour comprendre et j'avais déjà sous le coude une solution !

    Mais avant de livrer une explication, revenons sur la contribution dans le point du code :

    Citation Envoyé par Marc-L Voir le message
    • L'astuce est simple : elle consiste à attendre la valeur zéro de la propriété length d'une collection de l'élément.
    Bien que pour vous je ne l'ai peut-être pas encore démontré (prochaine tentative à suivre dans une ultime démonstration …),
    cette méthode reposant sur le principe de la programmation objet n'est donc pas en cause ! (analogie de la division …)

    Reste donc la phrase la suivant dans ce point :

    Citation Envoyé par Marc-L Voir le message
    Mais encore faut-il pointer correctement la collection avant de boucler sur la propriété …
    C'est à dire soit une erreur de programmation soit un cas non prévu donc un manque de contrôle en amont de la boucle …

    Hier soir je préparais une p'tite démonstration pour différencier le pointage d'objet
    via la page NASDAQ de la cotation abbv en demandant l'historique le plus court, les cinq derniers jours …

    Tout fonctionne, appelé à d'autres activités je laisse l'ordinateur en veille.
    Après une interruption de plus d'une heure, je relance et là surprise, j'entends bien le bip
    marquant le début de la mise à jour et me voilà en présence d'une belle boucle infinie !

    N'ayant rien modifié concernant la méthode, j'ai immédiatement douté de la page source !
    J'avais laissé la page ouverte dans le navigateur avant la pause, j'en ouvre une nouvelle dans un autre onglet
    puis je compare les codes en dénombrant la balise <table :
    - avant l'interruption, 4 tables et l'historique dans la troisième;
    - après la pause, 5 tables et les données dans la quatrième !

    Voilà pourquoi sur d'autres sites je n'ai pas rencontré de souci car leurs pages sont stables …
    itwoo l'a un peu signalé dans le post #36 mais n'ayant jamais eu le cas, enfin jusqu'à hier soir …

    Du coup je teste la version à venir : pas de boucle infinie grâce à un contrôle en amont
    mais bip signalant bien un problème dû à la table non trouvée, la table n°3 devenue la n°4 …
    Sans ce contrôle, la boucle infinie intervient car elle n'attend pas la mise à jour du bon objet !

    La variante évoquée dans un précédent message fonctionne elle sans encombre !

    Donc la méthode fonctionne sans souci en pointant de la bonne manière le bon objet ! (CQFD)

    Avant de livrer cette alternative - j'abandonne la v2, la variante étant déjà ma préférée - voici le p'tit test objet
    fonctionnant bien avec une table n°3 ou n°4 et disposant du contrôle de feu la v2, pas de boucle infinie …

    Ce test demande la mise à jour de la cotation abbv des cinq derniers jours, pas de copie dans la feuille de calculs
    car le but est d'afficher des valeurs dans la fenêtre Exécution du VBE (CTRL G) via pointage d'objet.

    La première ligne affichée correspond au temps nécessaire entre la demande de mise à jour et la boucle d'attente
    accompagné du nombre de tables de la page.

    Ensuite un p'tit tableau affichant deux colonnes, à gauche celle correspondant au bon pointage
    et à droite l'exemple d'un pointage malheureux dans le cas de l'attente d'une mise à jour d'un objet.
    La première ligne de données correspondant au nombre d'éléments avant la mise à jour,
    la seconde à ceux après cette mise à jour.

    Précisions du code à suivre :

    en ligne n°10, un contrôle en amont pour vérifier si c'est la bonne page mais remplacé dans la future version.
    Un bip en ligne suivante informant du début de la mise à jour.

    Ligne n°15 : respect de la méthode en pointant sur la collection de l'avant dernière table.
    En ligne suivante, contrôle vérifiant si c'est la bonne table.

    Ligne n°20 : affichage des données avant la mise à jour. Certes, la mise à jour a déjà été ordonnée en ligne n°12
    mais les données affichées pendant l'affichage du sablier sont bien celles d'avant la mise à jour …

    Ligne n°21 : la boucle d'attente de la mise à jour, on ne change pas une équipe qui gagne !

    Ligne n°22 : affichage des données après la mise à jour.

    Dans ces lignes n°20 & 22, .Length est rattachée à la ligne n°15 : With oTables.Item(oTables.Length - 2).all.

    Mais alors, me direz-vous, pourquoi afficher dans la deuxième colonne oTables.Item(oTables.Length - 2).all.Length,
    n'est-ce pas la même chose ?! Réponse : Oui … mais non !

    Pour vérifier, exécuter le code suivant :
    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
    Sub TestObjetNASDAQ()
        Const URL$ = "http://www.nasdaq.com/symbol/abbv/historical"
        Dim oTables As Object
     
        With CreateObject("InternetExplorer.Application")
            .Navigate URL
            While .Busy Or .ReadyState < 4:  DoEvents:  Wend
     
            With .Document
                If InStr(.body.innerHTML, URL) Then
                    Beep
                    With .all("ddlTimeFrame"):  .Value = .all(0).Value:  .onchange:  End With
                    Z! = Timer:            Set oTables = .GetElementsByTagName("TABLE")
     
                    With oTables.Item(oTables.Length - 2).all
                           D = .Item(2).innerText = "Date"
                        If D Then
                            Debug.Print Format$(Timer - Z, "0.000s"), oTables.Length; _
                                        vbLf; vbLf; " OK", " NO"; vbLf; _
                                        .Length, oTables.Item(oTables.Length - 2).all.Length
                            While .Length:  DoEvents:  Wend
                            Debug.Print .Length, oTables.Item(oTables.Length - 2).all.Length
                        End If
                    End With
     
    '                If D Then T$ = oTables.Item(oTables.Length - 2).outerHTML
                    Set oTables = Nothing
                End If
            End With
     
            .Quit
        End With
        End
    End Sub
    Oui …
    Après l'exécution, la première ligne du tableau affiche 471 dans chaque colonne, le nombre d'éléments avant la mise à jour …

    … mais non !
    La première colonne affiche zéro (normal c'est le résultat attendu sinon il y aurait eu une boucle sans fin !)
    tandis que la deuxième colonne affiche 51 éléments après la mise à jour …

    Explication : la ligne n°15 est un pointeur "gelé ou figé" à un instant T (avant la mise à jour donc)
    sur une collection de la table. Une fois la table mise à jour, ce pointeur est caduque, réinitialisé à zéro, CQFD

    Tandis que oTables.Item(oTables.Length - 2).all.Length lit le nombre d'élément à l'instant présent.

    J'attends ton retour itwoo espérant cette notion de pointage d'objet est claire maintenant pour toi
    avant de livrer une alternative, non pas sur la méthode mais sur le pointage de l'objet pour la mise à jour.

    _________________________________________________________________________________________________
    We are all very ignorant, what happens is that not all ignore the same things … (Albert Einstein)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #43
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re marc
    salut Marc
    ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With oTables.Item(oTables.Length - 2).all
                           D = .Item(2).innerText = "Date"
                        If D Then
                            Debug.Print Format$(Timer - Z, "0.000s"), oTables.Length; _
                                        vbLf; vbLf; " OK", " NO"; vbLf; _
    reviens a tester la présence de la datet dans la première cellule de gauche de la table
    chose que j'avais déjà faite dans mes propositions bien avant de passer a l'object microsoftxmlhttp

    mais attention il est pas forcé que la date soit celle du jour on l'a déjà vu avec Nasdaq c'est pour ca que j'avais éliminé cette façon pour verif
    enfin je te laisse finir pour voir
    cela dit l'attente du length est largement suffisante a moins d'avoir une bande passante quazi null et encore
    puisque que librairie IE LE BUSy FAIT L'AFFAIRE APRES LE TEST

    de toute facon la table est un htmlelement donc a un innerhtml
    contenu= ton element .innerhtml(ce qui te donne le innerhtml de 3 mois a la base (d'office)
    do:loop until contenu<>ton element.innerhtml
    et sa fonctionne tres bien sans bug tester depuis 4 mois de temps en temps et je n'ai jamais eu de bug
    donc
    test de l'adresse présente dans le document :ca ok
    récupération de l'élément : ok(même vide ou pas fini)
    ta boucle sur le length:ok
    ma boucle sur le innerhtml( pour finir et être sur
    après on fait ce que l'on veut des données
    mais c'est un test que l'on avait déjà fait a peu près de la même manière tout au début du fil de Nasdaq avec IE
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #44
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Vérifier si la première cellule est "Date" pour s'assurer d'être dans la bonne table
    afin d'éviter une boucle infinie si une mauvaise table est pointée.

    Pour le test de l'adresse de l'URL, ce n'est pas forcément bon avec ce site NASDAQ !
    J'ai déjà eu le cas et j'ai donc abandonné ce test tout comme celui de la date dans la version alternative …
    Attends de la voir après le retour d'itwoo.


    Citation Envoyé par patricktoulon Voir le message
    puisque que librairie IE LE BUSy FAIT L'AFFAIRE APRES LE TEST
    Lors de la demande de la mise à jour de la table, les propriété Busy et ReadyState d'IE ne font pas du tout l'affaire
    car elles ne sont pas impactées par cette mise à jour, elles ne servent qu'à l'ouverture de la page et
    c'est du reste justement l'objet de cette contribution sinon elle n'aurait pas lieu d'être !

    Idem pour la propriété ReadyState de la table …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #45
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2013
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 411
    Points : 231
    Points
    231
    Par défaut re
    Bonjour,

    Marc j'espére avoir bien saisis le pointage objet et surtout ton astuce set oTALL (déclaré comme objet pour passer la barrière en fait c'est un IHTMLElementCollection...) la tu as fait trés fort...encore bravo (je déclarais en hmtlgenericelement et ca ne marchait pas!!!)

    sommes nous aussi d'accord sur ce point:
    While oTAll.Length: DoEvents: Wend identique à Do While oTAll.Length <> 0: Loop?

    Pour le moment vous allez trop vite je suis sur le post 23..et pas lu la page 3 désolé...semaine prochaine au mieux

    Cependant à 1° vue tout le code original de Marc aprés analyse (et compréhension des . et autres astuces là t'es trop fort Marc t'as plein d'astuces dans ton code!!!) ca ressemble comme 2 gouttes d'eaux au notre en fait sauf que seulement toi t'as mis des . et nous des set...
    toi tu attends le chargement de datas pour continuer...nous grâce à Qwaz la fin du gif animé
    sinon je ne vois pas de différences notables...

    Le seul point à surveiller est la différence entre le onchange et l'entrée de boucle
    Pour résumer ici toi tu as 4 milliéme de seconde pour VBA c'est trés peu...donc tu limites les erreurs potentielles de chargement si d'IE plus rapide que VBA...
    Nous (et je le redis il y avais une erreur avant le test de Qwaz qui a bloqué et supprimé cette erreur définitivement par le gif animé) l'entré dans la boucle se faisait de 2 manières soit
    1° au lancement initial où la (nous il fallait bien plus de 4 milliéme de seconde car déjà set moins rapide que les . et aussi et surtout il y avait beaucoup beaucoup de code vba entre le onchange et la boucle d'entrée)=>plantage fréquent
    2° par retour dans celle ci ou là en effet c'est à 95% de chance une mauvaise réinitialisation de la boucle lorsqu'elle était lancée plusieurs fois de suite en boucle =>plantage là je ne sais plus car c'était la panique ici à l'époque entre tous les paramétres lol

    Donc le seul point litigieux Marc depuis le départ est donc le temps mis par VBA entre le onchange et l'entrée dans la boucle (il ne faut pas qu'IE charge plus vite que ne va VBA) c'est tout pas plus...juste mettre une petite sécurité quelconque au cas où ca me parait plus sûr
    Nous avions ce probléme qui fut contré par Qwaz facilement (avec vérification fin chargement sur le gif animé), mais un autre type de test de sécurité est possible (cela dit comme dans NAsdaq il y a un vérificateur gif animé intégré il me semble préférable de se baser dans ce cas sur lui...
    Pour les autres sites que tu as fais ca je ne sais pas mais je pense pour que la navigation par IE pour Nasdaq Qwaz a optimisé.
    Puis ensuite Qwaz a cassé la baraque question temps en allant 3-4 fois plus vite avec la requête

    Donc pour résumer les . sont plus rapide que les set pour la navigation IE (mais plus dur à manier je trouve)
    puis ensuite pour sécurité totale il me semble qu'il faut une petite vérification de sécurité soit sur non fin chargement IE ou au contrairesoit fin chargement IE suivant la façon de procéder ( par exemple .gif qui ne retarde rien dans le cas du Nasdaq faite pas Qwaz )
    puis requête 3-4 fois plus rapide (attention si requêtes utilisables biensur sinon méthode navigation IE)


    Allez bon we a bientôt

    PS: Marc sans vouloir t'obliger il me semble que tu pourrais mettre des petites lignes d'explication dans ton code de temps en temps...

  6. #46
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour itwoo
    sommes nous aussi d'accord sur ce point:
    While oTAll.Length: DoEvents: Wend
    identique à Do While oTAll.Length <> 0: Loop?
    while=tant que
    until=jusqu'a que

    While oTAll.Length=tant que otall=otall(sa valeur ayant été pointé avant bien sur

    Attention a bien placer cette boucle dans le code

    c'est le principe de l'astuce de marc
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #47
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Salut itwoo !

    Citation Envoyé par itwoo Voir le message
    Marc j'espére avoir bien saisis le pointage objet et surtout ton astuce set oTALL (déclaré comme objet pour passer la barrière
    Comme tu le constateras dans la version alternative, définir une variable objet n'est pas nécessaire …
    Avec ou sans variable, ce qui compte est le pointage de l'élément lui-même, s'assurer de travailler avec le bon !


    Citation Envoyé par itwoo Voir le message
    While oTAll.Length: DoEvents: Wend identique à Do While oTAll.Length <> 0: Loop?
    Exact ! Et Doevents est utile afin de pouvoir interrompre la boucle, au cas où …


    Citation Envoyé par itwoo Voir le message
    […] sinon je ne vois pas de différences notables...
    Le but étant de récupérer les mêmes données, quelque part …
    Quand tu auras rattrapé ton retard, peut-être dans la version alternative !
    Et juste imaginer de tomber sur une page sans sablier ni autre repère …
    Ta discussion me sert de support comme cas concret mais une contribution doit pouvoir être utile à d'autres !

    Dans un bout de code que tu as présenté dans le fil de cette contribution,
    IE ne pouvant pas se mettre à jour plus vite que le VBA (en tout cas avec les cotations de référence abbv et f)
    surtout pour un historique sur dix ans et n'ayant pas réussi non plus sur seulement les cinq derniers jours (!),
    j'ai constaté un problème de conception laissant VBA aller plus vite qu'IE ne termine sa mise à jour !

    Aucune synchronisation et, en cela, quelle notable différence ‼


    C'est vrai, je n'ai pas trop regardé les codes de ta discussion afin de ne pas être influencé
    - à part un post de Patrick qui était vraiment si près ! - je suis parti d'une page blanche pour piloter IE,
    sujet d'origine de ta discussion, afin de vérifier si ma méthode pour un autre site pouvait aussi s'appliquer …

    Le seul souci que j'ai rencontré avec NASDAQ est l'insertion d'une nouvelle table avant celle à récupérer
    décalant son numéro d'index dans la collection des tables et prenant alors en défaut la contribution d'origine.
    Prouvant bien l'importance du pointage d'un élément : quand le bon est ciblé, aucun souci avec la méthode !

    Voir dans cette page le post #42 dans lequel le code ne pointe plus la troisième table - car depuis quelques jours
    c'est devenu la quatrième ! - mais l'avant dernière (au cas où la table redevienne la troisième !) et, malgré
    le verrouillage de la table après la demande de mise à jour pour seulement les cinq derniers jours,
    pas de souci ! Enfin tant que la page source ne sera pas de nouveau modifiée …

    Comme je l'ai mentionné lors de la découverte de la modification de l'index de la table,
    pas de souci avec l'alternative du fait non pas de la méthode, elle reste inchangée,
    mais de comment est pointé l'élément de référence …
    Et comme de par des contrôles l'élément est figé avant de demander la mise à jour, te convenir cela devrait !

    A suivre …

    _________________________________________________________________________________________________
    Ce qui compte ne peut pas toujours être compté, et ce qui peut être compté ne compte pas forcément. (Albert Einstein)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #48
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut un exemple qui pourrais tetre a decortiquer
    salut Marc
    voila un exemple vbs adaptable facilement en vba qui pourrais nécessiter une de tes astuces


    en effet la aussi le Ie.readystate a 4 ne suffit pas
    si j'ai coché au préalable "se souvenir de moi" sur la page et donc connecté la condition est passée donc j'ai les données mais si je ne suis pas connecté donc la condition remplie son boulot (login/password)
    mais le reste du code s'effectue avant que la page se mette a jour alors forcement donnée erronnées(vide)
    VOILA UN EXEMPLE CONCRET A TRAITE
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    dim url, Ie, Iedoc 
    url = "http://www.developpez.net/forums/subscription.php"
    set oldtab=createobject("scripting.dictionary")
    Set Ie = CreateObject("internetexplorer.application")
    Ie.Visible = true
    Ie.navigate url
    Do: Loop Until Ie.readystate = 4
    Set Iedoc = Ie.document
    On Error resume next
    for each elem in iedoc.all
    if elem.id="vb_login_username"then login=true
    next
    if login=true then 
    Set user = Iedoc.getelementbyid("vb_login_username")
    Set pass = Iedoc.getelementbyid("vb_login_password")
    user.Value = "monlogin"
    pass.Value = "monpassword"
    Set bout = Iedoc.getelementsbyclassname("button")
    bout(0).Click
    end if 
    err.clear
    Do: Loop Until Ie.readystate = 4
    Set tablerep = Iedoc.getelementbyid("threads")
    'msgbox tablerep.outerhtml juste pour contrôler le code source de l'élément 
    Set nbsujet = tablerep.Children
    For i = 0 To nbsujet.Length 
    auteur = nbsujet(i).getelementsbyclassname("title")(0).innertext
    lastreponse = nbsujet(i).getelementsbyclassname("popupmenu memberaction")(0).Children(0).innertext
    texte = texte & auteur & "//" & lastreponse & vbCrLf
    Next
    'Ie.Quit
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f, fichier, txt
      mess = "pas de nouvelle reponse dans votre suivi de discution "
        Set fs = CreateObject("Scripting.FileSystemObject")
     If fs.FileExists("C:\oldverif.txt" ) Then 
    fichier2 = "C:\oldverif.txt"
     
    Set f = fs.openTextFile(fichier2, 1)
       oldtexte = f.ReadAll
    for a = 0 to ubound(split(oldtexte,vbcrlf))
    oldtab(split(oldtexte,vbcrlf)(a))=a
    next
    sujet=""
    ligne = Split(texte, vbCrLf)
    For e =0 To UBound(ligne)
    If not oldtab.exists(Split(texte, vbCrLf)(e)) Then
     mess = "il y a des nouvelles reponse pur ces questions dans ton suivi de discution" & vbcrlf & vbcrlf
    sujet=sujet & split(split(texte,vbcrlf)(e),"//")(0) &"     par : " & split(split(texte,vbcrlf)(e),"//")(1)   & vbcrlf
    end if 
    Next
    MsgBox mess & sujet
    End If
       fichier = "C:\oldverif.txt"
         Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.createTextFile(fichier, 2)
        f.write texte
        f.Close
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #49
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Patrick, je t'ai oublié ! …

    Citation Envoyé par patricktoulon Voir le message
    de toute facon la table est un htmlelement donc a un innerhtml
    contenu= ton element .innerhtml(ce qui te donne le innerhtml de 3 mois a la base (d'office)
    do:loop until contenu<>ton element.innerhtml
    et sa fonctionne tres bien sans bug tester depuis 4 mois de temps en temps et je n'ai jamais eu de bug
    D'accord sur le principe pour les anciennes cotations.

    Mais imagine une cotation récente de moins de trois mois, cela risque de coincer :
    l'historique par défaut de trois mois sera le même pour les historiques supérieurs !

    Tandis qu'attendre le pointeur d'une collection de l'élément soit réinitialisé
    fonctionnera sans souci même si en retour ce sont les mêmes données …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #50
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    slaut Marc
    Mais imagine une cotation récente de moins de trois mois, cela risque de coincer :
    l'historique par défaut de trois mois sera le même pour les historiques supérieurs !
    Pas du tout !!!

    tu pointe la table juste après voir même avant le changement de la combo(donc 3 mois d'office )
    tu boucle sur le innerhtml tant qu'il n'est pas différent se qui sera forcement le cas l'ors de la mise ajour par la combo puisque certainement plus long
    je parle bien sur pour la page Nasdaq avec la combo de 3 mois a 10 ans

    exemple :la phrase
    "virginie parle très bien Français "
    n'est pas pareil que
    "virginie parle très bien Français et Sébastien bafouille comme un bébé"
    regarde mon précèdent message la j'ai vraiment besoins de toi on est en plein dans le probleme
    j'ai mis IE visible a true exprès pour que tu le vois
    le message arrive la page "merci de vous être identifié" n'est même pas encore a jour
    il y a pourtant un do/loop sur le ready state après le login /password)
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #51
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut





    Il va me falloir du temps Patrick pour comprendre le code et le besoin du post #48, patience …

    Pour en gagner, dis-moi à partir de quelle ligne cela carabistouille ?
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #52
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    c'est même mieux puisque tu est obligé de mettre quand même une pause
    ca veut dire que entre le moment ou la table pointée change de statut et la table soit a jour il peut se passer un certains temps
    tandis qu'en changeant pour le test sur la value du innerhtml voir même le innertext quand on en arrive la, toute les étapes que tu cherche a traiter son déjà passées

    c'est ca le problème je n'est pas d'erreur(carabistouille)
    le code poursuit son chemin sans attendre la mise a jour de la page mais je n'est pas d'erreur
    c'est pour ca que je disais
    la on a vraiment le problème que tu cherche a traiter bien que la table soit un div avec des "<li>" mais ca change rien on est en plein dedans le sujet

    ce code est sensé être exécuté une 1 erre fois pour faire le odtext dans le quel il y aura les questions et nom du dernier qui a répondu
    les fois suivantes que le fichier est lancé il ouvre le oldtext met tout ca dans un tableau (dico)
    et verifie si dans la page le nom de la dernière réponse n'a pas changé tout simplement et me signale dans le mess
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #53
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Fais le test sur la cotation abbv par exemple en laissant la sélection sur trois mois et en lançant onchange
    Certes c'est un peu bêta mais de mon côté tel quel, pas de souci, la mise à jour de la table est bien détectée !

    Et toi ? Si oui montre alors ton code car je n'arrive pas à visualiser …

    Edit : entre temps tu as posté un nouveau message !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  14. #54
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re avec le innertext
    de cette manière on teste on teste la différence du innertext

    en suite comme toi on re pointe la table et voila
    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
    Sub DemoNASDAQie()
       Dim IE
        Set IE = CreateObject("InternetExplorer.Application")
        With IE
            .Navigate "http://www.nasdaq.com/symbol/abbv/historical"
            While .Busy Or .ReadyState < 4:  DoEvents:  Wend
                 .Visible = True
            With .document
                If InStr(.body.innerHTML, URL) Then
                  Set Table = .GetElementsbytagname("table").Item(3)
                        nblignedep = Table.Children(1).Children.Length
                    texte = Table.innertext
                        With .all("ddlTimeFrame"):  .Value = "3y":  .onchange:  End With
                  With Table
                  Do Until .innertext <> texte: DoEvents: Loop:
     
                 Set Table = IE.document.GetElementsbytagname("table").Item(3)
     
                 MsgBox "la table est maintenant disponible " & vbCrLf & "il y avait " & nblignedep & "  au debut" & vbCrLf & _
                  "maintenant il y a  " & Table.Children(1).Children.Length & "  lignes dans le tableau" & vbCrLf & Table.innertext
                End With
                End If
            End With
          .Quit
        End With
    End Sub
    voila si on enlève les variables pour le msgbox ca fait pas long comme code
    l'avantage de cette facon c'est que même avec un bande passante très petite (débit harchi lent) on tombe a coup sur puisque tant que pas différent on reste dans la boucle
    pour être encore plus sur on devrait même le faire sur le len étant donné que si on clique sur la combo c'est pour avoir plus grand que les 3mois(66 lignes d'office de la table )

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do until len(.innertext)>len(texte):doevent:loop
    EDIT:!!!
    je viens de me rendre compte que même si nos 2 méthodes fonctionnent on en tire pas la bonne conclusion
    puisqu'en ligne 17 je suis obligé de re pointer la table ca veux dire que l'élément est nul(inexistant après la boucle
    donc pourquoi pas boucler sur la valeur nul de l'Object lui même
    qu'en pense tu?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #55
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Oui d'accord car c'est la même méthode de verrouillage de l'élément !
    Au lieu de tester la propriété length d'une de ses collections, tu contrôles sa propriété innerText, c'est du pareil au même …

    Par contre il n'y a pas besoin de stocker cette propriété dans une variable
    car lorsque l'élément est réinitialisé, elle est de facto vide !
    Qui plus est dans le cas d'une cotation récente de moins de trois mois comparer avec une variable serait une erreur
    car les mêmes données seraient renvoyées ‼ Attendre qu'une propriété soit réinitialisée est bien plus sûr …

    Je suis revenu de nouveau ce soir sur Excel 2003 (cette après-midi c'était des tests sur la version 2007)
    et ton code ne m'affiche pas le message sans que je clique de nouveau sur Excel :
    c'est le conflit inter-applications évoqué précédemment …
    Soit il faut réactiver dans le code Excel soit il faut attendre de quitter IE :

    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
    Private Sub DemoNASDAQinnerText()
        Const URL$ = "http://www.nasdaq.com/symbol/abbv/historical"
        Dim oTables As Object
     
        With CreateObject("InternetExplorer.Application")
            .Navigate URL
            While .Busy Or .ReadyState < 4:  DoEvents:  Wend
     
            With .Document
                If InStr(.body.innerHTML, URL) Then
                    With .all("ddlTimeFrame"):  .Value = "5d":  .onchange:  End With
                    Set oTables = .getElementsByTagName("TABLE")
     
                    With oTables(oTables.Length - 2)
                        M$ = "Il y avait " & .Rows.Length & " lignes avant la mise à jour," & _
                             vbLf & vbLf & "après il y en a "
                        While .innerText > "":  DoEvents:  Wend
                    End With
                              M = M & oTables(oTables.Length - 2).Rows.Length & " …"
                    Set oTables = Nothing
                End If
            End With
     
            .Quit
        End With
     
        If M > "" Then MsgBox M, vbInformation, Space$(13) & "NASDAQ" Else Beep
    End Sub
    Par contre l'objet n'est pas nul car certaines valeurs ne sont pas réinitialisées comme par exemple sa propriété tagName


    Quant à ton code sur DVP, j'ai commencé à regarder mais je bute sur une erreur de permission refusée
    lors de la mise à jour totale de la page : là il ne s'agit pas juste de la mise à jour d'un élément d'une page !
    J'hésite entre gérer cette erreur ou continuer à chercher quelque chose d'un peu plus propre …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #56
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    permission refusée?????????

    n'hésite pas si tu a plus propre mais n'oublie pas que la destintion fichier est un vbs ddonc fonction vba excel limité le plus possible
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #57
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    J'ai légèrement édité le code de mon précédent message …

    Oui l'erreur 70 et j'ai l'impression que justement elle se déclenche quand la page se met à jour …

    Je teste en VBA pour suivre l'évolution des variables; j'irais vérifier sous 2007 si cela me déclenche la même erreur …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  18. #58
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    moi j'ai 2007 et le n'est pas cette erreur en vba
    en vbs donc en 64 bit je ne l'ai pas non plus
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  19. #59
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Le portable avec la version 2007 s'est libéré : effectivement il n'y a plus de conflit inter-applications dans cette version …

    J'ai encore édité le code du post #55 plus en respect avec l'idée de départ (sauf les cinq derniers jours demandés);
    cela m'apprendra à démarrer à partir du code d'un autre !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  20. #60
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Patrick, concernant ton code du post #48 pour le login DVP, là c'est un peu hors sujet car il ne s'agit plus
    de l'attente de la mise un jour d'un élément d'une page mais carrément d'attendre le chargement d'une autre page !

    J'ai pu visualiser l'erreur 70 permission refusée à la volée dans la fenêtre des Variables locales justement
    pendant le changement de page, certaines propriétés du document étant momentanément indisponibles …

    En reprenant les bases, la solution est toute simple, remonter simplement d'un niveau :
    la propriété .LocalName d'IE prend le titre du document une fois la page totalement chargée !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

Discussions similaires

  1. [MySQL] Comment extraire des données dans un fichier .svc depuis une page web
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/12/2013, 12h02
  2. Réponses: 1
    Dernier message: 08/07/2009, 11h52
  3. [XL-2003] Faire mise à jour fichier excel stocké sur une page web
    Par fidecourt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/04/2009, 17h12
  4. Comment ouvrir Word ou Acrobat Reader à partir d'une page web ?
    Par Kuuei dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 17/05/2006, 15h18
  5. Comment empêcher la mise à jour d'un contrôle à l'écran ?
    Par JojoLaFripouille dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2003, 12h52

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