J'essaie de renseigner des champs de formulaire via Selenium en python:
from Selenium import webdriver
from Selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get("http://www.miralinks.ru/")
driver.implicitly_wait(30)
login = driver.find_element_by_css_selector('input[placeholder="Логин"]')
hov = ActionChains(driver).move_to_element(login)
hov.perform()
login.clear()
login.send_keys("login")
pwd = driver.find_element_by_css_selector('input[placeholder="Пароль"]')
pwd.clear()
pwd.send_keys("pass")
mais cela échoue avec une exception:
L'élément n'est pas interactif et ne peut pas être manipulé
Pourquoi cela se produit-il et faut-il résoudre ce problème?
webdriver __version__ = '2.45.0'
.
Le problème est qu’il existe deux autres éléments input
avec placeholder="Логин"
et placeholder="Пароль"
qui sont invisibles. Faites vos sélecteurs CSS spécifiques au formulaire de connexion :
login = driver.find_element_by_css_selector('form#loginForm input[placeholder="Логин"]')
pwd = driver.find_element_by_css_selector('form#loginForm input[placeholder="Пароль"')
J'ai eu ce problème aussi, mais dans mon cas, la cause était légèrement différente. Je devais spécifier la taille de la fenêtre avant de naviguer vers la page:
driver.Manage().Window.Size = new Size(width, height);
Cela est dû au fait que la taille de la fenêtre par défaut rendait la page à une largeur où une requête de média avait caché l'élément, ce qui a provoqué le "L'élément n'est actuellement pas interactif et ne peut pas être manipulé" error.
Utilisez une fonction d'attente avant l'élément qui a généré l'erreur.
Le WebDriver tente d'interagir avec un élément qui n'est pas complètement chargé.
Pour moi, le problème était dû au fait qu'un autre élément recouvrait la zone de saisie. Dans mon cas, il y avait une étiquette fantaisie à la place d'un espace réservé qui s'anime vers le haut au clic.
L'astuce consistait à cliquer d'abord sur l'étiquette pour déclencher l'animation, puis remplir le champ de saisie.
Parfois, il faut du temps pour charger la page. Vous pouvez ajouter une instruction wait. Essayez d’utiliser "Thread.sleep (3000)".
Ici, les sélecteurs xpath fonctionnent.
login = driver.find_element_by_xpath('//*[@id=\'loginForm\']/div/div[1]/input')
pwd = driver.find_element_by_xpath('//*[@id=\'loginForm\']/div/div[2]/input')
ou même mais sélecteur css
login = driver.find_element_by_css_selector('form#loginForm [name="data[User][login]"]')
pwd = driver.find_element_by_css_selector('form#loginForm [name="data[User][password]"]')