セレンを使用すると、プログラムでフォームを送信するなど、任意のJavascriptを実行できます。
Selenium Javaを使用した最も単純なJS実行:
if (driver instanceof JavascriptExecutor) {
System.out.println(((JavascriptExecutor) driver).executeScript("prompt('enter text...');"));
}
また、Javascriptを使用すると、POSTリクエストを作成し、必要なパラメーターとHTTPヘッダーを設定して、送信できます。
// Javascript example of a POST request
var xhr = new XMLHttpRequest();
// false as 3rd argument will forces synchronous processing
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('login=test&password=test');
alert(xhr.response);
最新の最先端のブラウザでは、を使用することもできますfetch()
。
セレンに応答テキストを渡す必要がある場合は、またはをalert(this.responseText)
使用する代わりに、 (または)の結果を変数に割り当てます(Pythonを使用している場合)。これに対応するJavaの場合。return this.responseText
return this.response
execute_script
execute_async_script
executeScript()
executeAsyncScript()
Pythonの完全な例を次に示します。
from selenium import webdriver
driver = webdriver.Chrome()
js = '''var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('login=test&password=test');
return xhr.response;'''
result = driver.execute_script(js);
result
jsコードが同期している場合、JavaScriptの戻り値が含まれます。リクエストを強制的に同期させるためfalse
の3番目の引数として設定します。xhr.open(..)
3番目の引数をに設定するtrue
か、それを省略すると、要求は非同期になります。
❗️非同期jsコードを呼び出す場合は、execute_script
使用する代わりにexecute_async_script
、そうでない場合は呼び出しが何も返さないことを確認してください。
注:文字列引数をjavascriptに渡す必要がある場合は、必ずを使用してエスケープしてください。そうしjson.dumps(myString)
ないと、文字列に一重引用符または二重引用符、またはその他のトリッキーな文字が含まれている場合にjsが壊れます。