Cum se rezolvă excepția „element not interactable”? (Programare, Python, Python 3.X, Selenium, Selenium Webdriver, Webdriver)

Rolodophone a intrebat.
a intrebat.

Știu că acest lucru a fost întrebat de multe ori înainte, dar cum se rezolvă excepția „element not interactable”?

Sunt nou în Selenium, așa că scuzați-mă dacă înțeleg ceva greșit.

Aici este codul meu:

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

Aici este HTML:

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

Și aici este mesajul de eroare:

selenium.common.exceptions.ElementNotInteractableException: Message: 

După este spune mesajul nu este literalmente nimic.

Am petrecut o mulțime de timp căutând pe web, nu am găsit nimic care să îmi rezolve problema. Aș aprecia foarte mult un răspuns.

Mulțumesc în avans.

Editați: Schimbat „w” în driver, astfel încât să fie mai ușor de citit

Actualizare: Tocmai mi-am dat seama că am găsit HTML-ul butonului greșit! HTML-ul adevărat al butonului este mai jos:

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

De asemenea, am folosit răspunsurile și comentariile și mi-am editat codul astfel încât să arate așa:

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

Și acum primesc o nouă eroare:

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

Eroarea se întâmplă în linia 1: button = driver.find_element_by_css_selector("button.dismiss")

Notă: Apreciez foarte mult ajutorul care a fost dat, mulțumesc

Comentarii

  • Sunteți sigur că acest buton este singurul element cu "infoDismiss" nume de clasă? Încercați button = w.find_element_by_css_selector("button.dismiss.infoDismiss") –  > Por Andersson.
  • Nu, tocmai am verificat și cu siguranță există un singur element –  > Por Rolodophone.
11 răspunsuri
EyuelDK

O posibilitate este ca elementul să fie momentan unclickabil pentru că nu este vizibil. Motivele pot fi că un alt element îl acoperă sau că nu este la vedere, adică se află în afara zonei vizualizabile în prezent.

Încercați acest lucru

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()

Comentarii

  • Am încercat asta, dar tot nu pare să se facă clic pe el. Nu face clic pe el, dar nici nu generează o eroare. –  > Por Rolodophone.
  • Îți sugerez să verifici dacă se face efectiv clic pe ea. Adăugați niște ascultători de evenimente de clic pe element pentru a vedea dacă se efectuează un clic în loc să inspectați vizual un clic. –  > Por EyuelDK.
  • Rolodophone, în situația pe care o descrii, te rog să încerci ActionChains(driver).move_to_element(button).click(button).perform(), adică să adaugi „.perform()”. –  > Por apascualb.
  • @apascualb a făcut corecția, mulțumesc pentru atenționare. –  > Por EyuelDK.
  • Mă confrunt cu o problemă similară, întrebarea mea ridicată aici: stackoverflow.com/questions/63316796/… . button=driver.find_element_by_xpath(„//*[@id=’submitMe’]]”) driver.implicitly_wait(10) ActionChains(driver).move_to_element(button).click(button).perform() Primesc mesajul de eroare Message: javascript error: Nu s-a reușit să se execute „elementsFromPoint” pe „Document”: Valoarea dublă furnizată este nedefinită. –  > Por Invictus.
romin parvardeh

Eroarea „Mesaj: Element not interactable” apare de cele mai multe ori atunci când elementul dvs. nu poate fi apăsat sau nu este încă vizibil, iar dvs. ar trebui să faceți clic sau să alegeți un alt element înaintea lui. Apoi, elementul dvs. va fi afișat și îl puteți modifica.

Puteți verifica dacă elementul dvs. este vizibil sau nu apelând is_displayed() în felul următor:

print("Element is visible? " + str(element_name.is_displayed()))

Adam Polak

Tocmai m-am confruntat cu o problemă similară și am reușit să o rezolv așteptând până când butonul a fost „clickabil”.

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

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome('./chromedriver', options=chrome_options)

browser.get(('YOURWEBSITEHERE.COM'))

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

Comentarii

  • Aș numi acest lucru o „rezolvare” și nu o soluție. Dar, ei bine… 😀 –  > Por zypro.
  • Unde se află variabila browser vine de la? –  > Por Douy789.
  • @Douy789 Am editat comentariul pentru a răspunde la întrebarea dumneavoastră –  > Por Adam Polak.
  • @zypro Nu cred că este o „soluție de rezolvare”, aceasta așteaptă până când butonul este interacționabil (clickabil), care este problema în situația postată 🙂 –  > Por Adam Polak.
robbrit

Pentru cei care descoperă acest lucru acum și răspunsurile de mai sus nu au funcționat, problema pe care am avut-o a fost că ecranul nu era suficient de mare. Am adăugat acest lucru atunci când mi-am inițializat ChromeDriver-ul și a rezolvat problema:

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

EyuelDK

Am găsit o soluție ani mai târziu, după ce am întâlnit din nou aceeași problemă – imposibilitatea de a face clic pe un element, chiar dacă ar trebui să fie clickabil. Soluția este de a prinde ElementNotInteractable excepție și să încercăm să executăm un script pentru a face clic pe element.

Exemplu în 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);
        }
    }
}

Sugat Shivsharan

Am constatat că utilizarea Thread.sleep(milliseconds) mă ajută aproape tot timpul. Este nevoie de timp pentru ca elementul să se încarce, prin urmare nu este interactiv. Așa că am pus Thread.sleep() după selectarea fiecărei valori. Până acum, acest lucru m-a ajutat să evit eroarea.

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();}     

Daniel Moura

Știu că poate ai găsit răspunsul , dar dacă ar fi fost oameni care îl caută în viitor, poate că ar fi găsit soluția.OK, direct la subiect ,am avut o problemă similară cu aceasta. Atunci când de obicei începi să folosești această bibliotecă (selenium webdriver ) un lucru care te poate enerva este să nu știi cum să folosești biblioteca ” import time ” care este foarte importantă pentru a sparge acest tip de ” barieră „.

Urmați fragmentul de cod de mai jos:

Ei bine, soluția mea a fost simplă și obiectivă. Amintindu-vă că trebuie să așteptați ca elementul să fie clickabil (interacționabil), adică să folosiți mai întâi tehnica de căutare a elementului prin xpath.

buttonNoInteractable = browser.find_element_by_xpath('/html/body/div[2]/div/div/div[2]/div/div/div[2]/div/table[2]/thead/tr/th[2]/input')

buttonNoIteractable.click() time.sleep(10)

Sau poate fi după numele clasei. Folosiți cantitatea de secunde de care aveți nevoie, dacă aveți o conexiune lentă, puneți-o în 30 de secunde, sau dacă este rapidă, câteva secunde mai puțin este suficient, de exemplu „time.sleep (10)”.

După cum am spus, pentru mine această soluție a funcționat foarte bine folosind python.

send = browser.find_element_by_name('stacks') send.click()

Миша Турецкий

Va fi mai bine să folosiți xpath

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

Comentarii

  • De ce credeți acest lucru? –  > Por vitaliis.
Ganesh Pai

Pentru codul html:

test.html

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

codul python de mai jos a funcționat pentru mine. Puteți încerca.

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()

Comentarii

  • Utilizarea sleep() este considerată o practică proastă în automatizarea testelor. –  > Por vitaliis.
  • Acest lucru nu ține cont de niciun fel de problemă în care elementul nu ar fi încă interacționabil, cum ar fi o suprapunere de încărcare. Acest răspuns nu este util. –  > Por NegativeFriction.
GHULAM NABI

utilizați id-ul elementului, cu excepția x_path.It va funcționa 100%.

Pete

Este demn de remarcat faptul că există o funcție sleep încorporată în Selenium.

driver.implicitly_wait(5)