tag:crieit.net,2005:https://crieit.net/tags/Playwright/feed 「Playwright」の記事 - Crieit Crieitでタグ「Playwright」に投稿された最近の記事 2023-02-05T21:40:36+09:00 https://crieit.net/tags/Playwright/feed tag:crieit.net,2005:PublicArticle/18382 2023-02-04T02:06:05+09:00 2023-02-05T21:40:36+09:00 https://crieit.net/posts/Playwright Playwright のミニマムなテスト。 <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/c53xn">https://rentry.co/c53xn</a></p> <h2 id="Playwright とはなにか。"><a href="#Playwright+%E3%81%A8%E3%81%AF%E3%81%AA%E3%81%AB%E3%81%8B%E3%80%82">Playwright とはなにか。</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.perplexity.ai/?s=u&uuid=69eed2a2-ebf2-41e1-9ef4-e0ef7b608826">Microsoft Playwright とは?</a></p> <p>Selenium みたいなもの。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.selenium.dev/">https://www.selenium.dev/</a></p> <p>Puppeteer みたいなもの。<br /> <a target="_blank" rel="nofollow noopener" href="https://pptr.dev/">https://pptr.dev/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/ARt3zDHSsd4?t=70">https://youtu.be/ARt3zDHSsd4?t=70</a></p> <p>簡単に言うと、ブラウザを使って、javascript が動作することでページがちゃんと見えるうなうなサイトをスクレイピングしたりするのに使うプログラムのセットのようなもの。<br /> ブラウザのプログラムが別に必要だが、パッケージマネージャーでインストールするタイプのものだと、セットでインストールすることもできる。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/playwright">https://github.com/microsoft/playwright</a></p> <h2 id="Node.js と npm"><a href="#Node.js+%E3%81%A8+npm">Node.js と npm</a></h2> <p>前準備として node.js をインストールして、npm パッケージマネージャ―が使える状態にする。<br /> 以降は、 node.js のインストールが完了されている状態での操作になる。</p> <p>node.js インストールの手順は省略<br /> <a target="_blank" rel="nofollow noopener" href="https://nodejs.org/ja/download/">https://nodejs.org/ja/download/</a></p> <p>Node.js をインストールすると npm パッケージマネージャーが使えます。<br /> Node.js 向けのモジュールは npm パッケージマネージャーのコマンドでインストールします。<br /> npm を使って、別のパッケージマネージャーをインストールすることができます。ですが、この記事では使用しません。</p> <h3 id="npm と node.js のバージョン。"><a href="#npm+%E3%81%A8+node.js+%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%80%82">npm と node.js のバージョン。</a></h3> <pre><code>npm -v 9.3.1 </code></pre> <pre><code>node -v v19.5.0 </code></pre> <h2 id="ブラウザを立ち上げて手動で操作して、その過程をコードで記録する。 test &amp; codegen"><a href="#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%81%A6%E6%89%8B%E5%8B%95%E3%81%A7%E6%93%8D%E4%BD%9C%E3%81%97%E3%81%A6%E3%80%81%E3%81%9D%E3%81%AE%E9%81%8E%E7%A8%8B%E3%82%92%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B%E3%80%82+test+%26amp%3B+codegen">ブラウザを立ち上げて手動で操作して、その過程をコードで記録する。 test & codegen</a></h2> <p>手動でページ移動などの操作をして、コードとして記録する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://youtu.be/wGr5rz8WGCE?t=130">https://youtu.be/wGr5rz8WGCE?t=130</a></p> <p>前準備として node.js をインストールして、npm パッケージマネージャ―が使える状態にする。<br /> <a target="_blank" rel="nofollow noopener" href="https://nodejs.org/ja/download/">https://nodejs.org/ja/download/</a></p> <p>Playwright のインストール。chromium ブラウザーも同時にインストールされる。</p> <pre><code class="terminal">npm i -D playwright </code></pre> <p><code>https://www.youtube.com/</code> を chromium ブラウザーで開いて、操作する。</p> <pre><code class="terminal"> npx playwright codegen https://www.youtube.com/ </code></pre> <p>chromium ブラウザーのウィンドウが2つ開いて、</p> <p><a href="https://crieit.now.sh/upload_images/34464d43dbe38897d5407b786822f21463dd3c0dba9c0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/34464d43dbe38897d5407b786822f21463dd3c0dba9c0.png?mw=700" alt="image" /></a></p> <p>ブラウザ上の操作が記録されていく。<br /> <a href="https://crieit.now.sh/upload_images/906eb0fbc7e9c21bb271a4ca2788fc0763dd3c25e81ad.JPG" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/906eb0fbc7e9c21bb271a4ca2788fc0763dd3c25e81ad.JPG?mw=700" alt="image" /></a></p> <p>手動でブラウザでテキスト入力したり、ボタンを押したりしたりしたことがコードとして記録されるので、このことを利用して、記録されたコードをコピーして自動処理のプログラムコードにペーストして編集すれば期待する動作のプログラムのコーディングに役立つ。</p> <h2 id="node.js での実行"><a href="#node.js+%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A1%8C">node.js での実行</a></h2> <p>javascript のプログラムファイルをつくり、Node.js で js ファイルを実行する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=2_BPIA5RgXU&list=PLkiSKDHzztLAChyWRdYyFcIM-_yJTjrsR">https://www.youtube.com/watch?v=2_BPIA5RgXU&list=PLkiSKDHzztLAChyWRdYyFcIM-_yJTjrsR</a></p> <p>まず、これから作るプログラムのプロジェクト用のディレクトリをつくる。</p> <pre><code class="terminal">mkdir playw_test cd playw_test </code></pre> <h3 id="package.json"><a href="#package.json">package.json</a></h3> <p>package.json というファイルを作って、そこにインストールしたいパッケージとバージョンを JSON 書式で書く。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.startup-cloud.co.jp/liberty-technology/PublicItems/npm/package.json.html">https://www.startup-cloud.co.jp/liberty-technology/PublicItems/npm/package.json.html</a></p> <p>package.json<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/5gm25u">https://rentry.co/5gm25u</a></p> <pre><code class="javascript">{ "devDependencies": { "playwright": "1.30.0" } } </code></pre> <p>npm パッケージマネージャーで <code>install</code> コマンドを実行すると、package.json に記載されたパッケージがインストールされる。</p> <pre><code class="terminal">npm install </code></pre> <h3 id="playtest.js"><a href="#playtest.js">playtest.js</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/zga9c">https://rentry.co/zga9c</a></p> <pre><code class="javascript"><br />/** * node.js から playwright での chrome ブラウザ操作テスト **/ const playwright = require('playwright'); const url = "https://www.youtube.com/"; (async () => { const browser = await playwright.chromium.launch({ channel: 'chrome',headless : false, }); //context const context = await browser.newContext(); //page const page = await context.newPage(); //navigate await page.goto(url); var date = Date.now(); //screenshot await page.screenshot({path: `${date}.png`}); await browser.close(); })(); </code></pre> <p>気をつけないといけないのは、メソッド全てに <code>await</code>キーワードをつけないと、そんなメソッドはないですというそっけないエラーになるので、<code>await</code> を忘れるとあるはずのメソッドが無いということでどこで何がおかしいのかわからなくなる。</p> <p>Node.js での実行。</p> <pre><code class="terminal">playtw_test> node ./playtest.js </code></pre> <p>コマンドを実行して playtest.js が実行されると、ブラウザが立ちあがり、サイトに移動して、スクリーンキャプチャを保存して、ブラウザが閉じる。<br /> <a href="https://crieit.now.sh/upload_images/9988fa50fbfaecad1fbc68027522ea2b63de3d58e0028.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9988fa50fbfaecad1fbc68027522ea2b63de3d58e0028.png?mw=700" alt="image" /></a></p> <h3 id="test"><a href="#test">test</a></h3> <p>playtw_test> playtest_2.js<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/2iui8">https://rentry.co/2iui8</a></p> <pre><code class="javascript">const playwright = require('playwright'); let url = ``; for( i = 2;i < process.argv.length; i++) { url = process.argv[i] ; } (async () => { const browser = await playwright.chromium.launch({ channel: 'chrome',headless : false, }); //context const context = await browser.newContext(); //page const page = await context.newPage(); //navigate await page.goto(url); await page.getByPlaceholder('検索').click(); await page.getByPlaceholder('検索').fill('鳥インフルエンザ'); await page.getByPlaceholder('検索').press('Enter'); await page.waitForTimeout(1000); //screenshot var date = Date.now(); await page.screenshot({path: `${date}.png`}); await browser.close(); })(); </code></pre> <p>playtest_2.js を node.js で実行。</p> <pre><code class="terminal">playtw_test> node ./playtest_2.js http://www.youtube.com/ </code></pre> <p><a href="https://crieit.now.sh/upload_images/40628d54304b41b9e98ce4376ca3cde563de43c4163d4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/40628d54304b41b9e98ce4376ca3cde563de43c4163d4.png?mw=700" alt="image" /></a></p> tomato tag:crieit.net,2005:PublicArticle/15814 2020-04-07T21:21:42+09:00 2020-04-07T21:21:42+09:00 https://crieit.net/posts/Playwright-Browser-has-been-closed-Protocol-error PlaywrightでBrowser has been closedというProtocol errorが出る場合 <p>PlaywrightはPuppetterチームだった方が作っているヘッドレス対応且つクロスブラウザのプロジェクト。Chromium、WebKit、Firefoxが使える。</p> <p>WebKitで利用していたのだが、どうもサーバー上で実行させてみると下記のようなエラーが出て止まってしまった。</p> <pre><code>Protocol error (Playwright.createContext): Browser has been closed. </code></pre> <p>エラーメッセージもこれだけで、なにも分からない。</p> <p>仕方がないのでPlaywrightのソースコードを見てみたところ、どうもいたるところでdebug関数を使用していることがわかった。これはnpmのdebugパッケージが使用されているもの。通常は何も出力されないが、DEBUG環境変数を指定することにより、指定されたデバッグメッセージを表示してくれるというもの。例えば下記のような感じで環境変数を指定すれば全てのメッセージを見ることができる。</p> <pre><code class="sh">DEBUG=* yarn dev </code></pre> <p>これでデバッグメッセージを見てみたところ、どうもLinux上の色んなシェアドライブラリが不足していた。とにかくエラーがなくなるまでライブラリをインストールしまくったら動くようになった。</p> <p>ちなみに、かなりの数。しかもAmazon Linuxだとそもそもインストールできるのか謎のライブラリもあった。そのためUbuntuに切り替えて試したところ、数も減り、インストールもaptで全てでき改善できた。</p> <p>ちなみに最初にchromium-browserをインストールしたことでだいぶ減らせたのではないかな……という気がしている。</p> だら@Crieit開発者