web-dev-qa-db-fra.com

Comment corrigez-vous l'exception "élément non interactif"?

Je sais que cela a été demandé plusieurs fois auparavant, mais comment contourner l'exception "élément non interactif"?

Je suis nouveau sur Selenium alors excusez-moi si je me trompe.

Voici mon code:

button = driver.find_element_by_class_name(u"infoDismiss")
type(button)
button.click()
driver.implicitly_wait(10)

Voici le HTML:

<button class="dismiss infoDismiss">
    <string for="inplay_button_dismiss">Dismiss</string>
</button>

Et voici le message d'erreur:

Selenium.common.exceptions.ElementNotInteractableException: Message: 

Après son message, il n'y a littéralement rien.

J'ai passé beaucoup de temps à chercher sur le Web, sans rien trouver qui résout mon problème. J'apprécierais vraiment une réponse.

Merci d'avance.

Edit: Changement de "w" au pilote pour qu'il soit plus facile à lire

pdate: Je viens de réaliser que j'ai trouvé le code HTML du mauvais bouton! Le vrai bouton HTML est ci-dessous:

<button class="dismiss">
    <string for="exit">Dismiss</string>
</button>

J'ai également utilisé les réponses et les commentaires et modifié mon code pour qu'il ressemble à ceci:

button = driver.find_element_by_css_selector("button.dismiss")
w.implicitly_wait(10)
ActionChains(w).move_to_element(button).click(button)

Et maintenant, je reçois une nouvelle erreur:

Selenium.common.exceptions.WebDriverException: Message: Tried to run command without establishing a connection

L'erreur se produit à la ligne 1: button = driver.find_element_by_css_selector("button.dismiss")

Note: J'apprécie vraiment l'aide qui a été apportée, merci

7
Rolodophone

Il est possible que l'élément ne soit actuellement pas cliquable car il n'est pas visible. Cela peut être dû au fait qu'un autre élément le couvre ou qu'il n'est pas visible, c'est-à-dire qu'il se trouve en dehors de la zone actuellement visible.

Essaye ça

from Selenium.webdriver.common.action_chains import ActionChains

button = driver.find_element_by_class_name(u"infoDismiss")
driver.implicitly_wait(10)
ActionChains(driver).move_to_element(button).click(button).perform()
7
EyuelDK

Je viens de rencontrer un problème similaire et j'ai pu le résoudre en attendant que le bouton soit "cliquable".

from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC

button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.dismiss')))
button.click()
1
Adam Polak

Il sera préférable d'utiliser xpath

from Selenium import webdriver
driver.get('www.example.com')
button = driver.find_element_by_xpath('xpath')
button.click()

Pour ceux qui découvraient cela maintenant et les réponses ci-dessus ne fonctionnaient pas, le problème que j'avais était que l'écran n'était pas assez grand. J'ai ajouté cela lors de l'initialisation de mon ChromeDriver, et cela a résolu le problème:

options.add_argument("window-size=1200x600")
0
robbrit

Trouvé une solution de contournement des années plus tard après avoir rencontré à nouveau le même problème - impossible de cliquer sur l'élément même s'il DEVRAIT être cliquable. La solution est d'attraper l'exception ElementNotInteractable et d'essayer d'exécuter un script pour cliquer sur l'élément.

Exemple en TypeScript

async clickElement(element: WebElement) {
    try {
        return await element.click();
    } catch (error) {
        if (error.name == 'ElementNotInteractableError') {
            return await this.driver.executeScript((element: WebElement) => {
                element.click();
            }, element);
        }
    }
}
0
EyuelDK

Pour le code html:

test.html

<button class="dismiss"  onclick="alert('hello')">
    <string for="exit">Dismiss</string>
</button>

ci-dessous python a fonctionné pour moi. Vous pouvez simplement l'essayer.

from Selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://localhost/gp/test.html")
button = driver.find_element_by_class_name("dismiss")
button.click()
time.sleep(5)
driver.quit()
0
Ganesh Pai

J'ai constaté que l'utilisation de Thread.sleep (millisecondes) m'aide presque tout le temps. Il faut du temps pour que l'élément se charge, il n'est donc pas interactif. J'ai donc mis Thread.sleep () après avoir sélectionné chaque valeur. Jusqu'à présent, cela m'a aidé à éviter l'erreur.

try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}

        Select nationalityDropdown=new Select(driver.findElement(By.id("ContentPlaceHolderMain_ddlNationality")));

        nationalityDropdown.selectByValue("Indian");

        try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}     
0
Sugat Shivsharan

tilisez l'id de l'élément sauf x_path. Cela fonctionnera à 100%

0
GHULAM NABI