D'accord, comme le titre l'indique, je ne peux pas faire fonctionner mon programme python, c'est un robot pour se connecter à instagram et il ne fera pas la journalisation en partie, j'ai essayé les deux en utilisant des chaînes d'action, et sans eux, voici mon code (python 3.6.1):
from time import sleep from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains browser = webdriver.Chrome() browser.get('https://www.instragram.com') login_elem = browser.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a') login_elem.click() user = browser.find_element_by_name("username") passw = browser.find_element_by_name('password') ActionChains(browser)\ .move_to_element(user).click()\ .send_keys('test')\ .move_to_element(passw).click()\ .send_keys('test')\ .perform() login_button = browser.find_element_by_class_name( '_0mzm- sqdOP L3NKy ') login_button.click()
Assez simple, non? et comme il n'y a pas d'erreurs de syntaxe, je suis vraiment confus sur ce qui ne va pas, car une fois que j'ai exécuté mon code, rien ne se passe après être allé à la page de connexion. (Ce qui signifie que cela ne fonctionne pas réellement sur les formulaires de nom d'utilisateur et de mot de passe)
Voici ce que dit le module:
Traceback (dernier appel en dernier): Fichier "C: \ Users \ ferna \ Desktop \ try browser script.py", ligne 17, dans .send_keys ('test') \ File "C: \ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ common \ action_chains.py", ligne 83, en perform action () Fichier "C: \ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ common \ action_chains.py", ligne 277, dans Command.MOVE_TO, {'element': to_element.id})) Fichier "C: \ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver. py ", ligne 321, en cours d'exécution self.error_handler.check_response (response) Fichier "C: \ Users \ ferna \ AppData \ Local \ Programs \ Python \ Python36-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py", ligne 242, dans check_response lever exception_class (message, écran, trace de pile) selenium.common.exceptions.StaleElementReferenceException: Message: référence d'élément périmé: l'élément n'est pas attaché au document de page (Informations de session: chrome = 71.0.3578.98) (Informations sur le pilote: chromedriver = 2,45,615291 (ec3682e3c9061c10f26ea9e5cdcf3c53f3f74387), plateforme = Windows NT 10.0.17134 x86_64)
Selenium ne s'est-il pas installé correctement? ou est l'erreur dans mon code? J'apprécierais vraiment toute aide que je peux obtenir. Btw: Je trouve les éléments du nom d'utilisateur et du mot de passe par nom et non par xpath, car Instagram change le xpath et le sélecteur à chaque fois que la page est ouverte, ce qui rend les éléments assez difficiles à trouver par d'autres moyens, du moins avec mon expérience très limitée.
Cette image montre à quoi ressemble le navigateur une fois le script testé:
3 Réponses :
Utilisez WebDriver Attendez:
user = browser.find_element_by_xpath("//input[@name='username']") user.send_keys('test') passw = browser.find_element_by_xpath("//input[@name='password']") passw.send_keys('test')'
ou
WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='username']"))).send_keys("test") WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='password']"))).send_keys("test")
J'espère que cela fonctionnera!
cela fonctionne avec mon code, si cela est utile, veuillez l'accepter.
1 ajouter un attendu_conditions attendues avant que la page de connexion réelle apparaisse
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() browser.get('https://www.instragram.com') wait = WebDriverWait(browser, 10) login_elem = browser.find_element_by_xpath( '//*[@id="react-root"]/section/main/article/div[2]/div[2]/p/a') second_page_flag = wait.until(EC.presence_of_element_located( (By.CLASS_NAME, "KPnG0"))) # util login page appear user = browser.find_element_by_name("username") passw = browser.find_element_by_name('password') ActionChains(browser)\ .move_to_element(user).click()\ .send_keys('test')\ .move_to_element(passw).click()\ .send_keys('test')\ .perform() login_button_ = browser.find_element_by_xpath( "//form[@class='HmktE']/div[3]/button") login_button_.click()
Merci beaucoup! J'ai simplement utilisé la commande sleep (2). Depuis que j'avais déjà importé le module de sommeil et j'avais oublié de l'utiliser.
Essayez ce code.Cela a fonctionné pour moi.Aucune classe d'action requise.J'espère que cela vous aidera.Tout problème, veuillez répondre.Vous devez télécharger le dernier pilote Chrome, ChromeDriver 2.45, depuis http://chromedriver.chromium.org/downloads
from selenium import webdriver import time driver=webdriver.Chrome("Path of the chromdriver location" + "chromedriver.exe" ) driver.get("https://www.instagram.com/accounts/login/?source=auth_switcher") user=driver.find_element_by_name("username") user.send_keys("kajal") passwd=driver.find_element_by_name("password") passwd.send_keys("1234") time.sleep(1) button=driver.find_element_by_xpath(".//*[@id='react-root']/section/main/div/article/div/div[1]/div/form/div[3]/button") button.click()
Merci !, le problème était en effet que je n'avais pas laissé suffisamment de temps à la page pour se charger. Je l'ai corrigé avec une simple commande sleep (2).