2
votes

Script de connexion Instagram avec sélénium, impossible d'exécuter .send_keys ('test')

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é: entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

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!


0 commentaires

1
votes

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()


1 commentaires

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.



0
votes

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()


1 commentaires

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).