1
votes

ElementNotInteractableException: Message: L'élément n'a pas pu être défilé dans la vue en essayant de cliquer sur un élément à l'aide de Selenium et Python

J'ai ce code:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <button class="btn" name="_eventId_confirmed"> could not be scrolled into view

comme vous pouvez le voir, je change d'abord de fenêtre puis je vérifie un élément, récupère cet élément (un bouton) et enfin j'essaye de cliquer sur ledit bouton. Cela fonctionne peut-être 2 fois sur 3, mais cela échoue très souvent avec ce message d'erreur

driver.switch_to.window(window_after)

try:
    myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.NAME, '_eventId_confirmed')))
    print ("Page 2 is ready!")
except TimeoutException:
    print ("Loading took too much time!")

btn = driver.find_element_by_name('_eventId_confirmed')

btn.click()

Lorsque je regarde visuellement le flux lorsqu'il est en cours d'exécution, tout semble bien (mon premier je suppose que le commutateur de fenêtre ne fonctionnait pas comme prévu) et le navigateur se retrouve dans l'état attendu où je peux cliquer manuellement sur ce bouton. Fait intéressant, il n'y a pas de délai d'expiration ou similaire lorsque cette erreur se produit, cela se produit instantanément pendant l'exécution.

Des idées de ce qui se passe ici?


3 commentaires

Avez-vous essayé l'option javascript scrollIntoView ? driver.execute_script ("arguments [0] .scrollIntoView;", btn) avant de cliquer.


désolé, j'ai manqué () . Voici le bon code. driver.execute_script ("arguments [0] .scrollIntoView ();", btn)


Ont ajouté la réponse, faites-moi savoir si cela aide


3 Réponses :


1
votes

Voici les 2 options.

Utilisation de la méthode du sélénium location_once_scrolled_into_view :

url = "https://stackoverflow.com/questions/55228646/python-selenium-cant-sometimes-scroll-element-into-view/55228932?    noredirect=1#comment97192621_55228932"
driver.get(url)
element = driver.find_element_by_xpath("//a[.='Contact Us']")
element.location_once_scrolled_into_view
time.sleep(1)
driver.find_element_by_xpath("//p[.='active']").location_once_scrolled_into_view
driver.execute_script("arguments[0].scrollIntoView();",element)

Utilisation Javascript:

driver.execute_script("arguments[0].scrollIntoView();",btn)

Exemple de code:

btn.location_once_scrolled_into_view


4 commentaires

Merci. Je pense que je comprends l'extrait de code JS, mais l'exemple de Selenium semble très contre-intuitif?


Hmm, IntelliJ / PyCharm affiche un avertissement La déclaration semble n'avoir aucun effet moins ... (⌘F1) Info d'inspection: Cette inspection détecte les déclarations sans aucun effet. ?


Je ne sais pas pourquoi vous recevez ce message. Je suis capable d'exécuter l'exemple de script sans problème. Ajouté le script dans la réponse ci-dessus pour votre référence.


Je recommanderais fortement la deuxième solution. Voir le pour le premier. D'une part, la première phrase du commentaire décrivant la méthode se lit comme suit: "CETTE PROPRIÉTÉ PEUT CHANGER SANS AVERTISSEMENT." Ils ne fournissent pas plus de détails que cela et je ne sais pas exactement à quels changements ils font référence, mais cela ne sonne pas bien. Deuxièmement, cette fonction ne fait qu'exécuter son propre Javascript (plus compliqué).



1
votes

Comme votre dernière étape consiste à appeler click () sur l'élément souhaité, au lieu d'utiliser le conditions_attendues comme presence_of_element_located () dont vous avez besoin () pour utiliser element_to_be_clickable () comme suit:

try:
    myElem = WebDriverWait(driver, delay).until(EC.element_to_be_clickable((By.NAME, '_eventId_confirmed')))


7 commentaires

Juste un doute, lorsque l'élément n'est pas cliquable après l'ouverture de la page, la condition element_to_be_clickable aurait-elle un sens? Parce qu'il ne serait jamais cliquable si nous ne le faisons pas défiler dans la vue et la condition element_to_be_clickable pourrait donner une exception de délai d'expiration.


Eh bien, element_to_be_clickable () fait défiler par défaut avec une certaine limite. Faites-moi savoir le statut d'exécution.


Je ne peux pas vérifier le site Web de l'OP mais j'ai également eu une exception ElementNotClickable dans le passé et je l'ai résolu en utilisant javascript click. Pas très sûr que le sélénium attend que l'élément soit cliquable ferait défiler l'élément.


@SameerArora OP utilise les clients Python , donc sauter tout de suite pour utiliser javascript click () serait contre toutes les meilleures pratiques. Vous devez explorer correctement les conditions_attendues . Si vous n'êtes pas très sûr que l'attente de sélénium pour que l'élément soit cliquable fasse défiler l'élément , vous devez lire à nouveau correctement la documentation.


Oui, j'ai vérifié la documentation officielle du sélénium et j'ai également vérifié SO. Et là aussi il est écrit que soit il retournera true , soit il lancera TimeoutException. Références: seleniumhq.org/docs/… et stackoverflow.com/ questions / 38327049 /… et c'est pourquoi je vous ai demandé votre processus de réflexion derrière cela.


Par documentation , je voulais dire la documentation de l'API et le code source et rien de moins.


Oui, étudié le code maintenant, il n'y a pas de défilement impliqué dans la méthode. La méthode et ses méthodes suivantes vérifient sa visibilité en utilisant isDisplayed ()



2
votes

Ce problème survient généralement lorsque l'élément sur lequel vous essayez de cliquer est présent sur la page mais qu'il n'est pas entièrement visible et que le point où le sélénium tente de cliquer n'est pas visible.
Dans ce cas, vous pouvez utiliser javascript pour cliquer sur l'élément, qui opère en fait directement sur la structure html de la page.
Vous pouvez l'utiliser comme:

element = driver.find_element_by_name("_eventId_confirmed")
driver.execute_script("arguments[0].click();", element)


0 commentaires