[解決済み] [Solved] org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard: FacebookのFirstNameフィールドにテキストを送信する際に発生する例外です。
質問内容
エラーは :
Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: Element <div id="u_0_b" class="_5dbb"> is not reachable by keyboard
コードがあります。
System.setProperty("webdriver.gecko.driver","//Users//rozali//Documents//Selenium//geckodriver");
WebDriver driver = new FirefoxDriver();
driver.get("http://www.facebook.com");
driver.manage().window().maximize();
//entering first name
driver.findElement(By.id("u_0_b")).click();
driver.findElement(By.id("u_0_b")).sendKeys("testing it ");
//DOB
Select sel1 = new Select(driver.findElement(By.xpath(".//*[@id='month']")));
sel1.selectByIndex(4);
Select sel2 = new Select(driver.findElement(By.xpath(".//*[@id='day']")));
sel2.selectByValue("6");
Select sel3 = new Select(driver.findElement(By.xpath(".//*[@id='year']")));
sel3.selectByValue("2013");
//clicking sign up
driver.findElement(By.id("u_0_t")).click();
解決方法は?
ElementNotInteractableException: キーボードで要素に到達できない
Element is not reachable by keyboard
は、キーボードを使ってその要素に到達できない、つまり、物理的にその要素に触れることができないことを意味します。
理由
エラーの背景には、複数の理由が考えられます キーボードで要素に到達できない のいずれかが考えられます。
-
この要素は
隠す
最近のJavaScript中心のUIスタイルでは、醜い生のHTML入力フィールドは常に非表示にされるからです。そのため
hidden
属性は、以下のどちらかの方法で実装することができました。- A 一時的なオーバーレイ 目的の要素の上に他の要素の
- A パーマネントオーバーレイ 目的の要素の上に他の要素の
-
属性の有無 例
class="ng-hide"
,style="display: none"
など -
ベストプラクティスとして、文字列を送信する際に
click()
またはsendKeys()
任意の<p>
または<div>
タグの代わりにclick()
を指定します。<input>
タグに続いて ウェブドライバの公式ロケーターストラテジー .
解決方法
この問題に対処するためには、さまざまなアプローチがあります。
-
の場合 一時的なオーバーレイ 使用 WebDriverWait との併用 期待される条件 を指定します。 要素を表示/クリックできるようにする を以下のように設定します。
import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.nsg-button"))).click();
-
の場合 パーマネントオーバーレイ 使用
executeScript()
メソッド JavascriptExecutor インターフェイスを次のように使用します。import org.openqa.selenium.JavascriptExecutor; String inputText = "Rozmeen"; WebElement myElement = driver.findElement(By.id("u_0_b")); String js = "arguments[0].setAttribute('value','"+inputText+"')" ((JavascriptExecutor) driver).executeScript(js, myElement);
で詳しく説明されています。 JSでテキストを入力するのですが、1つのテキストボックスにテキストを入力すると、すでに入力されている値が削除されてしまうのです。
-
属性がある場合 (例)
class="ng-hide"
,style="display: none"
などを使用します。executeScript()
メソッド JavascriptExecutor インターフェイスを使用して、編集およびリセットすることができます。style="display: none"
属性からstyle="display: block"
を以下のように設定します。import org.openqa.selenium.JavascriptExecutor; ((JavascriptExecutor) driver).executeScript("document.getElementById('ID').style.display='block';");
で詳しく説明されています。 非表示のテキストエリア要素に入力できない
参考文献
- input[type=file] の場合、display=none のときでも sendKeys を許可する必要があります。
- キーボードインタラクタビリティ検査におけるファイルアップロードコントロールの特殊化
- 要素がキーボードで到達できない
- display: noneの入力フィールドが対話可能でない?
この特定の問題
を調べると
HTML
の
フェイスブック
ログインページでは、アプリケーションに
リアクト
ネイティブ
要素で構成されています。つまり、かつて
id
として
u_0_b
によって表現されるとは限りません。
id
として
u_0_b
を使用すると、次に実行するときに、あなたのシステムで したがって、私たちは
ダイナミックロケータ戦略
. 次のコードブロックを使って、目的のステップを実行することができます。
-
コードブロック :
System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("https://www.facebook.com"); driver.findElement(By.xpath("//input[@name='firstname' and contains(@class,'inputtext')]")).sendKeys("testing it "); //DOB Select sel1 = new Select(driver.findElement(By.xpath(".//*[@id='month']"))); sel1.selectByIndex(4); Select sel2 = new Select(driver.findElement(By.xpath(".//*[@id='day']"))); sel2.selectByValue("6"); Select sel3 = new Select(driver.findElement(By.xpath(".//*[@id='year']"))); sel3.selectByValue("2013"); //clicking sign up driver.findElement(By.xpath("//button[@name='websubmit' and contains(.,'Sign Up')]")).click();
-
ブラウザクライアント:
更新情報
エラーに対応しました。
org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard
Firefoxの機能により、より簡単になりました。 moz:webdriverClick
moz:webdriverClick()
スルー
webdriverClick()
を使用すると、クリックやキー入力の際にどのようなインタラクティビティチェックを行うかをブール値で指定できます。例えば
Firefoxen
以前は
v58.0
の古いバージョンからインポートされたレガシーコードがあります。
FirefoxDriver
が使用されていました。が利用できるようになったことで
Firefox v58
が要求するインタラクティビティチェックは
WebDriver仕様
はデフォルトで有効になっています。これは geckodriver が、クリックしたときに要素が他の要素によって隠されていないかどうか、そしてキーを送信するときに要素がフォーカス可能かどうかを追加でチェックすることを意味します。この動作の変更のため、いくつかの余分なエラーが返される可能性があることを私たちは認識しています。ほとんどの場合、問題のテストは新しいチェックに適合するように更新されなければならないかもしれません。
WebDriverの適合性チェックを一時的に無効にするには、次のようにします。
false
をこのケイパビリティの値として使用します。
備考 : この機能は一時的にしか存在せず、対話性チェックが安定した時点で削除される予定です。
関連
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】module.exports "モジュールが定義されていません"
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。