Selenium WebDriverには、要素を可視領域に入れる2つの主要な方法があります:
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
これらの方法は同等であり、どちらを優先すべきですか?
scrollIntoView
DOMメソッドscrollIntoView
は、要素をビューにスクロールするだけです。 scrollIntoView
が要素をスクロールしてビューに表示できない場合、サイレントで失敗します。不可視の要素をbody
の先頭に追加し、scrollIntoView
を呼び出しました。何もスクロールしませんでしたが、エラーはありませんでした。 scrollIntoView
よりもmoveToElement
を使用して要素をスクロールするhowをさらに制御できることに注意してください。 Seleniumは、要素を表示してマウスを配置できるようにすることのみに関心があります。それがどのように行われるかについては何も言いません。ただし、scrollIntoView
を使用すると、たとえば、要素の上部または下部をスクロール可能な祖先に揃えるかどうかを指定できます。 (詳細については here をご覧ください。)
moveToElement
SeleniumのメソッドmoveToElement
は2つのことを行います:要素をスクロールして表示し、要素の上にマウスを移動します。また、画面上の座標がなく、ここでもエラーがないため、スクロールまたは移動できない要素でテストしました。
デフォルトではmoveToElement
を使用しますが、次の例外があります。
Seleniumがマウスを置いた場所にまったく影響を与えたくないが、何かをスクロールして表示したい場合(少し奇妙ですが...可能)、scrollIntoView
を使用する必要があります。
scrollIntoView
が提供する制御の種類で要素をスクロールする必要がある場合(上記の配置オプションのように)、moveToElement
ではなく要素を使用する必要があります。
Seleniumのコマンドを使用してユーザーの動作をシミュレートすることが不可能な場合や、一連のSeleniumコマンドを送信することで非常にコストがかかる場合があります。 (各コマンドはネットワークへの往復です。テストサーバーがインターネットのどこかにある場合、合計されます。)そのような場合、SeleniumのexecuteScript
を使用します。そのような場合、スクリプトを終了し、scrollIntoView
を作成してスクロールを実行し、別のAction
で操作全体を完了するのではなく、実行中のスクリプトでexecuteScript
を使用すると有利です。