J'ai créé un script en python utilisant du sélénium pour cliquer sur un bouton like disponible dans un page Web . J'ai utilisé xpath pour localiser ce bouton et je pense que je l'ai utilisé correctement. Cependant, le script ne semble pas trouver ce bouton et, par conséquent, il renvoie une erreur TimeoutException
pointant sur la ligne même contenant le xpath.
Comme il n'est pas possible d'appuyer sur ce bouton similaire sans se connecter, je m'attends à ce que le script connecte le code HTML correspondant à ce bouton afin que je comprenne que je puisse le localiser correctement.
J'ai essayé avec:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC link = "https://www.instagram.com/p/CBi_eIuAwbG/" with webdriver.Chrome() as driver: wait = WebDriverWait(driver,10) driver.get(link) item = wait.until(EC.visibility_of_element_located((By.XPATH,"//button[./svg[@aria-label='Like']]"))) print(item.get_attribute("innerHTML"))
Comment puis-je localiser ce bouton
like
visible commesymbole du cœur
en utilisant du sélénium?
3 Réponses :
Essayez d'utiliser la méthode .find_element_by_xpath (xPath)
(Utilise un xpath complet):
likeXPATH = "/html/body/div[1]/section/main/div/div[1]/article/div[2]/section[1]/span[1]/button" likeElement = driver.find_element_by_xpath(likeXPATH) likeElement.click()
Désolé @Xiddoc, je ne suis pas après xpath absolu
que je pourrais copier directement tout en inspectant l'élément. J'essaye d'en créer un relatif. Merci.
Vous pouvez le faire comme ceci
likeSVG = driver.find_element(By.CSS_SELECTOR, 'svg[aria-label="Like"]') likeBtn = likeSVG.find_element(By.XPATH, './..') likeBtn.click()
likeBtn
est égal au parent du div likeSVG
car vous pouvez utiliser XPATH similaire pour classer les commandes de navigation dans une CLI.
Votre solution fonctionne @Lucan. Je vais sûrement y aller à moins que j'obtienne une solution liée à xpath. Cela mérite sûrement un plus. Merci.
Cliquer sur le bouton Like
induire WebDriverWait
() et attendre visibilité_of_element_located
() et sous xpath
.
Ensuite, faites défiler l'élément dans la vue et cliquez.
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver.get("https://www.instagram.com/p/CBi_eIuAwbG/") element=WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//button[.//*[name()='svg' and @aria-label='Like']]"))) element.location_once_scrolled_into_view element.click()
Notez la balise svg