私はこれが何度も尋ねられていることを知っていますが、どのように「要素が対話可能でない」例外を回避するのですか
私は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")
注:与えられた助けに感謝します、ありがとう
可能性としては、その要素は表示されていないため、クリックできない可能性があります。この理由は、別の要素がそれを覆っているか、表示されていない、つまり現在表示可能な領域の外にある可能性があります。
これを試して
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()
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()
同じ問題に再び遭遇した後、数年後に回避策を発見しました-要素はクリック可能であってもクリックできません。解決策は、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);
}
}
}
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()
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();}