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

Python Discussion :

selenium: "Element could not be scrolled into view"


Sujet :

Python

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut selenium: "Element could not be scrolled into view"
    Bonjour,

    j'essaie de télécharger un fichier excel depuis UCI.org
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from selenium import webdriver
     
    url = "https://www.uci.org/road/teams"
     
    browser = webdriver.Firefox()
    browser.get(url)
     
    link = browser.find_element_by_link_text('Members')
    link.click()
     
    menu = browser.find_element_by_css_selector('.export-btn')
    menu.click()
    cela me retourne l'erreur : selenium: "Element <span class="export-btn"> could not be scrolled into view".
    j'ai tenté des webdriverwait, mais ça ne fonctionne pas mieux : je ne parviens pas à accéder au téléchargement.

    je n'arrive pas à voir, dans le code la page du site, ce qui gêne.

    PS: même résultat avec Chrome.

    edit:
    j'ai aussi essayé ce que j'ai trouvé sur le net : actions, select, sans de meilleurs résultats.

    EDIT2 :
    ça fonctionne bien lorsque "je" clique directement pour télécharger la liste des équipes; c'est après le passage à "la page" des "Members" des équipes que ça coince.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Citation Envoyé par N_BaH Voir le message
    cela me retourne l'erreur : selenium: "Element <span class="export-btn"> could not be scrolled into view".
    j'ai tenté des webdriverwait, mais ça ne fonctionne pas mieux : je ne parviens pas à accéder au téléchargement.

    je n'arrive pas à voir, dans le code la page du site, ce qui gêne.
    Je ne suis pas un utilisateur de selenium avec Python, ça m'a l'air bien je vais regarder...

    Mais là il y a un problème qu'on voit en JS/HTML/CSS... Ici on voit que export-btn est un nom de class or plusieurs élément html pourrait avoir cette class... Et justement j'ai regardé la page web en question et effectivement il y a deux éléments ayant la class export-btn l'un est visible et l'autre non (il est contenu dans une div ayant le style css : display: none).

    Et il se pourrait que ce soit sur cet élément non visible que le clique ait lieu... D'où l'erreur...

    En JS c'est assez simple de sélectionner le bon élément mais bon pas la peine car il y a un autre problème (cf. ci-dessous).


    Citation Envoyé par N_BaH Voir le message
    EDIT2 :
    ça fonctionne bien lorsque "je" clique directement pour télécharger la liste des équipes; c'est après le passage à "la page" des "Members" des équipes que ça coince.
    Le problème c'est que même si on clique sur le bon élément (celui qui est visible et qui a la class export-btn) eh bien cela ne déclenche pas l'affichage de la boite de dialogue du téléchargement mais cela fait apparaitre une liste de choix "Excel" ou "Pdf"...

    Il faut donc aussi faire ce choix en cliquant...

    Mais il y a plus simple : cliquer directement sur l'option voulue à savoir "Excel"... C'est possible, je l'ai repéré dans la page :
    <li id="team-list-export-excel" class="k-item k-state-default k-first" role="menuitem"><span class="k-link k-menu-link">Excel</span></li>...

    On voit qu'il a un id : "team-list-export-excel" et là c'est cool car cela veut dire qu'il devrait y en avoir qu'un... Il suffit de cliquer dessus...

    En JS on peut le faire avec : document.querySelector("#team-list-export-excel").click() ou document.getElementById("team-list-export-excel").click()...

    Il doit exister un équivalent avec selenium/Python...



    PS : Cela dit je n'ai pas compris quel était l’intérêt d'automatiser cette partie-là puis qu’ensuite il faudra quand même intervenir pour indiquer notre choix quand la boite de dialogue du téléchargement apparait...

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    on voit que export-btn est un nom de class or plusieurs élément html pourrait avoir cette class... Et justement j'ai regardé la page web en question et effectivement il y a deux éléments ayant la class export-btn l'un est visible et l'autre non (il est contenu dans une div ayant le style css : display: none).
    d'accord.
    il y en a un sous une div team, et l'autre, celui auquel je n'arrive pas (pas encore) à accéder, sous une autre div members

    Le problème c'est que même si on clique sur le bon élément (celui qui est visible et qui a la class export-btn) eh bien cela ne déclenche pas l'affichage de la boite de dialogue du téléchargement mais cela fait apparaitre une liste de choix "Excel" ou "Pdf"...
    tout à fait, je parviens à télécharger le calendrier sur la page calendars.
    là, sur la la page team, je suis bloqué par l'erreur évoquée.

    cliquer avec selenium sur team-list-export-excel retourne la même erreur.

    je vais chercher comment accéder à la div souhaitée.

    merci.

    je vais tâcher de rester centré sur selenium, merci pour le javascript.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Le JS c’était pour l'exemple mais je viens de voir l'équivalent ici : https://selenium-python.readthedocs....locating-by-id

  5. #5
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message

    cliquer avec selenium sur team-list-export-excel retourne la même erreur.
    Chez moi ça marche quand je teste avec du JS : document.getElementById("team-list-export-excel").click()...

    Et l'équivalent avec selenium/Python ce serait ça apparemment : https://selenium-python.readthedocs....locating-by-id

    Je n'ai pas réussi à tester mais en me basant sur ton code je dirais : driver.find_element_by_id('team-list-export-excel').click()...

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je vais tâcher de rester centré sur selenium, merci pour le javascript.
    J'ai réussi à le faire avec avec selenium/Python sans JS mais ce n'est pas top...

    Alors j'ai vu qu'on pouvait aussi exécuter un script JS avec selenium/Python...

    Et ça marche mieux :


    Code python : 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
    from selenium import webdriver
     
    url = "https://www.uci.org/road/teams"
     
    # browser = webdriver.Firefox()
    browser = webdriver.Chrome()
     
    browser.get(url)
     
    link = browser.find_element_by_link_text('Members')
    link.click()
     
    javaScript = "document.getElementById('team-list-export-excel').click()"
    browser.execute_script(javaScript)
     
    # les deux lignes suivantes ne sont pas obligatoire...
    javaScript = "alert('download')" 
    browser.execute_script(javaScript)

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    en le faisant à l'envers, c'est mieux.

    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
    from selenium import webdriver
     
    url = "https://www.uci.org/road/teams"
     
    browser = webdriver.Firefox()
    browser.get(url)
     
    #on passe d'abord par l'onglet Members
    link = browser.find_element_by_link_text('Members')
    link.click()
     
    menu = browser.find_element_by_id("team-member-exportMenu")
    menu.click()
     
    dl = browser.find_element_by_id('team-member-export-excel')
    dl.click()
     
    # pour revenir à l'onglet d'accueil : Teams
    link = browser.find_element_by_link_text('Teams')
    link.click()
     
    menu = browser.find_element_by_id("team-list-exportMenu")
    menu.click()
     
    dl = browser.find_element_by_id('team-list-export-excel')
    dl.click()
     
    browser.quit()
    cette version est à taper dans une session python interactive, en surveillant que les éléments ont fini de se charger.
    pour en faire un script "indépendant", il faut ajouter des WebDriverWait, avec des expected_conditions, et autre TimeoutExceptions pour contrôler ces chargements.

    pourquoi est-ce que ça marche mieux en commençant par l'onglet Members ?...... "no sé"

    Beginner. : tu sais qu'il y a un forum Javascript, n'est-ce pas ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    cette version est à taper dans une session python interactive, en surveillant que les éléments ont fini de se charger.
    pour en faire un script "indépendant", il faut ajouter des WebDriverWait, avec des expected_conditions, et autre TimeoutExceptions pour contrôler ces chargements.
    Oui justement je viens de découvrir le problème (bien connu en JS), j'étais dessus et j'ai utilisé "document.readyState"...

    Citation Envoyé par N_BaH Voir le message
    pourquoi est-ce que ça marche mieux en commençant par l'onglet Members ?...... "no sé"
    Alors justement il y a là un soucis, pour pouvoir cliquer sur l'onglet Members il faut qu'il soit chargé dans le DOM, j'ai bien vérifié et ce n'est pas toujours le cas...

    En fait au début je n'avais pas vu ce problème car j'utilisais le débogueur avec des point d’arrêts, je faisais une exécution pas à pas alors la page avait largement le temps de se charger... Et dés que je le lançais l’exécution sans débogage alors je constatais que l'onglet n'était pas sélectionné et la raison c'était que le DOM n'était pas encore chargé...

    Donc même avec ce code il faut s'assurer que le DOM est bien chargé...

    Chez toi ça marche toujours ???

    Citation Envoyé par N_BaH Voir le message
    Beginner. : tu sais qu'il y a un forum Javascript, n'est-ce pas ?
    Ah oui c'est clair je suis bien au courant j'y ai posté un grand nombre de message et maintenant je passe à Python mais JS est toujours là...

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    jusque là, ça va. j'attends bien entre les étapes, et ça ouvre les fenêtres de téléchargements demandées.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    jusque là, ça va. j'attends bien entre les étapes, et ça ouvre les fenêtres de téléchargements demandées.
    Oui si on attend ça marche...
    Mais ce ne serait pas mieux si l'attente se faisait "automatiquement" (via le code) ?

    Avec ce code ci-après cela fonctionne "automatiquement" (exécution normal quoi...) et il est assez simple et concis :

    Code python : 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
    from selenium import webdriver
     
    url = "https://www.uci.org/road/teams"
     
    browser = webdriver.Firefox()
    # browser = webdriver.Chrome()
    browser.get(url)
     
    state = ""
    while state != 'complete':
        state = browser.execute_script('return document.readyState')
     
    link = browser.find_element_by_link_text('Members')
    link.click()
     
    javaScript = "document.getElementById('team-list-export-excel').click();"
    browser.execute_script(javaScript)

    Mais curieusement sans le JS (c'-à-d avec browser.find_element_by_id('team-list-export-excel').click()) cela ne fonctionne pas ???

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    tout à fait.
    Citation Envoyé par N_BaH
    pour en faire un script "indépendant", il faut ajouter des WebDriverWait, avec des expected_conditions, et autre TimeoutExceptions pour contrôler ces chargements.
    edit: ce n'est pas très stable : le téléchargement n'est pas toujours disponible, et je retombe sur la même erreur.
    j'ai l'impression que plus je teste le code, plus l'élément est indisponible, et quand je "laisse reposer", il n'y a plus de problème.
    je me demande s'il n'y aurait pas une histoire de cache qui optimiserait le téléchargement des élément sans qu'ils soient réellement disponible.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Bah c'est vrai qu'à un moment Chrome m'a alerté par rapport à un téléchargement répétitif, il m'a demandé alors si je voulais vraiment télécharger le fichier...

Discussions similaires

  1. Réponses: 8
    Dernier message: 24/09/2015, 20h11
  2. Erreur : "Could not find default endpoint element that references contract"
    Par obitskater dans le forum Windows Communication Foundation
    Réponses: 0
    Dernier message: 27/02/2009, 10h30
  3. TNS:listener could not resolve SERVICE_NAME given in connect
    Par Sinclair dans le forum Administration
    Réponses: 15
    Dernier message: 20/08/2003, 17h26

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