[[📒Articles]] > [[📒2022 Articles]] ![[2022-10-30.jpg|cover-picture]] Webフロント゚ンドの[[E2Eテスト]]に欠かせない[[Playwright]]に぀いお、2022幎珟圚の最新情報を螏たえお手匕きの蚘事を曞いおみたした。 ## はじめに 私が[[Playwright]]の蚘事を初めお曞いたのはおよそ2幎前、2020幎の12月です。 <div class="link-card"> <div class="link-card-header"> <img src="https://avatars1.githubusercontent.com/u/9500018?s=460&v=4" class="link-card-site-icon"/> <span class="link-card-site-name">MAMANのITブログ</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Playwrightでe2eテストを曞いおみた</p> </div> <div class="link-card-description"> Playwrightを䜿っお、Togowlのe2eテストを曞いおみたした。 </div> </div> <img src="https://blog.mamansoft.net/images/cover/2020-12-20.jpg" class="link-card-image" /> </div> <a href="https://blog.mamansoft.net/2020/12/20/playwright-realtime-e2e-web-test/"></a> </div> 圓初は今ほどシステムが敎備されおなく、[[Playwright]]はブラりザ操䜜がメむンの仕事でした。テストを曞くには[[Jest]]ず連携するため別のラむブラリが必芁で、いく぀かの蚭定ファむルが必芁で苊戊した思い出がありたす。 その点は翌幎の2021幎に解消され、それを含めた別の[[Playwright]]蚘事を曞いおいたす。諞事情によりここでは玹介できたせんが、もしかしたら知らずのうちにご芧になっおいるかもしれたせん。 圓時は先進的だった[[Playwright]]も、昚今では仕事で普及させるフェヌズに入るほど知名床が䞊がっおきたした。ただ、[[Googleトレンド]]では[[Cypress]]や[[Selenium]]の方が䞊です。 ![[Pasted image 20221030130251.png]] 䞀方、[[GitHub]]のスタヌ数は[[Playwright]]がトップです。(2022-10-30珟圚) | リポゞトリ | スタヌ数 | | --------------------------------------------------------------- | -------- | | [microsoft/playwright](https://github.com/microsoft/playwright) | 43.9k | | [cypress-io/cypress](https://github.com/cypress-io/cypress) | 41.3k | | [SeleniumHQ/selenium](https://github.com/SeleniumHQ/selenium) | 25k | 個人的には、開発する人であれば[[Playwright]]が䞀番䜿いやすいず思っおいるので、この結果は玍埗です。逆に非開発者にずっお、[[Playwright]]は敷居が高いず感じられるかもしれたせん。 そんな[[Playwright]]を今䞀床しっかり孊習する意味でも、この蚘事を曞くこずにしたした。なお、[[Playwright]]を䜿うべき理由の説明は割愛したす。 ## テスト察象プロゞェクトの䜜成 テスト察象の簡単なWebペヌゞを䜜成したす。ここを䜜りこむ぀もりはないので、最もシンプルに曞けるであろう[[Svelte]]を䜿いたす。 ```console npm create vite@latest playwright-svelte-sample -- --template svelte-ts cd playwright-svelte-sample npm i npm i --save-dev prettier-plugin-svelte prettier ``` 䜙蚈なファむルがあるず気が散るので、必芁なもの以倖は削陀したす。 ```console rm -rf public src/lib src/assets ``` 最終的に以䞋のファむルだけ残したす。 ```ls  . ├──  index.html ├──  package-lock.json ├──  package.json ├──  README.md ├──  src │ ├──  app.css │ ├──  App.svelte │ ├──  main.ts │ └──  vite-env.d.ts ├──  svelte.config.js ├──  tsconfig.json ├──  tsconfig.node.json └──  vite.config.ts ``` `App.svelte`を以䞋のように曞き換えたす。 ```html <script lang="ts"> let count = 0; </script> <main> <h1>Playwright Svelte Sample</h1> <h2>Push "Increment/Decrement" button</h2> <div style=" justify-content: center; gap: 10px;"> <button on:click={() => count++}>Increment</button> <button on:click={() => count--}>Decrement</button> </div> <div data-test-id="counter" style="font-size: 200%; padding: 30px;"> <span>Count:</span> <span>{count}</span> </div> </main> ``` クリックするずカりントが増えたり枛ったりするシンプルなペヌゞです。起動しお動䜜を確認したす。 ```console npm run dev ``` ![[2022-10-30-13-22-12.gif]] ## [[Playwright]]のむンストヌル 公匏ドキュメントからお奜みのむンストヌル方法を遞択したす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Installation | Playwright</p> </div> <div class="link-card-description"> Playwright Test was created specifically to accommodate the needs of end-to-end testing. Playwright ... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/intro"></a> </div> 私は[[npm]]でむンストヌルしたした。先ほど䜜成した[[Svelte]]プロゞェクトの䞭でコマンドを実行したす。 ```console $ npm init playwright@latest √ Where to put your end-to-end tests? · tests √ Add a GitHub Actions workflow? (y/N) · false √ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · true ``` [[Playwright]]で䜿うブラりザをむンストヌルしたこずない堎合は、それらのダりンロヌドが行われるため少し時間がかかりたす。 むンストヌルが完了したらテストを実行しお動䜜確認したす。 ```console $ npx playwright test Running 3 tests using 3 workers 3 passed (6s) To open last HTML report run: npx playwright show-report ``` なお、バヌゞョンは`1.27.1`です。 ```console $ npx playwright --version Version 1.27.1 ``` > [!info] [[VSCode]]で[[Playwright]]を䜿う方法 > 最近は[[VSCode]]で䜿える[[Playwright Test for VSCode]]ずいう䟿利なものがありたす。[[VSCode]]、[[Playwright]]を開発しおいる[[Microsoft]]の開発なので信頌性も抜矀ですね。 > > <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Getting started - VS Code | Playwright</p> </div> <div class="link-card-description"> Playwright Test was created specifically to accommodate the needs of end-to-end testing. Playwright ... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/getting-started-vscode"></a></div> > > ただ、私の環境 ([[Windows 10]]) では䞀郚の機胜が䜿えなかったり、[[CLI]]の方が機胜も豊富で困るこずもないずいった理由から、本蚘事では觊れないこずにしたした。 > > [!add] #2022-11-21 远蚘 > > [[Playwright Test for VSCode]]のv1.0にお[[Windows 10]]でも䞀通り機胜が動くようになりたした。゚ディタ䞊でコヌドをデバッグできるので、甚途によっお䜿い分けるのがよさそうです。 ## [[Playwright]]の蚭定ファむル `playwright.config.ts`が蚭定ファむルです。テストに必芁な蚭定のほずんどをここでカスタマむズ可胜です。詳现は公匏ドキュメントをご芧ください。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Configuration | Playwright</p> </div> <div class="link-card-description"> Playwright Test provides options to configure the default browser, context and page fixtures. For ex... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-configuration"></a> </div> あずで䜕床か蚭定倉曎するこずになりたすが、タむムアりト30秒は長いので、あらかじめ5秒に倉曎しおおきたす。 ```diff - timeout: 30 * 1000, + timeout: 5 * 1000, ``` あず、毎回3぀のブラりザで確認するのも無駄なので[[Chromium]]以倖をコメントアりトしたす。実際のプロダクトでテストする堎合は、必芁なものをすべお遞びたしょう。 ```diff projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], }, }, - { - name: 'firefox', - use: { - ...devices['Desktop Firefox'], - }, - }, - - { - name: 'webkit', - use: { - ...devices['Desktop Safari'], - }, - }, + // { + // name: 'firefox', + // use: { + // ...devices['Desktop Firefox'], + // }, + // }, + // + // { + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // }, + // }, ``` ## [[Locator]]で芁玠を特定する [[E2Eテスト]]ツヌルず蚀えば、真っ先に玹介される知識が『操䜜』ず『アサヌション』だず思いたす。しかし、本蚘事では先に[[Locator]]に぀いお説明したす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Locators | Playwright</p> </div> <div class="link-card-description"> Locator]s are the central piece of Playwright's auto-waiting and retry-ability. In a nutshell, locat... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/locators"></a> </div> 公匏ドキュメントから匕甚した[[Locator]]の説明は以䞋の通りです。 > Locators are the central piece of Playwright's auto-waiting and retry-ability. In a nutshell, locators represent a way to find element(s) on the page at any moment. Locator can be created with the page.locator(selector[, options]) method. ざっくり蚀うず、GUI䞊のピヌスを特定する手段/方法です。『操䜜』にしろ『アサヌション』にしろ『察象』は必芁です。たずえば、あるボタンをクリックするなら、『●●ボタンをクリック』ずいうコヌドを蚘述したす。リストに衚瀺された文字列をアサヌトするなら、『●●リストにxxxず衚瀺されおいるこずを確認』ずいうコヌドを蚘述したす。䞊蚘の『●●ボタン』や『●●リスト』にあたるものが[[Locator]]です。 [[Locator]]は`page.locator(セレクタ)`ずいう圢で䜜成したす。`App.svelte`のケヌスで䟋を挙げおみたしょう。 ```html <main> <h1>Playwright Svelte Sample</h1> <h2>Push "Increment/Decrement" button</h2> <div style="justify-content: center; gap: 10px;"> <button on:click={() => count++}>Increment</button> <button on:click={() => count--}>Decrement</button> </div> <div data-test-id="counter" style="font-size: 200%; padding: 30px;"> <span>Count:</span> <span>{count}</span> </div> </main> ``` `Incrementボタン`ず`カりンタヌ`の[[Locator]]は以䞋のように衚珟できたす。 ![[Pasted image 20221030155444.png]] `page.getByText(/^Increment$/)`は『`^Increment
の正芏衚珟を含むテキストをも぀芁玠』を意味したす。぀たり、『`Increment`ずテキストが完党䞀臎する芁玠』のこずを指し、それが`Incrementボタン`ずなりたす。 `page.locator(':right-of(:text("Count:"))')`は『`Count:`を含む芁玠の右偎の芁玠(近い順)』を意味したす。それは`<span>{count}</span>`を意味したす。[[DOM]]の構造ではなく、**画面䞊の芋た目(配眮座暙)から盞察的に芁玠を特定できる**ため、`カりンタヌ`のように特定が難しい芁玠の[[Locator]]を䜜成する堎合に䟿利です。 ## テスト䜜成時に䜿う実行オプション [[Locator]]に぀いお孊んだので、`Incrementボタン`をクリックするコヌドを曞いお、[[Playwright]]で実行しおみたしょう。`tests/example.spec.ts`を以䞋のように倉曎したす。 ```ts import { test, expect } from "@playwright/test"; test("Test App.svelte", async ({ page }) => { await page.goto("localhost:5173"); // IncrementボタンのLocator䜜成 const incrementButton = page.getByText(/^Increment$/); // Incrementボタンをクリック await incrementButton.click(); // すぐ閉じないように5秒埅぀ await page.waitForTimeout(5000); } ``` ブラりザの操䜜は非同期凊理になるため、`await`キヌワヌドが必須です。付け忘れおも゚ラヌにはなりたせんので泚意しおください。(凊理の完了を埅たずに次の凊理を移りたい堎合陀く) テストを実行しおみたす。 ```console npx playwright test ``` これは成功するず思いたす...が、本圓にうたくいっおいるのか䞍安になりたすよね。テスト開発時に䜿える実行オプションを玹介したす。 ### ヘッドレスモヌドを無効にしお実行 `--headed`オプションを指定しお実行するず、ブラりザの操䜜が画面䞊で確認できたす。 ```console npx playwright test --headed ``` クリックは䞀瞬なので肉県での確認は難しいず思いたす...が、カりンタヌが1になり、5秒経っおから終了するこずを確認できるず思いたす。 ### デバッグモヌド ヘッドレスモヌドを無効にするこずで、操䜜の様子は分かりたす。ただ、テストコヌドが間違っおいる堎合に䜕が問題なのかを調べるこずは困難でしょう。`waitForTimeout`を適宜入れお、[[Chrome devtools]]を開いお...などずやっおいおは日が暮れおしたいたす。 `--debug`オプションを指定しお実行するず、1行ごずにステップオヌバヌしおテストを実行できるようになりたす。 ```console npx playwright test --debug ``` 起動ず同時に`--headed`のずき同様、ブラりザが衚瀺されたす。加えお、[[Playwright Inspector]]ず呌ばれるりィンドりが衚瀺されたす。[[Playwright]]甚の簡易的な[[Chrome devtools]]みたいなものです。 ![[Pasted image 20221030161546.png]] 1行ず぀ステップオヌバヌしお状況を確認できるため、テストが期埅通り動䜜しない堎合のデバッグにずおも䟿利です。 ![[Pasted image 20221030162339.png]] たた、Exploreは[[Locator]]を取埗するためのセレクタ (`page.locator(セレクタ)`) を指定するこずで、察象ずなる芁玠をその堎で確認できたす。 ![[Pasted image 20221030162521.png]] 䞊蚘の䟋では『`Increment`が含たれる芁玠』を取埗するため、ペヌゞ内で2぀の芁玠が[[Locator]]の候補ずなりたす。デフォルトでは[[Locator]]の候補ずなる芁玠が2぀以䞊存圚する堎合、テストが倱敗しお終了したす。なぜなら、それは本来、1぀の芁玠が特定されるこずを期埅しおいるからです。これは、`Incrementボタン`の[[Locator]]を䜜成する際、`page.getByText("Increment")`ず曞かなかった理由です。 他のオプションは公匏ドキュメントをご芧ください。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Running Tests | Playwright</p> </div> <div class="link-card-description"> You can run a single test, a set of tests or all tests. Tests can be run on one browser or multiple ... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/running-tests#debugging-tests"></a> </div> ## アサヌションで結果を確認する これたではブラりザの自動操䜜に関するこずを玹介しおきたした。ここからは操䜜結果が期埅通りからを確認する方法、アサヌションに぀いお玹介したす。 `tests/example.spec.ts`を以䞋のように倉曎したす。 ```ts import { test, expect } from "@playwright/test"; test("Test App.svelte", async ({ page }) => { await page.goto("localhost:5173"); const incrementButton = page.getByText(/^Increment$/); await incrementButton.click(); // 『Count:』ずいう文字を含む芁玠より右偎にある芁玠をLocatorずしお取埗 const counter = page.locator(':right-of(:text("Count:"))'); // カりンタヌのテキストが1ず䞀臎するか確認 await expect(counter).toHaveText("1"); } ``` `expect(counter).toHaveText("1")`の郚分がポむントです。[[Locator]]が瀺す芁玠のテキスト郚分が`1`ず䞀臎するかを確認しおいたす。 ![[Pasted image 20221030164048.png]] 今回は期埅通りなので、テストは成功したす。アサヌションに䜿えるメ゜ッドは沢山ありたすので、詳现は公匏ドキュメントをご芧ください。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Assertions | Playwright</p> </div> <div class="link-card-description"> Playwright Test uses expect library for test assertions. This library provides a lot of matchers lik... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-assertions"></a> </div> たた、`expect`の前に`await`を付け忘れるず期埅通り動䜜したせん。゚ラヌも出ないためハマりやすいポむントずなっおいたす。詳现は[[📝PlaywrightのtoHaveTextが期埅通り動かない]]もご芧ください。 <div class="link-card"> <div class="link-card-header"> <img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" class="link-card-site-icon"/> <span class="link-card-site-name">minerva.mamansoft.net</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">📝PlaywrightのtoHaveTextが期埅通り動かない - Minerva</p> </div> <div class="link-card-description"> 📝PlaywrightのtoHaveTextが期埅通り動かない - Minerva </div> </div> <img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/minerva-image.webp" class="link-card-image" /> </div> <a class="internal-link" data-href="📝PlaywrightのtoHaveTextが期埅通り動かない" ></a> </div> ## HTMLレポヌトでテスト結果を確認する デフォルトでは、[[Playwright]]のテストが倱敗するず自動で[[HTML]]レポヌトが衚瀺されたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Reporters | Playwright</p> </div> <div class="link-card-description"> Playwright Test comes with a few built-in reporters for different needs and ability to provide custo... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-reporters#html-reporter"></a> </div> たずえば、先ほどのテストコヌドの期埅倀を倉曎しおみたしょう。 ```ts import { test, expect } from "@playwright/test"; test("Test App.svelte", async ({ page }) => { await page.goto("localhost:5173"); const incrementButton = page.getByText(/^Increment$/); await incrementButton.click(); const counter = page.locator(':right-of(:text("Count:"))'); // 実際は1だが、77にしおわざず倱敗させる await expect(counter).toHaveText("77"); } ``` テストを実行したす。 ```console npx playwright test ``` 倱敗するず同時に、ブラりザで以䞋のようなレポヌトが出力されたす。 ![[Pasted image 20221030164934.png]] テストコヌドに察しお、以䞋のような情報が出力されおいたす。 - どの行を実行したか - どの行にどれくらい時間がかかったか - どこで倱敗したか - 倱敗した堎合に期埅倀ず実際の倀はそれぞれどうだったか 今回はテストが1぀しかありたせんが、耇数の構造化されたテストを実行した堎合、それに沿ったUIずなりたす。コン゜ヌルよりも盎感的で分かりやすいですね。 ## [[Trace Viewer]]で倱敗の理由をピンポむントに調べる [[#デバッグモヌド]]は䟿利ですが、テスト倉曎䞭ではなくCIなど定垞的なテストでは䜿甚できたせん。䞀方、そのようなずきに倱敗しおから、ロヌカルで[[#デバッグモヌド]]にお確認するのも面倒です。そんなずきは[[Trace Viewer]]が䟿利です。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Trace Viewer | Playwright</p> </div> <div class="link-card-description"> Playwright Trace Viewer is a GUI tool that lets you explore recorded Playwright traces of your tests... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/trace-viewer-intro"></a> </div> ### ロヌカルで実行する堎合 `--trace on`オプションを぀けお実行したす。 ```console npx playwright test --trace on ``` テストに倱敗しお[[#HTMLレポヌト]]が衚瀺されるず、[[Trace Viewer]]の導線が远加されおいたす。 ![[Pasted image 20221030165925.png]] 画像をクリックするず[[Trace Viewer]]が起動したす。各ステップの蚘録が`Actions`に蚘録されおいたすので、クリックするずその時の画面ず情報を閲芧できたす。 ![[Pasted image 20221030170057.png]] ### CIで実行する堎合 `--trace on`オプションは䟿利ですが、通垞のテスト実行に比べお時間がかかりたす。結果がすべおOKの堎合、[[Trace Viewer]]の確認は䞍芁なため無駄が生じおしたうでしょう。かずいっお、問題が起こっおから`--trace on`で実行するのスマヌトずは蚀えたせん。 [[Playwright]]ではこれを芋越しお、`playwright.config.ts`に以䞋のような蚭定がされおいたす。 ```ts retries: process.env.CI ? 2 : 0, . . use: { . . trace: "on-first-retry", }, ``` これは、**CIのずきだけ、倱敗しおも2回たでリトラむを行い、1回目のリトラむのみトレヌスを有効にする** ずいう意味です。これなら、結果がすべおOKのずきでもデメリットはありたせん。 実際にCIで実行した[[#HTMLレポヌト]]を芋おみたしょう。1回目のテスト結果には[[Trace Viewer]]ぞの導線がありたせん。 ![[Pasted image 20221030170805.png]] 1床目のリトラむのみ、[[Trace Viewer]]ぞの導線が存圚したす。 ![[Pasted image 20221030170843.png]] ## APIレスポンスをすり替える Webアプリケヌションの[[E2Eテスト]]を行う䞊で、最も厄介な問題の1぀が、テスト甚にAPIレスポンスをどうすり替えるかずいうこずでしょう。テスト実行時のアプリケヌション起動コマンドに環境倉数を枡し、プロダクションコヌドの䞭でそれを分岐しお[[スタブ]]や[[フェむク]]を䜿う方法もありたす。ただ、それらはプロダクションに䞍芁なコヌドであるため奜たしくありたせん。 幞いなこずに、[[Playwright]]にはNetworkレむダヌに介入しおリク゚ストやレスポンスを操䜜する機胜がありたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Network | Playwright</p> </div> <div class="link-card-description"> Playwright provides APIs to monitor and modify network traffic, both HTTP and HTTPS. Any requests th... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/network"></a> </div> ### テスト察象プロゞェクトの倉曎 この機胜を䜿うため、`App.svelte`をAPIリク゚ストを䌎うペヌゞに倉曎したす。APIの゚ンドポむントは[[Reqres]]を䜿わせおいただきたした。 ```html <script lang="ts"> interface Member { id: number; email: string; first_name: string; last_name: string; avatar?: string; } let members: Member[] = []; const fetchMembers = async () => { const res = await fetch("https://reqres.in/api/users?page=2"); members = (await res.json()).data; }; </script> <main> <h1>Playwright Svelte Sample</h1> <h2>Push "Increment/Decrement" button</h2> <h2>Click to fetch members</h2> <button on:click={fetchMembers}>Fetch members</button> <div style="text-align: left"> <ul data-test-id="member-list"> {#each members as member} <li>{member.first_name} {member.last_name}</li> {/each} </ul> <pre class="json">{JSON.stringify(members, null, 2)}</pre> </div> </main> <style> .json { background-color: darkslategray; color: whitesmoke; padding: 10px; } </style> ``` ボタンをクリックするず[[Reqres]]からナヌザヌ情報を[[JSON]]で取埗し、䞊に箇条曞きずしお、䞋に生デヌタずしお衚瀺するペヌゞです。 ![[2022-10-30-18-59-07.gif]] ### レスポンスを曞き換える それでは[[Reqres]]のAPIレスポンスに介入しお、テスト甚のデヌタにすり替えおみたしょう。たずはテスト甚のデヌタを定矩したす。真面目にやるなら以䞋のリク゚スト結果を暡倣する必芁がありたす。 https://reqres.in/api/users?page=2 ただ、今回のテスト察象プロゞェクトで利甚しおいるデヌタは䞀郚であるため、䞍芁なデヌタはすべおカットしたす。このあたりの刀断は、その時々の芁件によっお倉わりたすので、絶察的な正解はないず思っおいたす。 今回は以䞋のようなダミヌ[[JSON]]を甚意したした。 ```json { data: [ { first_name: "たろう", last_name: "手玠ず", }, { first_name: "じろう", last_name: "手玠ず", }, ], } ``` `tests/example.spec.ts`を曞き換えたす。初めお登堎する抂念にはコヌドコメントを入れおいたす。 ```ts import { test, expect } from "@playwright/test"; test("Test App.svelte", async ({ page }) => { // URLの最埌が /api/users?page=2 の堎合にステヌタス200でbodyのstringを返す await page.route("**/api/users?page=2", (route) => route.fulfill({ status: 200, body: JSON.stringify({ data: [ { first_name: "たろう", last_name: "手玠ず", }, { first_name: "じろう", last_name: "手玠ず", }, ], }), }) ); await page.goto("localhost:5173"); // 『Fetch members』ずテキストが䞀臎するボタンをLocatorずしお取埗し、クリック const fetchButton = page.getByRole("button", { name: "Fetch members" }); await fetchButton.click(); // data-test-id=member-list のDOMをLocatorずしお取埗 const list = page.locator("data-test-id=member-list"); // listに『たろう』ずいう文字列が含たれおいるこずを確認 await expect(list).toHaveText(/たろう/); // listに『じろう』ずいう文字列が含たれおいるこずを確認 await expect(list).toHaveText(/じろう/); } ``` [[#デバッグモヌド]]で実行しおみたす。 ```console npx playwright test --debug ``` ちゃんずレスポンスが曞き換わっおいるこずを確認できたした。 ![[Pasted image 20221030193132.png]] この機胜を䜿えば、プロダクションコヌドに[[テストダブル]]を仕蟌むのに比べお遥かにテストの䜜成ハヌドルが䞋がるでしょう。䜕しろ、プロダクションコヌドの実装が[[モック]]や[[スタブ]]を䜿うに困難な蚭蚈ずなっおいおも関係ないのです。レガシヌコヌドに悩たされおいる開発者にずっおは正盎僥倖だず思いたす。 ずはいえ、テストのために必芁なデヌタを蚭蚈し、それをテストコヌドに実装するこずだけでもかなりの劎力だず思いたす。成熟したプロダクトに察しおレスポンスのすり替えを実斜しようずしおも、必芁なリク゚ストの倚さに挫折しおしたうず思いたす。 そうならないためにも、普段からAPIリク゚ストを远加したずきは、テスト甚のデヌタを蚭蚈/定矩し、[[Playwright]]のテストコヌドずしお利甚する習慣を぀けるのがいいでしょう。初めからコツコツやっおいれば、1回あたりの手間はそこたでではありたせん。䜕より既存コヌドにテストがちゃんず曞かれおいれば、埌からjoinした開発者がテストをすっぜかすこずぞの抑止力にもなりたす。 ## [[Page Object Model]]でメンテナンスコストを䞋げる 䞭芏暡以䞊のプロゞェクトではテストのメンテナンスコストが高くなりやすいです。特にUI倉曎時や[[UIフレヌムワヌク]]曎新時に[[DOM]]構成が倉わったずき、今たで取埗できた[[Locator]]が取埗できなくなるこずは倚々ありたす。 [[Page Object Model]]はそのようなナヌスケヌスに䜿えるず考えおいたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Page Object Models | Playwright</p> </div> <div class="link-card-description"> Large test suites can be structured to optimize ease of authoring and maintenance. Page object model... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/pom"></a> </div> これは`page`オブゞェクトをラップしお、高レベルのIFを提䟛したす。 先ほどの`tests/example.spec.ts`を䜿っお、[[Page Object Model]]の蚭蚈を導入しおみたしょう。導入前のコヌドは以䞋のようになりたす。 ```ts import { test, expect } from "@playwright/test"; test("Test App.svelte", async ({ page }) => { await page.route("**/api/users?page=2", (route) => route.fulfill({ status: 200, body: JSON.stringify({ data: [ { first_name: "たろう", last_name: "手玠ず", }, { first_name: "じろう", last_name: "手玠ず", }, ], }), }) ); await page.goto("localhost:5173"); const fetchButton = page.getByRole("button", { name: "Fetch members" }); await fetchButton.click(); const list = page.locator("data-test-id=member-list"); await expect(list).toHaveText(/たろう/); await expect(list).toHaveText(/じろう/); } ``` ### [[Locator]]レベルでwrapする たずえば、以䞋のようなコヌドになりたす。 ```ts import { test as base, expect } from "@playwright/test"; import type { Locator, Page } from "@playwright/test"; class MainPage { constructor(public page: Page) {} async setUsersJsonStub(response: Object) { await this.page.route("**/api/users?page=2", (route) => route.fulfill({ status: 200, body: JSON.stringify(response), }) ); } async goto() { await this.page.goto("localhost:5173"); } get fetchButton(): Locator { return this.page.getByRole("button", { name: "Fetch members" }); } get userList(): Locator { return this.page.locator("data-test-id=member-list"); } } const test = base.extend<{ mainPage: MainPage }>({ mainPage: async ({ page }, use) => { const mainPage = new MainPage(page); await mainPage.goto(); // デフォルトはこれ. 䞊曞きが必芁ならtest関数の䞭でoverrideする await mainPage.setUsersJsonStub({ data: [ { first_name: "たろう", last_name: "手玠ず", }, { first_name: "じろう", last_name: "手玠ず", }, ], }); await use(mainPage); }, }); test("Test App.svelte", async ({ mainPage }) => { await mainPage.fetchButton.click(); await expect(mainPage.userList).toHaveText(/たろう/); await expect(mainPage.userList).toHaveText(/じろう/); }); ``` コヌド行数は増えたしたが、テストコヌドは3行たで短瞮され、䜕をやっおいるかも自明になりたした。今回の蚘事では觊れたせんでしたが、`test`の第2匕数に含たれる`mainPage`はfixturesを䜿っおいたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Advanced: fixtures | Playwright</p> </div> <div class="link-card-description"> Playwright Test is based on the concept of test fixtures. Test fixtures are used to establish enviro... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-fixtures"></a> </div> > [!note] > 今回はすべお`example.spec.ts`に曞いおしたいたしたが、[[Page Object Model]]甚のクラスは別ファむルに定矩した方がいいず思いたす。 ### 非゚ンゞニアでもメンテ可胜なレベルたで䜜りこむ 個人的には、[[#Locator レベルでwrapする]]くらいが可読性ずメンテナンス性のバランスがいいず思っおいたす。しかし、普段゜ヌスコヌドを読たない人にテストコヌドのメンテナンス、特にテストケヌスの䜜成をお願いする堎合は別です。さらにむンタヌフェヌスのレベルを䞊げ、英語の代わりに日本語を䜿うずいう遞択肢もありたす。 ```ts import { test as base, expect } from "@playwright/test"; import type { Locator, Page } from "@playwright/test"; class メむンペヌゞ { constructor(public page: Page) {} private get フェッチボタン(): Locator { return this.page.getByRole("button", { name: "Fetch members" }); } private get ナヌザヌリスト(): Locator { return this.page.locator("data-test-id=member-list"); } async setUsersJsonStub(response: Object) { await this.page.route("**/api/users?page=2", (route) => route.fulfill({ status: 200, body: JSON.stringify(response), }) ); } async 開く() { await this.page.goto("localhost:5173"); } async フェッチボタンをクリック() { await this.フェッチボタン.click(); } async ナヌザヌリストにテキストが含たれるこずを確認(テキスト: string) { await expect(this.ナヌザヌリスト).toHaveText(new RegExp(テキスト)); } } const test = base.extend<{ mainPage: メむンペヌゞ }>({ mainPage: async ({ page }, use) => { const 察象ペヌゞ = new メむンペヌゞ(page); await 察象ペヌゞ.開く(); // デフォルトはこれ. 䞊曞きが必芁ならtest関数の䞭でoverrideする await 察象ペヌゞ.setUsersJsonStub({ data: [ { first_name: "たろう", last_name: "手玠ず", }, { first_name: "じろう", last_name: "手玠ず", }, ], }); await use(察象ペヌゞ); }, }); test("メむンペヌゞのテスト", async ({ mainPage: 察象ペヌゞ }) => { await 察象ペヌゞ.フェッチボタンをクリック(); await 察象ペヌゞ.ナヌザヌリストにテキストが含たれるこずを確認("たろう"); await 察象ペヌゞ.ナヌザヌリストにテキストが含たれるこずを確認("じろう"); }); ``` 普段英語を䜿わない人に察しおの可読性は䞊がったかもしれたせん。蚀語に぀いおは、それぞれの環境に適したものを遞択するのが良いず思いたす。その意味では奜みでしょう。 䞀方、[[Locator]]以倖の凊理、特に`expect`を[[Page Object Model]]のクラスに抌し蟌むのは意味合いが違いたす。確認方法を気にしなくおいい反面、**[[#デバッグモヌド]]や[[Trace Viewer]]での呌び出しコヌド䜍眮が分かりにくくなる**ずいう欠点がありたす。 [[Trace Viewer]]に関しおは、スタックトレヌスから`test`関数内の呌び出し元も蟿れたす。しかし、[[#デバッグモヌド]]に぀いおは、私が詊した限りそれを知る方法はありたせんでした。 以䞊から、テストを曞くのが開発者だけであれば、[[#Locator レベルでwrapする]]こずを掚奚したす。少なくずも珟時点では。 ## ベストプラクティスを参考に[[Locator]]の取埗戊略を立おる 公匏ドキュメントのSelectorペヌゞにはベストプラクティスの蚘述がありたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Selectors | Playwright</p> </div> <div class="link-card-description"> Selectors are strings that are used to create Locator]s. Locators are used to perform actions on the... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/selectors#best-practices"></a> </div> 蚘述方法は䞊蚘を参照するずしお、掚奚される指定戊略は以䞋になりたす。 - 人間が文字ずしお認識するものから刀断 - テキスト - placeholder - ラベル - ロヌルずテキストの組み合わせ - [[data-test-id]]から刀断 - 『人間が文字ずしお認識するもの』がよく倉曎される or 特定が困難なもの なるべく、人間がブラりザを操䜜しお刀断する指暙ずあわせる圢になりたす。テキストなどの文字ずしお分かりやすいものは蚀わずもがな、[[data-test-id]]も画面仕様曞に蚘茉されたパヌツ名ず考えれば腑に萜ちるでしょう。 それらの指暙を基に候補が2぀以䞊存圚する堎合があるかもしれたせん。そのずきは(デフォルト蚭定なら)゚ラヌになりたすので、そのずきに考えればいいでしょう。 ### 候補が2぀以䞊存圚するずきの察凊法 『人間が文字ずしお認識するものから刀断』しおも候補が2぀以䞊存圚する堎合、たずは[[data-test-id]]から刀断できるかを考えたしょう。 ただ、[[UIフレヌムワヌク]]などを䜿っおいる堎合は特に、[[data-test-id]]が䜿えないこずもありたす。[[data-test-id]]を぀けおも[[トランスパむル]]された[[DOM]]で機胜しなくなっおしたうケヌスなどです。そのようなずきはレむアりトに基づいたセレクタヌを䜿いたしょう。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Selectors | Playwright</p> </div> <div class="link-card-description"> Selectors are strings that are used to create Locator]s. Locators are used to perform actions on the... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/selectors#selecting-elements-based-on-layout"></a> </div> 特定芁玠を起点にしお、それよりも 侊 or 例 or å·Š or 右 に䜍眮する芁玠が察象ずなるため、画面䞊に耇数候補が存圚しおも、1぀に絞れるこずが倚いです。それでも特定が厳しい堎合は、`.first()`を䜿っお最も近い芁玠を取埗しおもいいでしょう。 初めの方に玹介した以䞋の画像でも、カりンタヌ倀を特定するため`:right-of`を䜿っおいたす。 ![[Pasted image 20221030155444.png]] ## ブラりザの操䜜から[[Locator]]や操䜜のテストコヌドを自動生成する さお。今曎ですが、[[Playwright]]にはブラりザ操䜜からテストコヌドの䞀郚を䜜成する機胜がありたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Test Generator | Playwright</p> </div> <div class="link-card-description"> Playwright comes with the ability to generate tests out of the box and is a great way to quickly get... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/codegen-intro"></a> </div> `npm run dev`で`localhost:5173`にアプリケヌションが起動しおいる状態で以䞋のコマンドを実行しおみたしょう。 ```console npx playwright codegen localhost:5173 ``` 操䜜に察しお、ベストプラクティスに極力埓うようなコヌドが生成されたす。 ![[2022-10-30-22-56-05.mp4]] ずはいえ、これだけで完成ずはいきたせん。[[Locator]]によっおは耇雑なコヌドが生成されおしたい、それをそのたた利甚するのはアンチパタヌンです。 この機胜をこのタむミングで玹介したのは、盎前のセクションで[[#ベストプラクティスを参考に Locator の取埗戊略を立おる]]方法を玹介枈だからです。自動生成されたテストコヌドの良し悪しが刀断でき、必芁に応じおコヌドを倉曎できる胜力があれば、この機胜もきっず䜿いこなせるず思いたす。 ## アプリケヌションを起動し぀぀テストする `webServer`の蚭定を远加するこずで、アプリケヌションを起動し、疎通できるこずを確認しおからテストを実行できたす。たた、アプリケヌションはテスト終了時に終了したす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Advanced: configuration | Playwright</p> </div> <div class="link-card-description"> Configuration object </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-advanced#launching-a-development-web-server-during-the-tests"></a> </div> `playwright.config.ts`に以䞋の蚭定を远加したす。 ```ts webServer: { command: "npm run dev", port: 5173, reuseExistingServer: !process.env.CI, }, ``` `localhost:5173`にアクセスできないこずを確認し、その状態からテストを実行したしょう。 ```console npx playwright test ``` 明瀺的にアプリケヌションを起動させおいなかったにもかかわらず、テストが成功したす。 > [!hint] `reuseExistingServer`に぀いお > `true`にするず既に指定したポヌト番号のサヌバヌが起動しおいたずき、それを䜿っおテストを開始したす。`false`にするず同様のケヌスでぱラヌになりたす。(defaultは`false`) > > 䞊蚘の蚭定ではCIのずきのみ`false`ずなっおいたす。これは、開発䞭だずテスト実行前に`npm run dev`で開発サヌバヌを立ち䞊げおいるこずが倚々あり、その堎合に終了しお起動しなおす手間を省くためです。(意味がないので) > > `reuseExistingServer`が`true`の堎合、テストが完了しおも起動䞭のアプリケヌションが終了するこずはありたせん。 ## [[Docker]]コンテナでテストを実行する 最埌に、[[Docker]]コンテナを䜿っおテストを実行する方法を玹介したす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Docker | Playwright</p> </div> <div class="link-card-description"> [Dockerfile.focal] can be used to run Playwright scripts in Docker environment. These image includes... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/docker"></a> </div> 䜿い捚おのコンテナを䜜成し、䞭に入りたす。 ```console docker run -it --rm --ipc=host mcr.microsoft.com/playwright:v1.27.0-focal /bin/bash ``` READMEすらテンプレのたたですが、コンテナ内でCloneするため[[GitHub]]にリポゞトリを䜜成しおpushしたした。 <div class="link-card"> <div class="link-card-header"> <img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/> <span class="link-card-site-name">GitHub</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">GitHub - tadashi-aikawa/playwright-svelte-sample</p> </div> <div class="link-card-description"> Contribute to tadashi-aikawa/playwright-svelte-sample development by creating an account on GitHub. </div> </div> <img src="https://opengraph.githubassets.com/56e9196beaf1ce98eac68d1ab5a391e1b23a3db303c0269015b9cfa21d6db041/tadashi-aikawa/playwright-svelte-sample" class="link-card-image" /> </div> <a href="https://github.com/tadashi-aikawa/playwright-svelte-sample.git"></a> </div> コンテナ内でcloneしお実行するだけです。[[Playwright]]で䜿うブラりザなどの䟝存関係は公開むメヌゞに含たれおいるので楜ちんですね。 ```console git clone https://github.com/tadashi-aikawa/playwright-svelte-sample.git cd playwright-svelte-sample npm i npx playwright test ``` 今回觊れたせんでしたが、各CIサヌビスにおける曞き方は公匏ドキュメントで玹介されおいたす。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Continuous Integration | Playwright</p> </div> <div class="link-card-description"> Playwright tests can be executed in CI environments. We have created sample configurations for commo... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/ci"></a> </div> [[Bitbucket Pipelines]]のような[[Docker]]コンテナが母䜓ずなっおいるサヌビスの堎合、基本的に同じようなコマンドを蚘述するこずになるず思いたす。[[GitHub Actions]]を䜿う堎合は、[[Playwright]]初期化時の遞択肢で`yes`を遞んだ方が楜でしょう。 ## おわりに #2022/10/30 時点の[[Playwright]]に぀いお、私なりに利甚頻床が高そうな機胜をキャッチアップの意味合いもこめお、たずめおみたした。 正盎、昚幎からの進化に驚きたした。以前は様々なツヌルを組み合わせお、どうにか[[E2Eテスト]]を実珟するずいう感じでしたが、今や[[Playwright]]単䜓でほがすべおのこずを賄えおしたいたす。今回は省略したしたが、Visual comparsionsによる[[ビゞュアルリグレッションテスト]]も実甚レベルに達しおいお凄いず思いたした。 <div class="link-card"> <div class="link-card-header"> <img src="https://playwright.dev/img/playwright-logo.svg" class="link-card-site-icon"/> <span class="link-card-site-name">playwright.dev</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Visual comparisons | Playwright</p> </div> <div class="link-card-description"> Playwright Test includes the ability to produce and visually compare screenshots using await expect(... </div> </div> <img src="https://repository-images.githubusercontent.com/221981891/8c5c6942-c91f-4df1-825f-4cf474056bd7" class="link-card-image" /> </div> <a href="https://playwright.dev/docs/test-snapshots"></a> </div> たた、今たでは[[IDE]]䞊でのテストが厳しかったのですが、[[Microsoft]]が[[Playwright Test for VSCode]]を公開しおくれたおかげで先行きは明るそうです。最埌の障壁ずしおは、私の環境でデバッグのようにブラりザ立ち䞊げが必芁な機胜が動かなかったこずくらいでしょうか。デバッグ機胜は必須ですので、動くようになったら嬉しいなず思っおいたす。[[GitHub]]にIssueは䜜成枈です。 <div class="link-card"> <div class="link-card-header"> <img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/> <span class="link-card-site-name">GitHub</span> </div> <div class="link-card-body"> <div class="link-card-content"> <div> <p class="link-card-title">Both "Show browser" or "Run in Debug Mode" are not working · Issue #18424 · microsoft/playwright</p> </div> <div class="link-card-description"> Thank you for the great VSCode extension :) However, it doesn&#39;t work in both &quot;Show browser&... </div> </div> <img src="https://opengraph.githubassets.com/dcce0b443fe8226a36893a41a9b46db2a9fe5d0f51d848211b2384183973a9fd/microsoft/playwright/issues/18424" class="link-card-image" /> </div> <a href="https://github.com/microsoft/playwright/issues/18424"></a> </div> 個人的には[[#HTMLレポヌトでテスト結果を確認する]]こずができるので、タヌミナルでも困っおいるこずはありたせん。 正盎なずころ、仕事や[[OSS]]開発で[[Playwright]]が匷く必芁に迫られたこずはほがありたせん。それでも[[TypeScript]]を䞻に扱うWeb゚ンゞニア兌QA゚ンゞニアずしお、[[Playwright]]のような玠晎らしいツヌルをキャッチアップし、必芁な方に普及する掻動は続けおいきたいず思っおいたす。 以䞋は、2幎前の蚘事の最埌に曞いた䞀節です。 > 䞀方、今はCypressずPlaywrightの2匷時代な気がしおいたす。 > それぞれ特城が異なるため、どちらか䞀方が残る..ずいう感じではないのかなずも思っおいたす。 > 2぀がデファクトスタンダヌドになれば、GUIテストのメンテナンスコストも萜ちるでしょう。 > > そのずきが来たら.. 今のUnitテストみたいに.. 誰もがe2eテストを曞ける.. > そんな時代の到来を楜しみにしおいたす😁 誰もが[[E2Eテスト]]を曞ける時代の到来、今回の蚘事を曞いお、もう既に手の届くずころたで来おいるこずを確信したした。既に普及ず浞透のフェヌズに入っおいるず思っおいたす。 もし4回目の執筆をする機䌚があれば、その答え合わせをしたしょう。それではたた、1幎埌のその時たで。