2021年12月現在、PlaywrightとPuppeteerのどっちを使うべき？

去年、こんな記事を書いていました。

https://qiita.com/YusukeIwaki/items/a9dbd48b1ed4313f3815

あれから1年、いまはどうなんでしょうか。

## 結論から言うと

よほどの理由がない限り、Playwrightでしょう。

6月頃にはもうこの結論は出ていました。

https://zenn.dev/yusukeiwaki/articles/db1cd8d7aa87ed

### Playwrightを使う理由

* JavaScript, Python, C#, Java の言語を公式にサポートしている
    * [Goも公式入りするという話](https://github.com/mxschmitt/playwright-go/issues/122)はあるが、半年以上経った今もまだされていない
* [Auto waiting](https://playwright.dev/docs/actionability/) により、いちいちwaitForナントカを書かなくても、ある程度は安定した自動操作ができる
    * 2021年8月ごろにリリースされた[Playwright 1.14で導入されたLocator](https://zenn.dev/yusukeiwaki/articles/1b52da28234134)により、さらにこの特性が利用しやすくなった。
* [ドキュメント](https://playwright.dev/docs/intro)の品質がとても良い
    * ~~マイクロソフトとは思えないクオリティ~~ さすが元Googleの人が作ったOSS


他にもテストランナーなど便利な特徴はありますが、
ともかく、**PuppeteerにできてPlaywrightにはできないこと、というのが2021年12月現在、ほとんどありません**。しいていうなら、[Cooperative Request Interception](https://github.com/puppeteer/puppeteer/pull/6735)くらいではないでしょうか。

----

以下は、かなり開発視点での内容です。PuppeteerやPlaywrightを利用される方々にはあまり有り難みのない内容であることをご承知おきください・・・（苦笑）

## Puppeteerの1年

### 2021/2月 混乱のリリース

* 2月2日 https://github.com/puppeteer/puppeteer/releases/tag/v6.0.0
* 2月4日 https://github.com/puppeteer/puppeteer/releases/tag/v7.0.0
* 2月4日 https://github.com/puppeteer/puppeteer/releases/tag/v7.0.1
* 2月9日 https://github.com/puppeteer/puppeteer/releases/tag/v7.0.2
* 2月9日 https://github.com/puppeteer/puppeteer/releases/tag/v7.0.3
* 2月9日 https://github.com/puppeteer/puppeteer/releases/tag/v7.0.4
* 2月12日 https://github.com/puppeteer/puppeteer/releases/tag/v7.1.0
* 2月26日 https://github.com/puppeteer/puppeteer/releases/tag/v8.0.0

おそらく、メンテナーが変わってbreaking changesに敏感になったのか、頻繁にメジャーバージョンが上がるようになりました。
度重なるリリースは、TypeScriptの型定義まわりでちょっとやらかしていたみたいですね。

### その後は、１〜２ヶ月に一度のリリース

* 4月21日 https://github.com/puppeteer/puppeteer/releases/tag/v9.0.0
* 5月3日  https://github.com/puppeteer/puppeteer/releases/tag/v9.1.0
* 5月5日  https://github.com/puppeteer/puppeteer/releases/tag/v9.1.1
* 5月31日  https://github.com/puppeteer/puppeteer/releases/tag/v10.0.0
* 6月29日  https://github.com/puppeteer/puppeteer/releases/tag/v10.1.0
* 8月4日  https://github.com/puppeteer/puppeteer/releases/tag/v10.2.0
* 9月22日  https://github.com/puppeteer/puppeteer/releases/tag/v10.4.0
* 11月2日  https://github.com/puppeteer/puppeteer/releases/tag/v11.0.0
* 11月28日  https://github.com/puppeteer/puppeteer/releases/tag/v12.0.0
* 11月30日  https://github.com/puppeteer/puppeteer/releases/tag/v12.0.1
* 12月10日  https://github.com/puppeteer/puppeteer/releases/tag/v13.0.0

少しずつながらも開発は進んでいるようです。（11月頃からまたメンテナーが変わってる感じもします）

公式ドキュメントが、Docusaurusに移行されようとしていた時期もあり、https://puppeteer.github.io/puppeteer/ というサイトにその形跡がありますが、v10.1.0 のまま更新が止まっています。

ちなみに、v10.3.0はなぜ欠番なのか、コミットログを見ても形跡は残っていません。本当に何かまずったのでしょう。

### コントリビューションチャンス？

最近のPuppeteerは、issueを上げてもあまり反応されませんが、Pull Requestまで上げると反応があり、内容が合理的なものであれば議論＆マージしてもらえます。個人的に、Playwrightにあって便利だった機能をPuppeteerにも部分的にポーティングしてみたんですが、割とすんなり受け入れてもらえました。

https://github.com/puppeteer/puppeteer/pull/7389


## Playwrightの1年

### 毎月の順調なリリース

1.8.0から1.17.1まで、順調に開発が続けられています。
私が適当に解説するよりも、公式のGitHubのリリースノードを見たほうが正確に各バージョンの変化がわかると思いますので、気になる方は是非見ましょう。
https://github.com/microsoft/playwright/releases

### テストフレームワークとしての地位を確立しようとしている？

ざっくりですが、最近のPlaywrightはブラウザ自動操作の利便性を向上する内容よりも、テストランナーに注力されているようです。

* もともと、テストランナーは[microsoft/folio](https://github.com/microsoft/folio)という別プロジェクトでしたが、[Playwright 1.12](https://github.com/microsoft/playwright/releases/tag/v1.12.0)でそれがplaywright-testパッケージに組み込まれ、
* Cypressのような詳細なテストレポート機能が[Playwright 1.16](https://github.com/microsoft/playwright/releases/tag/v1.16.0)で組み込まれ、
* Fetch API がAPIテスト機能として Playwright 1.16で正式リリースとなり、

導入実績はまだ少ないものの、機能的にはCypressに少しずつ近づいてきているように思えます。

### 欲しい機能や不具合報告は、まずissueから

Puppeteerに比べると、Playwrightは組織的に開発されているため、いきなりPull Requestをポイと出しても、「なにこれ？」という扱いをされます。

まずissueを上げて、どんなユースケースに欲しい機能なのか？代替案はないのか？みんな使いたい機能なのか？ などを議論の末に、Playwrightチームがサッと実装する、というパターンが多いです。

## まとめ

* ブラウザ自動操作でPuppeteerとPlaywrightのどっちを使うか迷っているならば、間違いなくPlaywrightを使いましょう。
* ブラウザの自動操作ライブラリにコントリビューションしてみたいなー、というニッチな方にはPuppeteerがおすすめです。