4

Selenium 2.35 を使用していて、Firefox で要素をクリックしようとすると、次のような予期しないエラーが発生します。

new Actions(driver).moveToElement(element).click().perform();

私が見つけた要素は、クリック イベントが関連付けられた < span > 要素です。私が遭遇している問題は、Firefox が要素をクリックしようとして失敗し、まったく別の要素をクリックする場合です。デバッガーを使用してコードを見ていくと、FirefoxDriver がブラウザーの間違った場所をクリックしているだけで、タイミングの問題に関係していると思われる問題は発生しません。ページに動的にロードされた < div > があり、クリックしたい要素を見つけて .click() コマンドを送信する直前にシフトダウンします。これが私の問題の原因だと思います。Thread.sleep(500) を配置して、動的 div のアニメーション化と挿入を完了するのに十分な時間を確保できますが、それは私にはだらしないようです。

また、 element.click() だけを送信しようとしましたが、それはより頻繁に失敗するようです。

更新 (2013 年 9 月 5 日):

@MrTi のコメントの助けを借りて私がたどり着いた解決策は次のとおりです。

private void jsClickOnElementById(String id)
{
    WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
    JavascriptExecutor js = (JavascriptExecutor)driver;
    StringBuilder sb = new StringBuilder();
    sb.append("var x = $('#" + id + "');");
    sb.append("x.click();");
    js.executeScript(sb.toString());
}

要素が実際にページ上にあることを確認するために、最初の「待機」呼び出しを追加し、JavascriptExecutor を使用して jquery を実行し、ページ上の要素をクリックしました。これは私の場合にはうまくいくようです。私はJavascriptExecutorクラスにかなり慣れていないので、誰かがこのソリューションのいくつかの欠点について助けてくれれば大歓迎です。

4

3 に答える 3

3

ページが ExpectedConditions で実際に表示されるようにすることに加えて、この状況は、ページでアニメーション (トランジション) を処理することで解決できます。

次のコマンドを実行すると、ページが更新されるまで、ページ上のすべてのアニメーションを無効にすることができます。

(JavascriptExecutor)driver.executeScript("$('body').append('<style> * {transition: none!important;}</style>')")

また、アニメーションを取得した特定の要素がわかっている場合は、アニメーション化されているかどうかを確認できます ( JQuery アニメーション セレクター) :

(Boolean)((JavascriptExecutor)driver).executeScript("return $("#ELEMENT_ID").is(":animated")")

特定の要素が不明な場合は、すべてのアニメーションが終了したかどうかを判断できます。

(Boolean)((JavascriptExecutor)driver).executeScript("return $(":animated").length == 0 ")
于 2014-11-27T14:00:38.987 に答える
1

起こっていることは、動的ローディングによってセレクターが別のものを選択していることだと思います。HTML を投稿すると (特に動的読み込みの前後に)、より優れたセレクターを作成するのに非常に役立ちます。

ただし、ロードが完了するまで待機する方法がいくつかあります。

(Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")最初にtrue を返すまで待機します。これは、ページ上のすべての JQuery が終了するのを待ちます (これがおそらく動的読み込みの原因です)。便利ですが、何か他のものを待つことをお勧めします。

2 番目のオプションは、動的に読み込まれる要素が存在するまで待機することです。

wait.until(ExpectedConditions.presenceOfElementSelectedBy(...selector...));

私はこの方法が好きです。あなたが待つ必要がある限り正確に待つので、それ以上待つ必要はありません。

最後のオプションは、他の処理が行われている場合でも常に要素を選択するセレクターを作成することです。これが最善の選択肢かもしれませんが、StaleElementReferenceExceptions.

于 2013-09-04T20:51:53.803 に答える