私は使用しますexecuteScript
。提供される例:
String cssSelector="...blablabla...";
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("document.getElementById(\'"+cssSelector +"\').click();");
js.executeScript(stringBuilder.toString());
アラートの詳細に関しては、既知の問題があります。あなたはここで詳細を得ることができます
ドキュメントによると、違いは次のとおりです。
executeScript
public java.lang.Object executeScript(java.lang.String script,
java.lang.Object... args)
インターフェイスからコピーされた説明:JavascriptExecutor
現在選択されているフレームまたはウィンドウのコンテキストでJavaScriptを実行します。提供されたスクリプトフラグメントは、無名関数の本体として実行されます。スクリプト内で、documentを使用して現在のドキュメントを参照します。スクリプトの実行が終了すると、ローカル変数は使用できなくなりますが、グローバル変数は保持されることに注意してください。スクリプトに戻り値がある場合(つまり、スクリプトにreturnステートメントが含まれている場合)、次の手順が実行されます。
- HTML要素の場合、このメソッドはWebElementを返します
- 小数の場合、Doubleが返されます
- 10進数以外の場合、Longが返されます
- ブール値の場合、ブール値が返されます
- 他のすべての場合、文字列が返されます。
- 配列の場合、上記のルールに従って各オブジェクトのリストを返します。ネストされたリストをサポートします。
- 値がnullであるか、nullが返される戻り値がない場合を除きます。
引数は、数値、ブール値、文字列、WebElement、または上記の任意の組み合わせのリストである必要があります。引数がこれらの基準を満たさない場合、例外がスローされます。引数は、関数が「Function.apply」を介して呼び出されたかのように、「arguments」マジック変数を介してJavaScriptで使用できるようになります。
指定:インターフェースJavascriptExecutorのexecuteScriptパラメーター:script-引数を実行するJavaScript-スクリプトへの引数。空の場合があります戻り値:ブール、ロング、文字列、リスト、またはWebElementのいずれか。またはnull。
executeAsyncScript
public java.lang.Object executeAsyncScript(java.lang.String script,
java.lang.Object... args)
インターフェイスからコピーされた説明:JavascriptExecutor
現在選択されているフレームまたはウィンドウのコンテキストでJavaScriptの非同期部分を実行します。同期JavaScriptの実行とは異なり、このメソッドで実行されるスクリプトは、提供されたコールバックを呼び出すことによって、スクリプトが終了したことを明示的に通知する必要があります。このコールバックは、常に最後の引数として実行された関数に挿入されます。コールバック関数に渡された最初の引数は、スクリプトの結果として使用されます。この値は、同期の場合と同じ方法で処理されます。
例1:テスト対象のブラウザでスリープを実行します。
long start = System.currentTimeMillis();
((JavascriptExecutor) driver).executeAsyncScript(
"window.setTimeout(arguments[arguments.length - 1], 500);");
System.out.println(
"Elapsed time: " + (System.currentTimeMillis() - start));
例2:テストをAJAXアプリケーションと同期する:
WebElement composeButton = driver.findElement(By.id("compose-button"));
composeButton.click();
((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"mailClient.getComposeWindowWidget().onload(callback);");
driver.switchTo().frame("composeWidget");
driver.findElement(By.id("to")).sendKeys("bog@example.com");
例3:XMLHttpRequestを挿入し、結果を待つ:
Object response = ((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"var xhr = new XMLHttpRequest();" +
"xhr.open('GET', '/resource/data.json', true);" +
"xhr.onreadystatechange = function() {" +
" if (xhr.readyState == 4) {" +
" callback(xhr.responseText);" +
" }" +
"}" +
"xhr.send();");
JSONObject json = new JSONObject((String) response);
assertEquals("cheese", json.getString("food"));
スクリプト引数は、数値、ブール値、文字列、WebElement、または上記の任意の組み合わせのリストである必要があります。引数がこれらの基準を満たさない場合、例外がスローされます。引数は、「arguments」変数を介してJavaScriptで使用できるようになります。
指定:インターフェースJavascriptExecutorのexecuteAsyncScriptパラメーター:script-実行するJavaScript。args-スクリプトへの引数。空の可能性があります。戻り値:ブール、ロング、文字列、リスト、WebElement、またはnullのいずれか。
詳細なドキュメントはこちら