1
votes

Impossible de saisir du texte avec Selenium

Je veux entrer le mot de passe dans la boîte avec Selenium mais il renvoie selenium.common.exceptions.WebDriverException: Message: élément non interactif

Mon script python:

from selenium import webdriver
browser = webdriver.Chrome(r'c:\chromedriver.exe')
url = 'https://creis.fang.com/'
browser.get(url)
browser.find_element_by_id('cnotp').send_keys('123456')

Si j'exécute le script, l'erreur ci-dessus apparaît. Cependant, si je tape ligne par ligne dans la console. Ensuite, il n'y a pas d'erreur.

Que dois-je faire?

Merci.


2 commentaires

Que se passe-t-il si vous attendez quelques millisecondes entre chaque paire de commandes (quelque chose comme implicitly_wait )?


J'ai ajouté time.sleep (5) avant et après browser.get (url) . Mais cela ne sert à rien.


3 Réponses :


0
votes

Vous devriez peut-être essayer de le faire "par étape". Sélectionnez d'abord l'élément, effacez sa valeur puis faites le truc send_key ...

element = browser.find_element_by_id('cnotp')
element.clear()
element.send_keys('123456')

J'espère que ça aide!


3 commentaires

Oh, j'ai vérifié le site Web et le champ que vous essayez de remplir semble être un champ de mot de passe. Il y a peut-être une protection sur ce champ spécifique qui ne vous permettra pas d'interagir aussi facilement que les autres champs le feraient.


Que dois-je faire alors?


Je ne sais pas mais si le site Web vous bloque à l'aide d'un script JS, vous n'avez rien à faire. Cela pourrait être une protection contre les bots. Mais je n'ai pas vérifié si c'est vrai, c'est juste une supposition.



0
votes

Wailt toujours chaque fois qu'il y a un changement d'URL.

element = WebDriverWait(driver, 60).until(
    EC.presence_of_element_located((By.ID, "cnotp"))
)

driver.execute_script("document.getElementById('cnotp').click()")
driver.execute_script("arguments[0].setAttribute('value', '123456')", element);

Si cela ne fonctionne pas, utilisez js_executor

from selenium import webdriver

driver = webdriver.Chrome()  # Change
driver.get('https://creis.fang.com/')

element = WebDriverWait(driver, 60).until(
    EC.presence_of_element_located((By.ID, "cnotp"))
)

element.clear()
element.send_keys("123456")


1 commentaires

J'ai essayé votre méthode mais je n'arrive toujours pas à saisir le texte.



0
votes

Pour envoyer une séquence de caractères dans le champ mot de passe en utilisant Selenium vous devez induire WebDriverWait pour element_to_be_clickable () et vous pouvez utiliser l'un des éléments suivants solutions:

  • Utilisation de CSS_SELECTOR :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Utilisation de XPATH :

    driver.get("https://creis.fang.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='loginipt fl' and @id='cnotp']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='loginipt fl' and @id='cnpassword']"))).send_keys("Chan")
    
  • Remarque : vous devez ajouter les importations suivantes:

    driver.get("https://creis.fang.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.loginipt.fl#cnotp"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.loginipt.fl#cnpassword"))).send_keys("Chan")
    
  • Instantané du navigateur:

 password


6 commentaires

Merci, DebanjanB. Pourquoi devrions-nous cliquer d'abord au lieu de saisir directement le texte?


@Chan C'était un cas unique que je n'avais jamais vu auparavant. En bref, les développeurs ont induit display: none sur le focus, vous devez donc envoyer du texte à l'élément d'ajustement.


DebanjanB, j'ai essayé de saisir du texte dans le champ suivant mais j'ai échoué.


WebDriverWait (navigateur, 10) .until (EC.element_to_be_clickable ((By.XPATH, "// input [@ id = 'cntempcode']"))). click () WebDriverWait (navigateur, 2) .until ( EC.element_to_be_clickable ((By.XPATH, "//input[@id='cntempcode'letter"))).send_keys("0000")


@Chan Observez correctement le HTML et suivez les modifications. Je pense qu'ils ont mis en œuvre la même logique pour chaque élément. Si vous ne pouvez toujours pas, augmentez un nouveau ticket, je l'examinerai une fois que je serai à la maison.


J'ai résolu le problème en exécutant directement WebDriverWait (navigateur, 20) .until (EC.element_to_be_clickable ((By.XPATH, "//input[@id='cntempcode'edral"))).send_keys("0000" )