webentwicklung-frage-antwort-db.com.de

Wie behebt man die Ausnahme "Element nicht interagierbar"?

Ich weiß, dass dies schon oft gefragt wurde, aber wie kommt man um die Ausnahme "Element nicht interagierbar" herum?

Ich bin neu bei Selen. Entschuldigen Sie, wenn ich etwas falsch mache.

Hier ist mein Code:

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

Hier ist der HTML:

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

Und hier ist die Fehlermeldung:

Selenium.common.exceptions.ElementNotInteractableException: Message: 

Nach dieser Nachricht gibt es buchstäblich nichts.

Ich habe viel Zeit damit verbracht, im Internet zu suchen und nichts zu finden, was mein Problem löst. Ich würde mich sehr über eine Antwort freuen.

Danke im Voraus.

Edit : "w" wurde in "Treiber" geändert, damit es leichter zu lesen ist

pdate : Ich habe gerade festgestellt, dass ich den HTML-Code der falschen Schaltfläche gefunden habe! Der echte HTML-Button ist unten:

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

Außerdem habe ich die Antworten und Kommentare verwendet und meinen Code so bearbeitet, dass er so aussieht:

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

Und jetzt bekomme ich einen neuen Fehler:

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

Der Fehler tritt in Zeile 1 auf: button = driver.find_element_by_css_selector("button.dismiss")

Anmerkung : Ich schätze die Hilfe sehr, danke

7
Rolodophone

Möglicherweise ist das Element derzeit nicht anklickbar, da es nicht sichtbar ist. Gründe hierfür können sein, dass ein anderes Element es verdeckt oder nicht sichtbar ist, d. H. Es befindet sich außerhalb des aktuell sichtbaren Bereichs.

Versuche dies

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

Ich bin gerade auf ein ähnliches Problem gestoßen und konnte es beheben, indem ich wartete, bis die Schaltfläche "anklickbar" war.

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

Es ist besser, xpath zu verwenden

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

Für diejenigen, die dies jetzt entdeckten und die obigen Antworten nicht funktionierten, war das Problem, das ich hatte, dass der Bildschirm nicht groß genug war. Ich habe dies beim Initialisieren meines ChromeDriver hinzugefügt und das Problem behoben:

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

Ich habe Jahre später eine Problemumgehung gefunden, nachdem ich erneut auf dasselbe Problem gestoßen bin. Ich kann nicht auf ein Element klicken, obwohl es anklickbar sein SOLLTE. Die Lösung besteht darin, die Ausnahme ElementNotInteractable abzufangen und zu versuchen, ein Skript auszuführen, um auf das Element zu klicken.

Beispiel in 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

Für den HTML-Code:

test.html

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

der folgende python Code hat bei mir funktioniert. Sie können es einfach versuchen.

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

Ich habe festgestellt, dass die Verwendung von Thread.sleep (Millisekunden) fast immer für mich hilft. Das Laden des Elements dauert einige Zeit, daher ist es nicht interaktiv. Also habe ich Thread.sleep () gesetzt, nachdem ich jeden Wert ausgewählt habe. Bisher hat mir dies geholfen, den Fehler zu vermeiden.

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

benutze die ID des Elements außer x_path.It funktioniert 100%

0
GHULAM NABI