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.
3 Réponses :
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!
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.
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")
J'ai essayé votre méthode mais je n'arrive toujours pas à saisir le texte.
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:
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" )
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.