* 仕様書

[REFS[
- [6] [CITE@en[WebDriver]], [TIME[2020-03-19 20:29:03 +09:00]] <https://w3c.github.io/webdriver/#executing-script>
]REFS]

* 実装

[2] [[ChromeDriver]] も [[GeckoDriver]]
も、旧[[エンドポイント]]の
[CODE[execute]] や [CODE[execute_async]] に対応しています。[TIME[2017-05-19T07:11:59.400Z]]

[3] [[GeckoDriver]] は
[CODE[execute]] でも [CODE[execute/sync]] でも、
[[約束]]が返されたら[[約束]]が[[解決]]されてから結果を返します。
[[ChromeDriver]] は[[約束]]オブジェクト自体を返します (が [[JSON]] で表せないので、
空の[[オブジェクト]]になります)。[TIME[2017-05-19T07:13:17.300Z]]

[1] [[GeckoDriver]] は [CODE[execute]] や [CODE[execute/sync]]
で返した[[約束]]が[[拒絶]]されたとき、
エラーでなく成功として返してきます。
そのため[[約束]]が成功裏に[[解決]]された場合と区別できません。
[TIME[2017-05-19T07:11:27.000Z]]

[4] [[ChromeDriver]] の [CODE[execute_async]] は、
タイムアウトの既定値が0秒になっています。
すぐに実行できる[[約束]]の[[コールバック]]などがなくなれば、
すぐにタイムアウトエラーを返します。
[[GeckoDriver]] の [CODE[execute_async]] は、
タイムアウトの既定値が数分に設定されているようです。[TIME[2017-05-19T07:37:21.0Z]]

[5] 
[[ChromeDriver]] では、
[[navigate]] を発生させるメソッドを実行してから、
[CODE[Promise]] の[[コールバック]]を経て[[非同期的]]に [CODE[execute_async]]
の[[コールバック]]を呼び出すことにしていると、
[[navigate]] による unload が先に発生して、 [[WebDriver]]
がエラー応答を返すことがあるようです。(微妙なタイミングの問題なので、
先に[[コールバック]]が呼び出されて成功の応答が返ることもあります。)
[[GeckoDriver]] はそのようなことはなさそうですが、必ずかはわかりません。[TIME[2017-05-31T08:26:09.900Z]]


[7] 
[CODE[[[Error]] [[===]] [[window]].[[Error]]]]
が
[[Chrome]] では[[真]]ですが、
[[Firefox]] では[[偽]]です。
[TIME[2020-03-25T08:02:22.00Z]]

[8] 
最近の [[GeckoDriver]]
では
[CODE[execute_async]]
が
[CODE[405]]
エラーになります。
[TIME[2025-05-04T05:35:06.000Z]]