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

AppleScript Discussion :

récupérer une URL du code source de la page avec Safari


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut récupérer une URL du code source de la page avec Safari
    Bonjour le Forum.
    J'ai besoin de votre aide.
    Je cherche à récupérer une URL dans un code source avec safari, pour anticiper l'ouverture de la page suivante.
    Le cas se présente avec le site des impots.gouv par exemple.

    Je sais récupérer l'url d'une page affichée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tell application "Safari"
    	set code to URL of front document
    Je sais cliquer sur un bouton. Ainsi sur la 1ere page du site impots.gouv, un clic sur "Connexion" ouvre la page suivante et correspond à la ligne 157 à 159 du code source,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    157    <button type="submit" class="btn btn-primary"  onclick="document.getElementById('LMDP_formulaire').action = urlLoginMotDePasse ; return envoiLP();">
    158           Connexion
    159    </button>
    Ces lignes de code d'AppelScript permet de simuler le clic sur le bouton Connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tell application "Safari"
    	activate
    	set URL of document 1 to "https://cfspart.impots.gouv.fr"
     
    	tell document 1
    		do JavaScript "document.getElementsByClassName('btn btn-primary')[1].click()"
    	end tell
    end tell
    Mais je ne sais pas dans la page suivante simuler le clic sur " ►Ma situation fiscale personnelle (mes déclarations, avis, paiements...) " du cadre "Consulter".
    le code source se situe de la ligne 726 à 731 et seule la ligne 730 du code source de la page est concernée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    730         <li class="modal-link ">&#x25BA;<a  href="/acces-usager/cfs" target="_blank" class="openWindow" title="L'ouverture s'effectuera dans une nouvelle fenêtre">Ma situation fiscale personnelle (mes déclarations, avis, paiements...)</a>
    l'instruction AppleScript ne donne rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       tell document 1
               do JavaScript "document.getElementsByclassName('modal-link ')[9].click()"
         end tell
    ni celle ci-dessous que je ne sais pas utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do JavaScript "document.getAttribute('href')[9]"
    Je vous remercie de m'aider.

    Jean_François.

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour JefMonde,
    J'ai mis un peu de temps à te répondre car, n'ayant jamais fait de javascript, cela m'a pris un peu de temps pour apprendre les bases de ce language et pouvoir comprendre sa syntaxe.

    Je ne suis toujours pas un expert, mais j'ai suffisamment compris pour résoudre ton problème.
    La difficulté est de trouver à adresser l'élément adéquat, mais la fenêtre développeur Safari, une fois maîtrisée, donne rapidement la réponse.
    Cependant, je me suis heurté au problème de l'attente de la réponse de Safari et du serveur pour afficher la page, avant de faire un click.

    J'ai résolu cela aussi avec une fonction javascript 'readyState'. Cependant, je me suis aperçu que ce status donne celui de la page en cours, avant même le début du chargement de la page à venir. Il faut donc tester à la fois ce statut et le nom de la page pour s'assurer que la page dans laquelle on veut cliquer est bien complètement chargée. J'ai fait une petite routine pour ça.

    Voici le script complet, commenté, qui t'amène à la page de tes documents fiscaux :
    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
    set URLImpots to "https://cfspart.impots.gouv.fr"set nomPage0 to "https://cfspart.impots.gouv.fr"
    set nomPage1 to "Particuliers | authentification"
    set nomPage2 to "Mon espace particulier"
    
    tell application "Safari"
    activate
    makenewdocument
        set URL of document 1 to URLImpots
    end tell
    
    attentePage(nomPage0) -- attente de chargement de la page 0
    attentePage(nomPage1) -- attente de chargement de la page 1
    
    -- click sur le bouton de connexion
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('btn btn-primary')[1].click()"
    
    attentePage(nomPage2) -- attente de chargement de la page 2 proposant les choix
    
    -- click sur le bouton consulter ma situation fiscale qui est le 8ème élément de class 'openWindow' (de 0 à 7)
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('openWindow')[7].click()"
    
    -- La page demandée est ouverte dans une fenêtre séparée !!
    
    on attentePage(nomPage) -- attente de la fin de chargement de la page
        tell application "Safari"
            repeat until ((name of document 1) is nomPage) and ((do JavaScript "document.readyState" in document 1) is "complete")
            end repeat
        end tell
    end attentePage
    Bien sûr, cela pré-suppose que ton n° fiscal et ton mot de passe seront remplis automatiquement.

    Cordialement

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut
    Bonjour PBELL

    Super. Tu as la solution. Je suis désolé de t'avoir forcé à débuter avec javascript et merci pour ta totale disponibilité.
    Il faut cependant modifier à la marge ton script.
    - ligne 7 écrire Make new document qui doit être détaché, sinon Applescript prend Makenewdocument pour une variable, tout du moins avec ma configuration.
    - lignes 11, 12 et 17, attentepage(). Une fois le script lancé, il apparait le message " en cours d'exécution... " avec la roue qui tourne indéfiniment. Le programme se fixe sur le premier attentepage. J'ai résolu le problème par un delay 5.

    Enfin ta dernière remarque est juste : "Bien sûr, cela pré-suppose que ton n° fiscal et ton mot de passe seront remplis automatiquement", ce que fait Safari si, à la première entrée des codes, on demande de les enregistrer.

    Merci infiniment.

    Jean-françois.
    NB. Je ne trouve pas le bouton Résolu !

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Merci de ton retour.
    Pour le "makenewdocument" effectivement il m'arrive régulièrement, lorsque je fais un copié/collé de l'éditeur de script vers ce site, que des espaces disparaissent. J'essaye d'être vigilant et de les rajouter manuellement ensuite directement dans la partie code de la réponse, mais visiblement, j'ai raté cette ligne.

    Je vois aussi maintenant que le retour à la ligne est manquant sur la ligne 1 pour séparer les 2 "set".

    Pour ce qui est des "attentePage", la routine fonctionne parfaitement chez moi.
    Tu devrais mettre un log dans le routine (avec peut être une sortie au bout de 200 itérations ?) pour voir ce qui ne va pas chez toi.
    J'évite, autant que faire se peut, de mettre des "delay" sur les pages web car soit le délai est trop long (pourquoi attendre 15 secondes en tout !), soit il peut être trop court (si le serveur met du temps à répondre ou que ta ligne ADSL est trop lente).

    Content de t'avoir aidé.

  5. #5
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Réunion

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 49
    Par défaut
    Bonsoir PBELL, bonsoir le forum.

    Tu as raison, "attentePage()" fonctionne. Chez moi il bloque sur "attentePage(nomPage0)" et plante le script. Il semble que le nom de la page0 soit "sans titre 2". En rectifiant l'affectation le scripte se plante toujours. J'ai donc mis delay 5 par défaut et le scripte alors fonctionne. Il faut cependant effacer l'historique avant de lancer une 2ème fois le script. Les identifiants s'inscrivent automatiquement dans la page "Particuliers | authentification".
    Je ne sais utiliser log dans ce programme.

    Je vous soumets le script en entier, qui reprend le travail de PBELL, sans que j'en ai obtenu son autorisation. J'espère de ne pas abuser.
    L'objectif est de visualiser la taxe foncière dans un programme de gestion locatif (location immobilière). Peut-être apporterez-vous des corrections et des compléments pour professionnaliser le programme : par exemple accélérer l'exécution du programme en n'affichant pas les différentes page sur safari, et obtenir directement le document recherché en PDF. J'ai bidouillé sans résultat le couple {window et visible}. Je crois que Safari ne pilote Acrobate; je ne vois pas Acrobate dans la bibliothèque.
    Le PDF se place dans le dossier Téléchargement et le document s'ouvre dans Acrobat tout seul.

    PBELL, je te remercie infiniment pour ton aide. Cordialement à tous.

    Jean-François.

    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
     
    set laDate to current date
    set an to year of laDate
     
    set URLImpots to "https://cfspart.impots.gouv.fr"
    set nomPage0 to "sans titre 2" -- "https://cfspart.impots.gouv.fr"
    set nomPage1 to "Particuliers | authentification"
    set nomPage2 to "Mon espace particulier"
    set nomPage3 to "accueil"
    set nomPage4 to "Mes documents"
    set nomPage5 to "Avis d'imposition - Taxes foncières - " & an
     
     
    -- ouvre la page 0, puis la page 1
    tell application "Safari"
    	activate
    	make new document
    	set URL of document 1 to URLImpots
    end tell
    attentePage(nomPage0) 	-- L'attente de chargement de la page 0,
    						-- qui ne fonctionne pas chez moi.
    delay 5
    attentePage(nomPage1) -- attente de chargement de la page 1
     
     
    -- Dans la page1, click sur le bouton "Connexion"
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('btn btn-primary')[1].click()"
     
     
    attentePage(nomPage2) -- attente de chargement de la page 2
    -- dans la page 2, click sur le bouton "consulter ma situation fiscale" qui est le 8ème élément de class 'openWindow' (de 0 à 7)
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('openWindow')[7].click()"
     
     
    -- S'assurer que les pages 1, 2, 3, 4, 5  s'ouvrent entièrement
    on attentePage(nomPage) -- attente de la fin de chargement de la page 3
    	tell application "Safari"
    		repeat until ((name of document 1) is nomPage) and ((do JavaScript "document.readyState" in document 1) is "complete")
    		end repeat
    	end tell
    end attentePage
     
     
    attentePage(nomPage3) 	-- attente de chargement de la page 3
    -- La page demandée s'ouvre dans une fenêtre séparée !!
    -- Dans la page 3, clic sur le bouton "Mes documents"
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('cssLienBarreNav')[4].click()"
    attentePage(nomPage4) 	-- attente de chargement de la page 4
     
     
    attentePage(nomPage4) 	-- attente de chargement de la page 4
    --Dans la page 4, extrait du document "avis primitif" de la Taxe d'habitation
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('cssLienTable')[8].click()"
     
     
    attentePage(nomPage5) 	-- attente de chargement de la page 5 dans une nouvele fenêtre
    -- Dans la page 5, enregistrer le document PDF
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('cssBouton')[1].click()"

  6. #6
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir JefMonde,
    Tu as bien avancé sur le script !
    Tu as bien sûr tout à fait le droit de réutiliser les morceaux de scripts. Ils sont là pour ça !


    Quelques remarques :
    Pour avoir un programme plus lisible, il est préférable de mettre le contenu des sous routines (Applescript appelle cela des handler) après la fin du programme principal. J’ai donc remis attentePage en fin de script.
    J'ai d'ailleurs changé cette routine pour qu'elle vérifie que le titre de la page contient nomPage et non plus soit égal à nomPage. C'est plus souple !

    Après le click sur le bouton document, tu fais 2 fois appel à attentePage(nomPage4), j’en ai supprimé 1.

    Lorsque tu cliques sur l’item 8 de la class ‘cssLienTable’ pour choisir l’avis primitif de la taxe foncière, je pense que tu fait une hypothèse hasardeuse: Es tu certain que cela soit toujours l’item 8 ?
    Sur mon compte, ce n'est pas le cas. Il semble que cela dépende des autres documents disponibles pour ton compte taxes d'habitation, taxes foncières, impôts revenus (avis premier acompte, second acompte, avis primitif, avis définitif,… Ce nombre dépend des documents du contribuable et de la période de l’année.

    Cela se complique un peu car même en cherchant les différentes valeurs de la class ‘cssLienTable ‘, beaucoup contiendront les termes ‘Avis primitif ‘ sans que tu puisses savoir si cet avis se rapporte aux IR, à la taxe foncière ou à la taxe d’habitation. Donc déterminer sur quel document il faut cliquer demande un peu plus de subtilité. Mais pas d'inquiétude, avec méthode, je vais expliquer !

    il faut d’abord lire le texte associé à chaque occurence de la classe ’cssFondTextePair’ . Si ce texte contient le mot ‘foncières’, compte tenu de la construction de la page html, il faudra prendre l'élément parent pour trouver ensuite tous les document attachés. Dans le cas de la foncière, il n'y a qu'un document.

    En traduisant en javascript il faut :
    1 chercher combien il y a d'éléments de la class 'cssFondTextePair'. -> document.getElementsByClassName('cssFondTextePair').Length
    2 boucler sur chacun de ces éléments pour trouver celui dont le texte contient "foncières". La valeur du texte de l'élément I est -> document.getElementsByClassName('cssFondTextePair')[I].innertext
    3 prendre l'élément parent de l'objet trouvé -> document.getElementsByClassName('cssFondTextePair')[NoItem].parentnode
    4 dans cet élément parent, cliquer sur le premier élément de class 'cssLientable' (comme tu l'avais fait !) -> document.getElementsByClassName('cssFondTextePair')[NoItem].parentnode.getElementsByClassName('cssLienTable')[0].click()

    Une fois remis en forme, voici le script qui fonctionne sans problème (chez moi et j'espère de même chez toi!) :
    J'ai aussi mis plein de ligne de log, dune part pour que tu vois comment ça s'utilise pour débuter, d'autre part pour que tu puisse suivre ton script si tu mets l'éditeur Applescript en mode message (voir les boutons en bas de la fenêtre de l'éditeur) :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    set laDate to current date
    set an to year of laDate
    
    set URLImpots to "https://cfspart.impots.gouv.fr"
    set nomPage0 to "sans titre 2" -- "https://cfspart.impots.gouv.fr"
    set nomPage1 to "Particuliers | authentification"
    set nomPage2 to "Mon espace particulier"
    set nomPage3 to "accueil"
    set nomPage4 to "Mes documents"
    set nomPage5 to "Avis d'imposition - Taxes foncières - " & an
    
    -- ouvre la page 0, puis la page 1
    tell application "Safari"
    activate
    make new document
        set URL of document 1 to URLImpots
    end tell
    log "ouverture de la page 1"
    --attentePage(nomPage0) -- L'attente de chargement de la page 0,
    -- qui ne fonctionne pas chez moi.
    delay 5
    attentePage(nomPage1) -- attente de chargement de la page 1
    log "page de connexion"
    
    -- Dans la page1, click sur le bouton "Connexion"
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('btn btn-primary')[1].click()"
    log "connexion faite"
    
    attentePage(nomPage2) -- attente de chargement de la page 2
    -- dans la page 2, click sur le bouton "consulter ma situation fiscale" qui est le 8ème élément de class 'openWindow' (de 0 à 7)
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('openWindow')[7].click()"
    log "ouverture de la page situation fiscale"
    
    attentePage(nomPage3) -- attente de chargement de la page 3
    -- La page demandée s'ouvre dans une fenêtre séparée !!
    -- Dans la page 3, clic sur le bouton "Mes documents"
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('cssLienBarreNav')[4].click()"
    log "ouverture de la page mes documents faite"
    
    attentePage(nomPage4) -- attente de chargement de la page 4
    --Dans la page 4, extrait du document "avis primitif" de la Taxe foncière
    tell application "Safari"
        tell document 1
    -- compte le nombre d'impôts
            set nbImpots to (do JavaScript "document.getElementsByClassName('cssFondTextePair').length") as integer
            set NoItem to -1
    -- recherche de la ligne contenant le mot "foncière"
            repeat with I from 1 to nbImpots
                set TValeur to (do JavaScript "document.getElementsByClassName('cssFondtextePair')[" & I & "].innerText") as string
                if TValeur contains "foncière" then set NoItem to I
            end repeat
            log "No ligne impôt foncier = " & NoItem
    -- prend l'élément parent de la taxe foncière et recherche le bouton du document (on suppose un seul document = avis primitif !)
            do JavaScript "document.getElementsByClassName('cssFondTextePair')[" & NoItem & "].parentNode.getElementsByClassName('cssLienTable')[0].click()"
            log "click pour ouvrir l'avis effectué"
        end tell
    end tell
    
    attentePage(nomPage5) -- attente de chargement de la page 5 dans une nouvele fenêtre
    log "page PDF ouverte"
    -- Dans la page 5, enregistrer le document PDF
    tell application "Safari" to tell document 1 to do JavaScript "document.getElementsByClassName('cssBouton')[1].click()"
    log "Téléchargement et fin du script"
    -- fin du script
    
    
    -- S'assurer que les pages 1, 2, 3, 4, 5  s'ouvrent entièrement
    on attentePage(nomPage) -- attente de la fin de chargement de la page 3
        tell application "Safari"
            repeat until ((name of document 1) contains nomPage) and ((do JavaScript "document.readyState" in document 1) is "complete")
            end repeat
        end tell
    end attentePage

    J'ajoute, in finé que l'ouverture d'Acrobat ou Aperçu en fin de téléchargement du PDF dépends des réglages que tu fais dans le Finder. Sélectionner un fichier PDF (sans l'ouvrir), touches cmd i, puis demander "Ouvrir avec…". Confirmer que tous les fichiers PDF feront de même.

    Cordialement

Discussions similaires

  1. Récupérer et modifier le code source d'une classe
    Par aA189 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/07/2008, 11h43
  2. [RegEx] Récupérer une chaine dans un source HTML
    Par Lawyer666 dans le forum Langage
    Réponses: 4
    Dernier message: 27/04/2007, 18h25
  3. [MySQL] récupérer une url en php
    Par caroen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/03/2007, 14h36

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