[解決済み] ランダム "要素が DOM に添付されなくなりました" StaleElementReferenceException
質問
私だけならいいのですが、Selenium Webdriverは完全に悪夢のようです。 ChromeのWebdriverは現在使用できませんし、他のドライバもかなり信頼性が低い、またはそのように思われます。 私は多くの問題と戦っていますが、ここに1つあります。
ランダムに、私のテストが
"org.openqa.selenium.StaleElementReferenceException: Element is no longer attached
to the DOM
System info: os.name: 'Windows 7', os.arch: 'amd64',
os.version: '6.1', java.version: '1.6.0_23'"
webdriverのバージョンは2.0b3を使っています。 FFとIEのドライバでこの現象が起こるのを見たことがあります。 私がこれを防ぐことができる唯一の方法は、実際の呼び出しを追加することです。
Thread.sleep
例外が発生する前に しかし、それは貧弱な回避策なので、誰かが私のエラーを指摘して、このすべてを良くしてくれることを期待しています。
解決方法は?
はい、もしあなたがStaleElementReferenceExceptionsで問題を抱えているのなら、それはレースコンディションが存在するからです。次のシナリオを考えてみてください。
WebElement element = driver.findElement(By.id("foo"));
// DOM changes - page is refreshed, or element is removed and re-added
element.click();
今、あなたが要素をクリックした時点で、要素参照はもはや有効ではありません。そのため、WebDriver は手を上げて、テストやアプリの作成者として何が起こるか起こらないかを正確に知っているべきあなたに、コントロールを委ねます。そのため、テストやアプリの作者としては、何が起こるか起こらないかを正確に把握しておく必要があります。そこで、DOM が変化しない状態になるまで、明示的に待つようにします。例えば、WebDriverWait を使って、特定の要素が存在するのを待ちます。
// times out after 5 seconds
WebDriverWait wait = new WebDriverWait(driver, 5);
// while the following loop runs, the DOM changes -
// page is refreshed, or element is removed and re-added
wait.until(presenceOfElementLocated(By.id("container-element")));
// now we're good - let's click the element
driver.findElement(By.id("foo")).click();
presenceOfElementLocated()メソッドは、以下のようになります。
private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
現在のChromeドライバが非常に不安定であることについて、あなたは正しいです。そして、Selenium trunkに書き直されたChromeドライバがあり、実装のほとんどが彼らのツリーの一部としてChromium開発者によって行われたことを聞いて満足することでしょう。
追記 別の方法として、上記の例のように明示的に待つのではなく、暗黙的な待ちを有効にすることができます。この方法では、WebDriver は指定されたタイムアウトまで常にループして、要素が存在するようになるのを待ちます。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
しかし、私の経験では、明示的に待つ方が常に信頼性が高いです。
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
java の例外が発生しました java
-
Dateが型に解決できない問題を解決する
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
プロローグでのコンテンツは禁止されています
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
Javaエラーメッセージがenclosingクラスでない
-
java 例外。Javaツールの初期化
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
linux run jarfile Invalid or corrupt jarfile error.
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
javaでよく使われる英単語
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決