Partage
  • Partager sur Facebook
  • Partager sur Twitter

remplir un input en selenium JS

function js anonyme

    18 septembre 2019 à 12:01:46

    Bonjour,

    j'essaie d'automatiser la navigation sur un site, mais il est tous en JS ajax.

    Du coup, quand j'utilise selenium, il ne trouve pas les éléments qui sont dans les scripts car selenium ne lit que le HTML en dur.

    Du coup, ma question est comment faire pour attendre les différents éléments HTML qui sont en JS?

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2019 à 12:25:27

      Perso j'ai codé ma propre méthode "wait", qui utilise WebDriverWait et qui prend en argument un sélecteur CSS.

      Ça attend jusqu'à ce qu'un élément avec ce sélecteur existe (ou que le timeout soit expiré).

      # coding: utf-8
      
      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.common.exceptions import TimeoutException
      
      
      class Chrome(webdriver.Chrome):
          def __init__(self, *args, timeout=30, **kwargs):
              self.timeout = timeout
              super().__init__(*args, **kwargs)
      
          def wait(self, css_selector):
              try:
                  WebDriverWait(self, self.timeout).until(
                      EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
                  )
              except TimeoutException:
                  self.quit()
                  raise TimeoutException("Sélecteur CSS introuvable : " + css_selector)
      
          def find_css(self, css_selector=None):
              self.wait(css_selector)
              return self.find_element(By.CSS_SELECTOR, css_selector)
      
          def find_all_css(self, css_selector):
              self.wait(css_selector)
              return self.find_elements(by=By.CSS_SELECTOR, value=css_selector)
      

      Ainsi à la place de driver.find_element j'utilise driver.find_css, et à la place de driver.find_elements j'utilise driver.find_all_css.

      Là c'est avec webdriver.Chrome mais ça devrait marcher aussi bien avec les autres webdriver (Firefox etc...).

      Si tu veux faire avec autre chose qu'un sélécteur css regarde la doc :

      https://selenium-python.readthedocs.io/waits.html

      -
      Edité par thelinekioubeur 18 septembre 2019 à 12:26:12

      • Partager sur Facebook
      • Partager sur Twitter
        18 septembre 2019 à 13:10:37

        merci pour ta réponse thelinekioubeur.

        Mais je n'arrive pas a faire fonctionner ta classe.

        je l'ai incorporée a mon problème pour faire des tests mais j'obtiens :

        AttributeError: 'MyBrowser' object has no attribute 'find_element'

        Je travaille également sous chrome.

        voici le code :

        -
        Edité par DESPORTES FLAVIE 18 septembre 2019 à 13:32:26

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2019 à 14:04:57

          Tu as mal regardé ma classe hérite de webdriver.Chrome.

          Plutôt que d'incorporer, tu dois juste utiliser ma classe Chrome à la place de celle de selenium.

          -
          Edité par thelinekioubeur 18 septembre 2019 à 14:09:18

          • Partager sur Facebook
          • Partager sur Twitter

          remplir un input en selenium JS

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown