web-dev-qa-db-ja.com

「要素が相互作用しない」例外を修正するにはどうすればよいですか?

私はこれが何度も尋ねられていることを知っていますが、どのように「要素が対話可能でない」例外を回避するのですか

私はSeleniumが初めてなので、何かおかしくなった場合はごめんなさい。

ここに私のコードがあります:

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

HTMLは次のとおりです。

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

エラーメッセージは次のとおりです。

_Selenium.common.exceptions.ElementNotInteractableException: Message: 
_

メッセージは文字通り何もないということです。

私は自分の問題を解決するものを見つけるのではなく、ウェブの検索に多くの時間を費やしました。答えを本当に感謝します。

前もって感謝します。

編集:「w」をドライバーに変更して読みやすくしました

更新:間違ったボタンのHTMLを見つけたことがわかりました!実際のボタンのHTMLは次のとおりです。

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

また、回答とコメントを使用して、コードを次のように編集しました。

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

そして今、私は新しいエラーを受け取ります:

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

エラーは1行目で発生します:button = driver.find_element_by_css_selector("button.dismiss")

注:与えられた助けに感謝します、ありがとう

5
Rolodophone

可能性としては、その要素は表示されていないため、クリックできない可能性があります。この理由は、別の要素がそれを覆っているか、表示されていない、つまり現在表示可能な領域の外にある可能性があります。

これを試して

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

Xpathを使用する方が良いでしょう

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

私はちょうど同様の問題に遭遇し、ボタンが「クリック可能」になるまで待つことでそれを修正することができました。

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()
0
Adam Polak

同じ問題に再び遭遇した後、数年後に回避策を発見しました-要素はクリック可能であってもクリックできません。解決策は、ElementNotInteractable例外をキャッチし、スクリプトを実行して要素をクリックすることです。

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

HTMLコードの場合:

test.html

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

以下のpythonコードは私のために働いた。あなたはそれを試すことができます。

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

Thread.sleep(milliseconds)を使用すると、ほとんどの場合に役立つことがわかりました。要素のロードには時間がかかるため、相互作用しません。各値を選択した後、Thread.sleep()を配置します。これまでのところ、これはエラーを回避するのに役立ちました。

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