Localiser un élement avec sélenium

Résolu
Enygma -  
 Enygma -
Bonjour,

Je suis en train de déveloper un code en python en utilisant la bibliothèque sélenium.
Depuis pas mal de temps, j'essaye déseperément de localiser le "href" de la balise "a" qui se situe dans la balise "header" avec le sélecteur XPATH mais je n'y arrive pas. Je pense que je loupe quelque chose de évident mais je ne sais pas quoi si vous pourriez m'aider, ce serait super ! Voici le code HTML et mon code en python pour que vous puissiez comprendre.

<header class="v-card">
<div class="row-denom">
<div class="denomination with-noavis">
<h3 class="company-name noTrad">
<a class="denomination-links pj-lb pj-link" title="UCB Cast Profil France" data-pjsearchctx-sethref="" data-pjaccengage="{"action":"secondClick","actionType":"FANTOMAS","varName":"pjinfosaccengage-rmk-connexefd-fcp06891649prospect000001c0001"}" href="/pros/detail?bloc_id=FCP06891649PROSPECT000001C0001&no_sequence=1&code_rubrique=14053800" data-pjstats="{"idTag":"DENOMINATION-EXACTE","pos":3,"type_bi":"pro","genreBloc":"1","pjscript":"tag.click.send({elem:{},level2:{%xtn2},name:'denom_exacte',chapter1:'LR_BI',chapter2:'zone_identification',chapter3:'info',type:'action',customObject:{idrequete:pjstatVars.idRequete||'',customDim:{typeRecherche:window.typeRecherche||''},bloc_position:0{%pjstats.pos}}});"}">


import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Firefox()
driver.get("https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=m%C3%A9tallurgie&ou=Lyon")
elems = driver.find_element(By.XPATH, "//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))
driver.close()

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    tu n'expliques pas comment se comporte ton programme.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      en tous cas, ta ligne 10 me semble très bizarre: connais-tu la différence entre
      find_element()
      et
      find_elements()
      ?
      0
  2. Enygma
     
    Bonjour yg_be,

    Oui ne t'en fais pas je connais la différence, j'ai même réussi à résoudre le problème. Toutefois, j'aurais une autre question a te poser. Dans mon code, j'ai besoin de répeter l'action qui récupère les liens href pour chaque changement de pages. Cependant je galère pour récupérer le nombre de pages. J'ai d'ailleurs essayé la fonction "find_element_by_tag_name" ou encore la fonction "to_left_of", mais aucune n'ont fonctionné.
    Et je narrive également pas à faire la boucle en question pour relancer la fonction.
    Aurais-tu des solutions ?

    Voici le code :

    import selenium
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.keys import Keys
    import time
    
    driver = webdriver.Firefox()
    driver.get('https://www.pagesjaunes.fr/')
    inputElems = driver.find_elements( By.ID, "quoiqui" )
    for inputElem in inputElems:
      inputElem.send_keys('métallurgie')
      inputElem.send_keys(Keys.ENTER)
    time.sleep(4)
    inputElemz = driver.find_elements( By.ID, "ou" )
    for inputElemt in inputElemz:
      inputElemt.send_keys('Lyon')
      inputElemt.send_keys(Keys.ENTER)
    time.sleep(7)
    recherche = driver.find_element_by_xpath('//button[@type="submit"]')
    recherche.click()
    time.sleep(5)
    nombre_de_pages = driver.find_element_by_xpath("//strong")
    x = nombre_de_pages
    #faire une boucle pour répeter le changement de pages
    page_suivante = driver.find_element( By.ID, "pagination-next" )
    page_suivante.click()
    time.sleep(10)
    continue_link = driver.find_elements_by_tag_name('a')
    elems = driver.find_elements_by_xpath("//*[@href]")
    values = [""]
    for elem in elems:
        values.append(elem.get_attribute("href"))
    print(values)
    driver.close()
    


    et le code qui essaye de recupérer le nombre de pages avec l'erreur qu'il renvoie :

    driver = webdriver.Firefox()
    driver.get("https://www.pagesjaunes.fr/annuaire/chercherlespros?quoiqui=m%C3%A9tallurgie&ou=Lyon")
    time.sleep(10)
    boutton_suivant = driver.find_element_by_tag_name('a')
    boutton_suivant_id = driver.find_element(By.ID, "pagination-next")
    
    nombre_de_pages = driver.find_element(with_tag_name('strong').
                                          to_left_of(boutton_suivant_id))
    print(nombre_de_pages)
    driver.close()
    
    



    Traceback (most recent call last):
    File "C:/Users/dell/Documents/test2.py", line 26, in <module>
    nombre_de_pages = driver.find_element(with_tag_name('strong').
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 319, in execute
    response = self.command_executor.execute(driver_command, params)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 372, in execute
    data = utils.dump_json(params)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\utils.py", line 33, in dump_json
    return json.dumps(json_struct)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
    File "C:\Users\dell\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
    TypeError: Object of type RelativeBy is not JSON serializable
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      qu'appelles-tu un "changement de page"?
      pourquoi montres-tu un code complet, et puis quelques lignes de code?
      chez moi, le code s'exécute sans erreur.
      je me demande si tu as compris à quoi servait find_element().
      que penses-tu obtenir en faisant :
      nombre_de_pages = driver.find_element
      ?
      0
    2. Enygma > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Effectivement tu a raison le nombre de page n'est pas un élément donc on ne peux l'obtenir avec un
      driver.find_element
      , a moins que je me trompe.
      Mais dans se cas la comment faire ?
      Et se que j'entend par "changement de page" c'est
      Le passage du site internet (pages d'accueil ou autre) a une autre pages du site (boutique ou autre).
      Ex on est sur le site leboncoin dans la catégorie vélo et on arrive en bas de la page et on veux continuer de regarder les annonce donc on clique sur suivant et on arrive sur la page 2.
      Voila se que j'appelle "changement de page"
      Les lignes de code concerné sont les lignes 7 et 8 du deuxième script que j'ai envoyé.
      Et en faisant
      nombre_de_pages = driver.find_elements
      je pensais obtenir la balise "strong" qui contient le nombre de pages.

      J'espère que sa sera pas trop dure à comprendre :)
      Cdlt
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Enygma
       
      quel est le lien entre les deux codes?
      le second code est-il complet?
      tu as assez confus: tu montres un code qui analyse les pages jaunes, et tu donnes une explication avec un autre site, le bon coin.
      il serait utile que tu donnes un exemple de ce que tu veux récupérer comme information.
      si tu veux compter les pages, n'est-ce pas plus simple de compter le nombre de fois que tu as cliqué sur "suivant"?
      peut-être:
      elspan = driver.find_element(By.ID, "SEL-compteur")
      print(elspan.get_attribute("textContent"))

      en ajoutant peut-être ceci:
      elstrong = elspan.find_element_by_tag_name('strong')
      print(elspan.get_attribute("textContent"))
      0
    4. Enygma > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Merci du conseil tout fonctionne nickel maintenant !
      et non le deuxième code n'est pas complet c'était juste pour faire des tests.
      Toutefois serais tu comment faire exectuter a une boucle while des variable et une fonction.
      En gros pour que se sois plus compréhensible je voudrais réxecuter le code de la ligne 5 a la ligne 12 avec la boucle while mais je ne sais pas comment faire.

      deconte_de_page = 0
      while deconte_de_page < nombre_de_page:
        deconte_de_page += 1
      #faire une boucle pour répeter le changement de pages
      page_suivante = driver.find_element( By.ID, "pagination-next" )
      page_suivante.click()
      time.sleep(10)
      continue_link = driver.find_elements_by_tag_name('a')
      elems = driver.find_elements_by_xpath("//*[@href]")
      values = [""]
      for elem in elems:
          values.append(elem.get_attribute("href"))
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Enygma
       
      peut-être ainsi?
      decompte_de_page = 0
      values = [""]
      while decompte_de_page < nombre_de_page:
          decompte_de_page += 1
          #faire une boucle pour répeter le changement de pages
          page_suivante = driver.find_element_by_id("pagination-next")
          page_suivante.click()
          time.sleep(10)
          continue_link = driver.find_elements_by_tag_name('a')
          elems = driver.find_elements_by_xpath("//*[@href]")
          for elem in elems:
              values.append(elem.get_attribute("href"))
      
      0