{"id":38,"date":"2023-02-11T05:57:43","date_gmt":"2022-08-10T22:00:09","guid":{"rendered":"https:\/\/www.silicloud.com\/ja\/blog\/index.php\/2023\/11\/30\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/"},"modified":"2025-07-31T13:35:16","modified_gmt":"2025-07-31T04:35:16","slug":"react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/","title":{"rendered":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5"},"content":{"rendered":"<p>\u4f5c\u8005\u306f\u3001\u66f8\u304d\u7269\u5bc4\u4ed8\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4e00\u74b0\u3068\u3057\u3066\u3001Open Sourcing Mental Illness\u3092\u5bc4\u4ed8\u306e\u5bfe\u8c61\u306b\u9078\u3073\u307e\u3057\u305f\u3002<\/p>\n<h3>\u4ee5\u4e0b\u306f\u65e5\u672c\u8a9e\u3067\u81ea\u7136\u306a\u8868\u73fe\u306b\u8a00\u3044\u63db\u3048\u305f\u3082\u306e\u3067\u3059\u3002\uff11\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/h3>\n<p>\u7d39\u4ecb<\/p>\n<p>\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u88fd\u54c1\u304c\u671f\u5f85\u3069\u304a\u308a\u306b\u52d5\u4f5c\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3001\u30c6\u30b9\u30c8\u306f\u975e\u5e38\u306b\u91cd\u8981\u3067\u3059\u3002\u5f93\u6765\u3001QA\u30c1\u30fc\u30e0\u306f\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a8\u30f3\u30c9\u30c4\u30fc\u30a8\u30f3\u30c9\u306e\u30c6\u30b9\u30c8\u3092\u624b\u52d5\u3067\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u591a\u304b\u3063\u305f\u3067\u3059\u3002\u3057\u304b\u3057\u3001QA\u30c1\u30fc\u30e0\u306f\u30c6\u30b9\u30c8\u306e\u30c7\u30fc\u30bf\u306e\u6e96\u5099\u3001\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u3001\u305d\u3057\u3066\u30c6\u30b9\u30c8\u306e\u7dad\u6301\u306b\u591a\u304f\u306e\u6642\u9593\u3092\u304b\u3051\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001\u3053\u308c\u3089\u306e\u30c6\u30b9\u30c8\u306f\u8907\u6570\u306e\u30b5\u30fc\u30d3\u30b9\u3001\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u306e\u4f9d\u5b58\u95a2\u4fc2\u3001\u304a\u3088\u3073\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u9593\u306e\u7d71\u5408\u3092\u5fc5\u8981\u3068\u3059\u308b\u305f\u3081\u3001\u4e0d\u5b89\u5b9a\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u554f\u984c\u304b\u3089\u3001\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u304c\u91cd\u8981\u3067\u3042\u308a\u3001\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u958b\u767a\u8005\u3068QA\u30a8\u30f3\u30b8\u30cb\u30a2\u306e\u4e21\u65b9\u304b\u3089\u307e\u3059\u307e\u3059\u6ce8\u76ee\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306b\u3088\u308a\u3001\u5f7c\u3089\u306f\u30b0\u30e9\u30d5\u30a3\u30ab\u30eb\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\uff08GUI\uff09\u3092\u65e9\u671f\u306b\u30c6\u30b9\u30c8\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u3001\u4f5c\u6210\u3001\u5b9f\u884c\u3001\u304a\u3088\u3073\u7dad\u6301\u306b\u5fc5\u8981\u306a\u6642\u9593\u3068\u52b4\u529b\u3092\u524a\u6e1b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u6700\u8fd1\u3001\u4e00\u822c\u7684\u306a\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u3068\u306e\u30a8\u30f3\u30c9\u30c4\u30fc\u30a8\u30f3\u30c9\u30c6\u30b9\u30c8\u3084\u5bfe\u8a71\u7684\u306a\u30c6\u30b9\u30c8\u306b\u4fbf\u5229\u306a\u30c4\u30fc\u30eb\u3067\u3042\u308bPlaywright\u304c\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u59cb\u3081\u307e\u3057\u305f\u3002Playwright\u306f\u3001\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u30b5\u30fc\u30d3\u30b9\u306e\u5b8c\u4e86\u3092\u5f85\u305f\u305a\u306bGUI\u306e\u30c6\u30b9\u30c8\u3092\u958b\u767a\u8005\u304c\u8a18\u8ff0\u3067\u304d\u308b\u3060\u3051\u3067\u306a\u304f\u3001\u30e2\u30c3\u30af\u30b5\u30fc\u30d0\u306b\u5927\u91cf\u306e\u30e2\u30c3\u30afAPI\u3092\u4f5c\u6210\u3059\u308b\u5fc5\u8981\u3082\u3042\u308a\u307e\u305b\u3093\u3002\u3055\u3089\u306b\u3001Playwright\u306fReact\u3068\u3044\u3046\u4eba\u6c17\u306e\u3042\u308b\u30a6\u30a7\u30d6\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u306f\u3058\u3081\u3068\u3059\u308b\u3044\u304f\u3064\u304b\u306e\u30a6\u30a7\u30d6\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001Chromium\u3001Firefox\u3001\u304a\u3088\u3073WebKit\u30d9\u30fc\u30b9\u306e\u30d6\u30e9\u30a6\u30b6\u306a\u3069\u306e\u4e3b\u8981\u306a\u30d6\u30e9\u30a6\u30b6\u3082\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002Playwright\u3067\u306f\u3001Java\u3001Python\u3001C\uff03\u3001\u307e\u305f\u306fNode.js\u306a\u3069\u306e\u8907\u6570\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u8a00\u8a9e\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30b9\u30c8\u3092\u8a18\u8ff0\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u306f\u3001\u65e2\u5b58\u306eReact\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306bPlaywright\u3092\u4f7f\u7528\u3057\u3066\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002React\u3092\u4f7f\u7528\u3057\u3066\u5929\u6c17\u30a2\u30d7\u30ea\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u3001\u305d\u306e\u5f8c\u3001Playwright\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u3001\u5b9f\u884c\u3057\u3066\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u6b63\u5e38\u306b\u52d5\u4f5c\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<h2>\u524d\u63d0\u6761\u4ef6<\/h2>\n<p>\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306b\u5f93\u3046\u305f\u3081\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u3082\u306e\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<ul class=\"post-ul\">\n<li>An Ubuntu 20.04 server with a sudo-enabled, non-root user and at least 2GB of RAM. To get started, follow our Initial Server Setup Guide for Ubuntu 20.04.<\/li>\n<li>Node.js version 16 or greater set up on your server. To install Node.js, follow Option 2 of our tutorial How To Install Node.js on Ubuntu 20.04 to ensure you are installing the correct version.<\/li>\n<li>Git installed on the server. Read our tutorial How To Install Git on Ubuntu 20.04 to install Git if it is not already installed.<\/li>\n<li>Familiarity with front-end development using JavaScript with React.<\/li>\n<li>Knowledge of end-to-end testing, unit testing, and API testing.<\/li>\n<\/ul>\n<h2>\u30b9\u30c6\u30c3\u30d71 \u2014 React\u3092\u4f7f\u7528\u3057\u3066\u5929\u6c17\u30a2\u30d7\u30ea\u3092\u5c55\u958b\u3059\u308b\u3002<\/h2>\n<p>\u3053\u306e\u624b\u9806\u3067\u306f\u3001\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3067\u5fc5\u8981\u306aReact\u30d9\u30fc\u30b9\u306e\u5929\u6c17\u30a2\u30d7\u30ea\u3092\u5c55\u958b\u3057\u307e\u3059\u3002\u3053\u306e\u30a2\u30d7\u30ea\u306f\u3001OpenWeather\u306eAPI\u306e\u7121\u6599\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u3066\u3001\u4efb\u610f\u306e\u90fd\u5e02\u306e\u73fe\u5728\u306e\u5929\u6c17\u30c7\u30fc\u30bf\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002<\/p>\n<p>\u30a2\u30d7\u30ea\u3092\u30b5\u30fc\u30d0\u30fc\u306b\u914d\u7f6e\u3059\u308b\u305f\u3081\u306b\u3001\u307e\u305a\u65b0\u3057\u3044\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u3066\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u4fdd\u5b58\u3057\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u65b0\u3057\u304f\u4f5c\u6210\u3057\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 &#8220;Projects&#8221; \u306f\u3054\u5e0c\u671b\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d\u3067\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">mkdir<\/span> <mark>Projects<\/mark>\r\n<span class=\"token builtin class-name\">cd<\/span> <mark>Projects<\/mark>\r\n<\/code><\/pre>\n<p>\u6b21\u306b\u3001GitHub\u304b\u3089\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30fc\u30c9\u3092\u30af\u30ed\u30fc\u30f3\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">git<\/span> clone https:\/\/github.com\/do-community\/react-component-testing-demo.git\r\n<\/code><\/pre>\n<p>\u305d\u306e\u5f8c\u3001react-component-testing-demo\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u3001git checkout\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u306e\u30d6\u30e9\u30f3\u30c1\u3092\u30c1\u30a7\u30c3\u30af\u30a2\u30a6\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token builtin class-name\">cd<\/span> react-component-testing-demo\r\n<span class=\"token function\">git<\/span> checkout app\r\n<\/code><\/pre>\n<p>\u6b21\u306b\u3001\u5929\u6c17\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span>\r\n<\/code><\/pre>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u958b\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">npm<\/span> run start\r\n<\/code><\/pre>\n<p>\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u306f\u3001\u6b21\u306e\u51fa\u529b\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Compiled successfully! You can now view demo-playwright-component-testing in the browser. Local: http:\/\/localhost:3000\/demo-playwright-component-testing On Your Network: http:\/\/192.168.1.7:3000\/demo-playwright-component-testing Note that the development build is not optimized.<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a<br \/>\n\u3082\u3057\u3001\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30b0\u30e9\u30d5\u30a3\u30ab\u30eb\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\uff08GUI\uff09\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u3067\u5b9f\u884c\u3057\u3001\u65e2\u306bChrome\u307e\u305f\u306fFirefox\u306a\u3069\u306e\u30d6\u30e9\u30a6\u30b6\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u51fa\u529b\u306b\u8868\u793a\u3055\u308c\u308bURL\uff08http:\/\/localhost:3000\/demo-playwright-component-testing\uff09\u306b\u79fb\u52d5\u3059\u308b\u3068\u3001\u5929\u6c17\u30a2\u30d7\u30ea\u304c\u958b\u304d\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u3082\u3057\u30ea\u30e2\u30fc\u30c8\u30b5\u30fc\u30d0\u30fc\u4e0a\u3067\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408\u306f\u3001SSH\u3092\u4ecb\u3057\u305f\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u4f7f\u7528\u3057\u3066\u30a2\u30d7\u30ea\u3092\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u3067\u958b\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u65b0\u3057\u3044\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\uff1a<br \/>\nssh -L 3000:localhost:3000 your_non_root_user@your_server_ip<br \/>\n\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u305f\u3089\u3001\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u306e\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b6\u3067http:\/\/localhost:3000\/demo-playwright-component-testing\u306b\u79fb\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306e\u6b8b\u308a\u306e\u90e8\u5206\u3067\u306f\u30012\u756a\u76ee\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u3092\u958b\u3044\u305f\u307e\u307e\u306b\u3057\u3066\u304a\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/div>\n<\/div>\n<p>\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u306b\u3088\u308a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30db\u30fc\u30e0\u30da\u30fc\u30b8\u304c\u958b\u304b\u308c\u3001\u30e6\u30fc\u30b6\u30fc\u306f\u5929\u6c17\u3092\u78ba\u8a8d\u3057\u305f\u3044\u90fd\u5e02\u3092\u5165\u529b\u3059\u308b\u305f\u3081\u306e\u90fd\u5e02\u691c\u7d22\u30dc\u30c3\u30af\u30b9\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/24-0.png\" alt=\"Home page of the weather application\" \/><\/div>\n<p>\u691c\u7d22\u30dc\u30c3\u30af\u30b9\u306b\u30cf\u30ce\u30a4\uff08\u30d9\u30c8\u30ca\u30e0\u306b\u3042\u308b\u90fd\u5e02\uff09\u3068\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30a2\u30d7\u30ea\u306f\u30cf\u30ce\u30a4\u306e\u73fe\u5728\u306e\u5929\u6c17\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/26-0.png\" alt=\"Current weather in Hanoi\" \/><\/div>\n<p>\u7d50\u679c\u306b\u3088\u308c\u3070\u3001\u691c\u7d22\u304c\u5b9f\u884c\u3055\u308c\u305f\u6642\u70b9\u3067\u3001\u30d9\u30c8\u30ca\u30e0\u306e\u30cf\u30ce\u30a4\u306e\u5929\u6c17\u306f27\u00b0C\u3067\u3001\u6563\u5728\u3059\u308b\u96f2\u304c\u3042\u308a\u307e\u3057\u305f\u3002\u65e5\u6ca1\u306f17:38\u306b\u8d77\u3053\u308a\u3001\u6e7f\u5ea6\u306f70%\u3001\u98a8\u901f\u306f\u79d2\u901f2.8\u30e1\u30fc\u30c8\u30eb\uff08m\/s\uff09\u3001\u305d\u3057\u3066\u6c17\u5727\u306f1,016\u30d8\u30af\u30c8\u30d1\u30b9\u30ab\u30eb\uff08hPa\uff09\u3067\u3057\u305f\u3002<\/p>\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30c7\u30d7\u30ed\u30a4\u304c\u6210\u529f\u3057\u305f\u306e\u3067\u3001\u30c6\u30b9\u30c8\u7528\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d72 \u2014 \u30c6\u30b9\u30c8\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/h2>\n<p>\u3053\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u3001\u30c6\u30b9\u30c8\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3001\u5f8c\u3067\u30b9\u30c6\u30c3\u30d73\u3067Playwright\u3092\u4f7f\u7528\u3057\u305f\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u88c5\u3059\u308b\u6e96\u5099\u3092\u3057\u307e\u3059\u3002<\/p>\n<p>\u59cb\u3081\u308b\u305f\u3081\u306b\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">npm<\/span> init playwright@latest -- <span class=\"token parameter variable\">--ct<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u306e\u30b3\u30de\u30f3\u30c9\u306f\u3001Playwright\u3092\u4f7f\u7528\u3057\u3066\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306e\u30b3\u30fc\u30c9\u751f\u6210\u30d7\u30ed\u30bb\u30b9\u3092\u958b\u59cb\u3057\u307e\u3059\u3002\u9078\u629e\u3057\u305f\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u57fa\u3065\u3044\u3066\u3001TypeScript\u3092\u4f7f\u7528\u3059\u308b\u304bJavaScript\u3092\u4f7f\u7528\u3059\u308b\u304b\u3001\u307e\u305f\u306f\u958b\u767a\u306e\u305f\u3081\u306bReact\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3059\u308b\u304bVue\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3059\u308b\u304b\u306b\u3088\u3063\u3066\u3001\u81ea\u52d5\u751f\u6210\u3055\u308c\u308b\u30b3\u30fc\u30c9\u306f\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u306f\u6b21\u306e\u51fa\u529b\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Need to install the following packages: create-playwright@1.17.123 Ok to proceed? (y)<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Y\u3092\u62bc\u3057\u3066\u304b\u3089\u30a8\u30f3\u30bf\u30fc\u30ad\u30fc\u3092\u62bc\u3057\u3066\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5f8c\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067TypeScript\u307e\u305f\u306fJavaScript\u3092\u4f7f\u7528\u3059\u308b\u304b\u9078\u629e\u3059\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Getting started with writing end-to-end tests with Playwright: Initializing project in &#8216;.&#8217; ? Do you want to use TypeScript or JavaScript? \u2026 TypeScript \u25b8 JavaScript<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u30b9\u30c6\u30c3\u30d73\u3067\u306f\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u306b\u306fJavaScript\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u305d\u306e\u5f8c\u3001\u51fa\u529b\u3067\u4f7f\u7528\u3059\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u9078\u629e\u3059\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>? Which framework do you use? (experimental) \u2026 \u25b8 react vue svelte<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>React\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u5929\u6c17\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f\u305d\u308c\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u51fa\u529b\u3067\u306f\u3001Playwright\u30d6\u30e9\u30a6\u30b6\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u304b\u3069\u3046\u304b\u3092\u5c0b\u306d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>? Install Playwright browsers (can be done manually via &#8216;npx playwright install&#8217;)? (Y\/n) \u2023 true<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u624b\u52d5\u3067\u5f8c\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u306a\u3044\u3088\u3046\u306b\u3001\u305d\u308c\u3089\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u305f\u3081\u306bY\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u6b21\u306b\u3001\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u304b\u3069\u3046\u304b\u5c0b\u306d\u3089\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<div class=\"secondary-code-label\" title=\"Output\">Output<\/div>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>Install Playwright operating system dependencies (requires sudo \/ root &#8211; can be done manually via &#8216;sudo npx playwright install-deps&#8217;)? (y\/N) \u2023 yes<\/p>\n<pre class=\"post-pre\"><code><\/code><\/pre>\n<p>\u624b\u52d5\u3067\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5fc5\u8981\u304c\u306a\u3044\u3088\u3046\u306b\u3001Y\u3092\u9078\u3093\u3067\u304f\u3060\u3055\u3044\u3002\u305f\u3060\u3057\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u305f\u3081\u306b\u3001\u73fe\u5728\u5b9f\u884c\u4e2d\u306e\u30de\u30b7\u30f3\u306e\u30e6\u30fc\u30b6\u30fc\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u5fc5\u8981\u306a\u4f9d\u5b58\u95a2\u4fc2\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3001Chromium\u3001Firefox\u3001\u304a\u3088\u3073WebKit\u306e3\u3064\u306e\u30d6\u30e9\u30a6\u30b6\u3082\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002\u3055\u3089\u306b\u3001\u30c6\u30b9\u30c8\u4e2d\u306b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306aindex.html\u3068index.js\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306a\u308bplaywright\u3068\u3044\u3046\u540d\u524d\u306e\u65b0\u3057\u3044\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u4f5c\u6210\u3055\u308c\u307e\u3059\u3002\u307e\u305f\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306eplaywright-ct.config.js\u3068\u3044\u3046\u65b0\u3057\u3044\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3082\u751f\u6210\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3059\u308b\u3053\u3068\u3067\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306e\u52d5\u4f5c\u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001Chromium\u30d6\u30e9\u30a6\u30b6\u3067\u306e\u307f\u5b9f\u884c\u3059\u308b\u304b\u3069\u3046\u304b\u306a\u3069\u306e\u8a2d\u5b9a\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\n<p>\u6ce8\u610f\uff1a\u30b9\u30af\u30ea\u30d7\u30c8\u300ctest-ct\u300d\u306f\u3001\u4ee5\u4e0b\u306b\u793a\u3059\u3088\u3046\u306b\u3001\u30d1\u30c3\u30b1\u30fc\u30b8\u306ejson\u30d5\u30a1\u30a4\u30eb\u306b\u81ea\u52d5\u7684\u306b\u751f\u6210\u3055\u308c\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n<p>&#8220;scripts&#8221;: {<br \/>\n&#8220;start&#8221;: &#8220;react-scripts start&#8221;,<br \/>\n&#8220;test-ct&#8221;: &#8220;playwright test -c playwright-ct.config.js&#8221;<br \/>\n},<\/p>\n<p>\u3053\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u306f\u3001\u5f8c\u306e\u30b9\u30c6\u30c3\u30d75\u3067\u30a2\u30d7\u30ea\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n<\/div>\n<p>\u4eca\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306e\u4f9d\u5b58\u95a2\u4fc2\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u30012\u3064\u306e\u5929\u6c17\u30a2\u30d7\u30ea\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d73- CityComponent\u306e\u90e8\u54c1\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3002<\/h2>\n<p>\u5929\u6c17\u30a2\u30d7\u30ea\u306f\u3001CityComponent\u3068WeatherInfoComponent\u306e2\u3064\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u69cb\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u3001CityComponent\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002\u3053\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001CityComponent\u306e\u305f\u3081\u306e2\u3064\u306e\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002\u6700\u521d\u306e\u30c6\u30b9\u30c8\u3067\u306f\u3001\u90fd\u5e02\u306e\u5165\u529b\u30dc\u30c3\u30af\u30b9\u304c\u30c6\u30ad\u30b9\u30c8\u5165\u529b\u3092\u53d7\u3051\u4ed8\u3051\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u30022\u756a\u76ee\u306e\u30c6\u30b9\u30c8\u3067\u306f\u3001\u691c\u7d22\u30dc\u30bf\u30f3\u304c\u30af\u30ea\u30c3\u30af\u3055\u308c\u305f\u5f8c\u306bfetchWeather\u30e1\u30bd\u30c3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u6700\u521d\u306b\u3001src\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token builtin class-name\">cd<\/span> src\r\n<\/code><\/pre>\n<p>\u3067\u306f\u3001\u30c6\u30b9\u30c8\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306b\u30c6\u30b9\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">mkdir<\/span> <mark>tests<\/mark>\r\n<\/code><\/pre>\n<p>\u6b21\u306b\u3001\u65b0\u3057\u304f\u4f5c\u6210\u3055\u308c\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token builtin class-name\">cd<\/span> <mark>tests<\/mark>\r\n<\/code><\/pre>\n<p>\u4eca\u3001tests\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3001nano\u307e\u305f\u306f\u304a\u597d\u307f\u306e\u30b3\u30fc\u30c9\u30a8\u30c7\u30a3\u30bf\u3092\u4f7f\u7528\u3057\u3066CityComponent.spec.jsx\u3068\u3044\u3046\u65b0\u3057\u3044\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3001\u958b\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">nano<\/span> CityComponent.spec.jsx\r\n<\/code><\/pre>\n<p>\u5404\u30c6\u30b9\u30c8\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u3001\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53ce\u96c6\u3057\u3066\u5b9f\u884c\u3059\u308b\u969b\u3001\u30c6\u30b9\u30c8\u30e9\u30f3\u30ca\u30fc\u304c\u30d5\u30a1\u30a4\u30eb\u3092\u63a2\u3059\u5834\u6240\u3092\u77e5\u308b\u305f\u3081\u306b\u5b9a\u7fa9\u3055\u308c\u305f\u69cb\u6587\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002Playwright\u306e\u5834\u5408\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f*.spec.*\u30d5\u30a1\u30a4\u30eb\u3092\u63a2\u3057\u3001\u305d\u308c\u3089\u3092\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u6271\u3044\u307e\u3059\u3002<\/p>\n<p>.jsx\u62e1\u5f35\u5b50\u306fJavaScript XML\u306e\u7565\u3067\u3001JavaScript\u30d5\u30a1\u30a4\u30eb\u5185\u306bHTML\u30bf\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 .jsx\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001CityComponent\u3092\u30c6\u30b9\u30c8\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u305d\u308c\u306fCityComponent\u306e\u30bf\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u4eca\u3001\u4f5c\u6210\u3057\u305fCityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306e\u69cb\u7bc9\u3092\u59cb\u3081\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u6587\u3092\u65e5\u672c\u8a9e\u306b\u30cd\u30a4\u30c6\u30a3\u30d6\u306a\u8868\u73fe\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff08\u4e00\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\uff1a<br \/>\nsrc\/tests\/CityComponent.spec.jsx &#8211;&gt;\u300csrc\/tests\/CityComponent.spec.jsx\u300d\u30d5\u30a1\u30a4\u30eb<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> test<span class=\"token punctuation\">,<\/span> expect <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'@playwright\/experimental-ct-react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">CityComponent<\/span> <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'..\/modules\/CityComponent'<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b@playwright\/experimental-ct-react\u30e9\u30a4\u30d6\u30e9\u30ea\u304b\u3089\u30c6\u30b9\u30c8\u3068expect\u30e1\u30bd\u30c3\u30c9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002\u307e\u305f\u3001\u5f8c\u3067\u30c6\u30b9\u30c8\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b\u305f\u3081\u306bCityComponent\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>2\u756a\u76ee\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u30b3\u30de\u30f3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001CityComponent\u30d5\u30a1\u30a4\u30eb\u3092src\/modules\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306b\u914d\u7f6e\u3057\u307e\u3059\u3002\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u691c\u7d22\u30da\u30fc\u30b8\u306e\u30b3\u30fc\u30c9\u3092\u5b9f\u88c5\u3057\u3066\u304a\u308a\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u90fd\u5e02\u540d\u3092\u5165\u529b\u3057\u3066\u305d\u306e\u90fd\u5e02\u306e\u5929\u6c17\u3092\u691c\u7d22\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001CityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306b\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u6b21\u306e\u30c6\u30b9\u30c8\u306f\u3001CityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> cityLocator <span class=\"token operator\">=<\/span> <span class=\"token string\">'[placeholder=\"City\"]'<\/span>\r\n<span class=\"token keyword\">const<\/span> searchButtonLocator <span class=\"token operator\">=<\/span> <span class=\"token string\">'[type=\"submit\"]'<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> cityName <span class=\"token operator\">=<\/span> <span class=\"token string\">'Hanoi'<\/span>\r\n<\/code><\/pre>\n<p>Playwright\u3067\u306f\u3001\u64cd\u4f5c\u3057\u305f\u3044UI\u8981\u7d20\u3068\u9023\u52d5\u3059\u308b\u305f\u3081\u306b\u3001\u305d\u306e\u8981\u7d20\u306eUI\u30ed\u30b1\u30fc\u30bf\u30fc\u3092\u6301\u3063\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001cityLocator\u3068searchButtonLocator\u3068\u3044\u30462\u3064\u306econst\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u3066\u3044\u307e\u3059\u3002const\u30ad\u30fc\u30ef\u30fc\u30c9\u306f\u3001\u5b9a\u6570\u5909\u6570\u3092\u793a\u3057\u3001\u521d\u671f\u5024\u3092\u5272\u308a\u5f53\u3066\u305f\u5f8c\u306b\u5024\u3092\u5909\u66f4\u3067\u304d\u306a\u3044\u3053\u3068\u3092\u610f\u5473\u3057\u3066\u3044\u307e\u3059\u3002[placeholder=&#8221;City&#8221;]\u304a\u3088\u3073[type=&#8221;submit&#8221;]\u306f\u3001CityComponent\u5185\u306e\u30c6\u30ad\u30b9\u30c8\u5165\u529b\u3068\u691c\u7d22\u30dc\u30bf\u30f3\u306eCSS\u30ed\u30b1\u30fc\u30bf\u30fc\u3067\u3059\u3002<\/p>\n<p>\u30b3\u30fc\u30c9\u306e3\u884c\u76ee\u3067\u306f\u3001\u304a\u63a2\u3057\u306e\u90fd\u5e02\u540d\u3067\u3042\u308b\u30cf\u30ce\u30a4\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306b\u3001\u65b0\u3057\u3044\u5909\u6570cityName\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001CityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306b\u6700\u521d\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u3053\u306e\u30d6\u30ed\u30c3\u30af\u3067\u306f\u3001cityField\u304c\u30c6\u30ad\u30b9\u30c8\u5024\u3092\u53d7\u3051\u4ed8\u3051\u308b\u304b\u3069\u3046\u304b\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<p>\u4ee5\u4e0b\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u307e\u3059\u3002\u305f\u3060\u3057\u30011\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u307f\u63d0\u4f9b\u3057\u307e\u3059 :<\/p>\n<p>src\/tests\/CityComponent.spec.jsx<\/p>\n<p>src\/tests\/CityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n\r\n<span class=\"token method function property-access\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'cityField accepts text input'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">CityComponent<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityField <span class=\"token operator\">=<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>cityLocator<span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword control-flow\">await<\/span> cityField<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">fill<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n\r\n    <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>cityField<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toHaveValue<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u5185\u3067\u306f\u3001\u30de\u30a6\u30f3\u30c8\u30e1\u30bd\u30c3\u30c9\u3092\u975e\u540c\u671f\u95a2\u6570\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30de\u30a6\u30f3\u30c8\u30e1\u30bd\u30c3\u30c9\u306f\u3001Step 2\u3067npm init playwright@latest &#8212; &#8211;ct\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305fexperimental-ct-react\u304b\u3089\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u30de\u30a6\u30f3\u30c8\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001React\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u30a2\u30d7\u30ea\u5185\u306b\u30de\u30a6\u30f3\u30c8\u3057\u3001\u30de\u30a6\u30f3\u30c8\u3055\u308c\u305f\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u30c6\u30b9\u30c8\u30d6\u30ed\u30c3\u30af\u300ctest(&#8216;cityField accepts text input&#8217;, async ({ mount }) =&gt; { ..})\u300d\u306basync\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u3001Playwright\u306b\u5bfe\u3057\u3066\u3053\u306e\u30c6\u30b9\u30c8\u3092\u975e\u540c\u671f\u3067\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u6307\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u975e\u540c\u671f\u30a2\u30d7\u30ed\u30fc\u30c1\u3067\u306f\u3001\u30b3\u30fc\u30c9\u306e\u5404\u884c\u304c\u9806\u756a\u306b\u5b9f\u884c\u3055\u308c\u308b\u306e\u3092\u5f85\u3064\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u4ee3\u308f\u308a\u306b\u3001\u30b3\u30fc\u30c9\u304c\u4e26\u884c\u3057\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u30c6\u30b9\u30c8\u304c\u3088\u308a\u901f\u304f\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001CityComponent\u30bf\u30b0\u3092mount\u30e1\u30bd\u30c3\u30c9\u306b\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u3001cityComponent\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002React\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u975e\u540c\u671f\u3067\u30b3\u30fc\u30c9\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u3001React\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u969b\u306b\u306f\u3001mount\u524d\u306bawait\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002await\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001Playwright\u306f\u30de\u30a6\u30f3\u30c8\u3055\u308c\u305fCityComponent\u306e\u30b3\u30fc\u30c9\u304c\u5b8c\u4e86\u3059\u308b\u306e\u3092\u5f85\u3063\u3066\u304b\u3089\u3001\u30de\u30a6\u30f3\u30c8\u3055\u308c\u305f\u5024\u3092cityComponent\u5909\u6570\u306b\u4ee3\u5165\u3057\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u304b\u3089\u3001\u4f5c\u6210\u3057\u305fcityLocator\u5909\u6570\u3092\u4f7f\u7528\u3057\u3066\u3001cityField\u3092\u898b\u3064\u3051\u307e\u3059\u3002<\/p>\n<p>\u6700\u5f8c\u306b\u3001cityName\u306e\u5024\u3067cityField\u3092\u57cb\u3081\u3001cityField\u3068cityName\u304c\u540c\u3058\u5024\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002\u3053\u3053\u3067`await`\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001cityField\u306bcityName\u304c\u5165\u529b\u3055\u308c\u308b\u524d\u306bcityField\u304ccityName\u306e\u5024\u3092\u6301\u3064\u304b\u3069\u3046\u304b\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002<\/p>\n<p>\u3042\u306a\u305f\u306f\u4eca\u3001CityComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306b2\u756a\u76ee\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u3053\u306e\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u306f\u3001\u691c\u7d22\u30dc\u30bf\u30f3\u304cfetchWeather\u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u304b\u3069\u3046\u304b\u3092\u30c1\u30a7\u30c3\u30af\u3057\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<p>\u4ee5\u4e0b\u306f\u300csrc\/tests\/CityComponent.spec.jsx\u300d\u3068\u3044\u3046\u30d5\u30a1\u30a4\u30eb\u306e\u539f\u6587\u3067\u3059\u3002<\/p>\n<p>\u300csrc\/tests\/CityComponent.spec.jsx\u300d\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n\r\n<span class=\"token method function property-access\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Click on `Search` button executes fetchWeather prop'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">let<\/span> isCalled <span class=\"token operator\">=<\/span> <span class=\"token boolean\">false<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">CityComponent<\/span><\/span>\r\n        <span class=\"token attr-name\">fetchWeather<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> isCalled <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><\/span>\r\n        <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token keyword control-flow\">await<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>cityLocator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">fill<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword control-flow\">await<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>searchButtonLocator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">click<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n    <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>isCalled<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toBeTruthy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u7b2c\u4e8c\u306e\u30c6\u30b9\u30c8\u30d6\u30ed\u30c3\u30af\u3067\u3082\u3001\u6700\u521d\u306e\u30c6\u30b9\u30c8\u30d6\u30ed\u30c3\u30af\u3068\u540c\u69d8\u306b\u3001\u30de\u30a6\u30f3\u30c8\u30e1\u30bd\u30c3\u30c9\u3092\u975e\u540c\u671f\u95a2\u6570\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u8ffd\u52a0\u3057\u307e\u3059\u3002test(&#8216;Click on Search button executes fetchWeather prop&#8217;, async ({ mount })\u3068\u3044\u3046\u30c6\u30b9\u30c8\u30d6\u30ed\u30c3\u30af\u306basync\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u3053\u3068\u3067\u3001Playwright\u306b\u3053\u306e\u30c6\u30b9\u30c8\u3092\u975e\u540c\u671f\u3067\u5b9f\u884c\u3059\u308b\u3088\u3046\u306b\u6307\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30c6\u30b9\u30c8\u95a2\u6570\u3067\u306f\u3001\u307e\u305aisCalled\u3068\u3044\u3046\u65b0\u3057\u3044\u5909\u6570\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u5f8c\u3067fetchWeather\u30e1\u30bd\u30c3\u30c9\u304c\u547c\u3070\u308c\u305f\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002let\u5909\u6570\u306f\u65b0\u3057\u3044\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u3001\u5909\u6570\u306e\u5024\u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u304c\u3001const\u5909\u6570\u3067\u306f\u5909\u6570\u306e\u5024\u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n<p>\u305d\u308c\u304b\u3089\u3001cityComponent\u3092\u5b9a\u7fa9\u3057\u3001\u5b9f\u969b\u306eCityComponent\u3092\u30a4\u30f3\u30b8\u30a7\u30af\u30c8\u3059\u308b\u305f\u3081\u306bmount\u30e1\u30bd\u30c3\u30c9\u306b\u5272\u308a\u5f53\u3066\u307e\u3059\u3002CityComponent\u30bf\u30b0\u306e\u4e2d\u306bfetchWeather={() =&gt; isCalled = true}\u306e\u884c\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u3053\u308c\u306f\u3001fetchWeather\u30e1\u30bd\u30c3\u30c9\u304c\u547c\u3073\u51fa\u3055\u308c\u308b\u5834\u5408\u3001isCalled\u306e\u5024\u304ctrue\u306b\u66f4\u65b0\u3055\u308c\u308b\u3053\u3068\u3092\u610f\u5473\u3057\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001cityName\u3067\u90fd\u5e02\u306e\u30c6\u30ad\u30b9\u30c8\u5165\u529b\u3092\u57cb\u3081\u3001\u305d\u306e\u5f8c\u3001\u30af\u30ea\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066UI\u30da\u30fc\u30b8\u306e\u691c\u7d22\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u30b7\u30df\u30e5\u30ec\u30fc\u30c8\u3057\u307e\u3059\u3002<\/p>\n<p>\u6700\u5f8c\u306b\u3001toBeTruthy\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3001isCalled\u5909\u6570\u304c\u771f\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u6642\u70b9\u3067\u306f\u3001\u3042\u306a\u305f\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u8981\u7d20\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002\u8907\u6570\u306e\u30d0\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\uff1a<br \/>\nsrc\/tests\/CityComponent.spec.jsx<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> test<span class=\"token punctuation\">,<\/span> expect <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'@playwright\/experimental-ct-react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">CityComponent<\/span> <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'..\/modules\/CityComponent'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> cityLocator <span class=\"token operator\">=<\/span> <span class=\"token string\">'[placeholder=\"City\"]'<\/span>\r\n<span class=\"token keyword\">const<\/span> searchButtonLocator <span class=\"token operator\">=<\/span> <span class=\"token string\">'[type=\"submit\"]'<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> cityName <span class=\"token operator\">=<\/span> <span class=\"token string\">'Hanoi'<\/span>\r\n\r\n<span class=\"token function\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'cityField accepts text input'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">CityComponent<\/span><\/span> <span class=\"token punctuation\">\/&gt;<\/span><\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityField <span class=\"token operator\">=<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>cityLocator<span class=\"token punctuation\">)<\/span>\r\n    \r\n    <span class=\"token keyword control-flow\">await<\/span> cityField<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">fill<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n\r\n    <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>cityField<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toHaveValue<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token function\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Click on `Search` button executes fetchWeather prop'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">let<\/span> isCalled <span class=\"token operator\">=<\/span> <span class=\"token boolean\">false<\/span>\r\n    <span class=\"token keyword\">const<\/span> cityComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span>\r\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">CityComponent<\/span><\/span>\r\n        <span class=\"token attr-name\">fetchWeather<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> isCalled <span class=\"token operator\">=<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">}<\/span><\/span>\r\n        <span class=\"token punctuation\">\/&gt;<\/span><\/span>\r\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n    <span class=\"token keyword control-flow\">await<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>cityLocator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">fill<\/span><span class=\"token punctuation\">(<\/span>cityName<span class=\"token punctuation\">)<\/span>\r\n    <span class=\"token keyword control-flow\">await<\/span> cityComponent<span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">locator<\/span><span class=\"token punctuation\">(<\/span>searchButtonLocator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">click<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n    <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>isCalled<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toBeTruthy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u9589\u3058\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057nano\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001Ctrl+X\u3092\u62bc\u3057\u3066\u4fdd\u5b58\u3057\u3066\u7d42\u4e86\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u73fe\u5728\u3001CityComponent\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306e\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u30c6\u30b9\u30c8\u306b\u306f2\u3064\u306e\u30c6\u30b9\u30c8\u30d6\u30ed\u30c3\u30af\u304c\u3042\u308a\u307e\u3059\u30021\u3064\u306f\u3001\u90fd\u5e02\u306e\u5165\u529b\u30dc\u30c3\u30af\u30b9\u304c\u300cHanoi\u300d\u3068\u3044\u3046\u5165\u529b\u3092\u53d7\u3051\u4ed8\u3051\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u3082\u306e\u3067\u3042\u308a\u3001\u3082\u30461\u3064\u306f\u3001\u691c\u7d22\u30dc\u30bf\u30f3\u304c\u30af\u30ea\u30c3\u30af\u3055\u308c\u305f\u5f8c\u306bfetchWeather\u30e1\u30bd\u30c3\u30c9\u304c\u5b9f\u884c\u3055\u308c\u308b\u304b\u3092\u30c6\u30b9\u30c8\u3059\u308b\u3082\u306e\u3067\u3059\u3002\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u30012\u756a\u76ee\u306e\u5929\u6c17\u30a2\u30d7\u30ea\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u3042\u308bWeatherInfoComponent\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d74\u2014WeatherInfoComponent\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u66f8\u304f<\/h2>\n<p>\u3053\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u3001\u3042\u306a\u305f\u304c\u30c6\u30b9\u30c8\u3057\u3066\u3044\u308b\u5929\u6c17\u30a2\u30d7\u30ea\u306e2\u756a\u76ee\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3001WeatherInfoComponent\u306e\u30c6\u30b9\u30c8\u3092\u66f8\u304d\u307e\u3059\u3002\u3053\u306e\u30c6\u30b9\u30c8\u3067\u306f\u3001weatherInfo\u306e\u5165\u529b\u3068\u3057\u3066Hanoi\u3092\u53d7\u3051\u53d6\u3063\u305f\u5f8c\u3001weatherComponent\u304c\u30c6\u30ad\u30b9\u30c8\u300cHanoi\u300d\u3092\u542b\u3093\u3067\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u6700\u521d\u306b\u3001tests\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u3066\u3001WeatherInfoComponent.spec.jsx\u3068\u3044\u3046\u65b0\u3057\u3044\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u958b\u3044\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code>nano <span class=\"token maybe-class-name\">WeatherInfoComponent<\/span><span class=\"token punctuation\">.<\/span><span class=\"token property-access\">spec<\/span><span class=\"token punctuation\">.<\/span><span class=\"token property-access\">jsx<\/span>\r\n<\/code><\/pre>\n<p>WeatherInfoComponent.spec.jsx \u30d5\u30a1\u30a4\u30eb\u306b\u4ee5\u4e0b\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\u4ee5\u4e0b\u306f\u65e5\u672c\u8a9e\u3067\u306e\u8868\u73fe\u4f8b\u3067\u3059\uff1a\u300csrc\/tests\/WeatherInfoComponent.spec.jsx\u300d<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> test<span class=\"token punctuation\">,<\/span> expect <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'@playwright\/experimental-ct-react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">WeatherComponent<\/span> <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'..\/modules\/WeatherInfoComponent'<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u3053\u3067\u306f\u3001@playwright\/experimental-ct-react\u30e9\u30a4\u30d6\u30e9\u30ea\u304b\u3089\u30c6\u30b9\u30c8\u3068\u671f\u5f85\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001Playwright\u3067\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001WeatherInfoComponent\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u30c6\u30b9\u30c8\u306bWeatherComponent\u3092\u30de\u30a6\u30f3\u30c8\u3057\u3066\u304f\u3060\u3055\u3044\u3002WeatherInfoComponent\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u63d0\u4f9b\u3057\u305f\u90fd\u5e02\u306e\u5929\u6c17\u3092\u8868\u793a\u3059\u308b\u7d50\u679c\u30da\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3001src\/modules\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306b\u914d\u7f6e\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306b\u3001\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u306eWeatherInfoComponent.spec.jsx\u306b\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u30d6\u30ed\u30c3\u30af\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>src\/tests\/WeatherInfoComponent.spec.jsx\u306e\u5185\u5bb9\u3092\u65e5\u672c\u8a9e\u3067\u8a00\u3044\u63db\u3048\u308b\u3068\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\uff1a<br \/>\n\u300csrc\/tests\/WeatherInfoComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306e\u30c6\u30b9\u30c8\u5185\u5bb9\u300d<\/div>\n<pre class=\"post-pre\"><code><span class=\"token spread operator\">...<\/span>\r\n\r\n<span class=\"token method function property-access\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'WeatherInfo accepts name and value'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">const<\/span> weatherInfo <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"coord\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"lon\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">105.8412<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"lat\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">21.0245<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"weather\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">800<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"main\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"Clear\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"description\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"clear sky\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"icon\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"01n\"<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"base\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"stations\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"main\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"temp\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"feels_like\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">301.35<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"temp_min\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"temp_max\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"pressure\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1003<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"humidity\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">35<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sea_level\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1003<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"grnd_level\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1002<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"visibility\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">10000<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"wind\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"speed\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">2.71<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"deg\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">73<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"gust\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">3.29<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"clouds\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"all\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"dt\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673694125<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sys\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"type\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">9308<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"country\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"VN\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sunrise\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673652961<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sunset\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673692464<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"timezone\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">25200<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1581130<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"name\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"Hanoi\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"cod\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token keyword\">const<\/span> weatherComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">WeatherComponent<\/span><\/span>\r\n    <span class=\"token attr-name\">weather<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span>weatherInfo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span>\r\n    <span class=\"token punctuation\">\/&gt;<\/span><\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>weatherComponent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toContainText<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Hanoi'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u3053\u3053\u3067\u306f\u3001weatherInfo\u3068\u3044\u3046\u5b9a\u6570\u306e\u5909\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002const\u306f\u5b9a\u6570\u5909\u6570\u306a\u306e\u3067\u3001\u521d\u671f\u5024\u3092\u5272\u308a\u5f53\u3066\u305f\u5f8c\u306f\u5024\u3092\u5909\u66f4\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u306e\u5834\u5408\u3001weatherInfo\u306e\u5024\u306fJSON\u5f62\u5f0f\u3067\u306e\u30cf\u30ce\u30a4\u306e\u5929\u6c17\u60c5\u5831\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u305d\u306e\u5f8c\u3001WeatherComponent\u304b\u3089\u5024\u3092\u53d6\u5f97\u3059\u308bweatherComponent\u3068\u3044\u3046\u5225\u306e\u5b9a\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<p>React\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u30b3\u30fc\u30c9\u3092\u975e\u540c\u671f\u3067\u5b9f\u884c\u3059\u308b\u305f\u3081\u3001WeatherComponent\u3092\u30de\u30a6\u30f3\u30c8\u3059\u308b\u969b\u306b\u306fawait\u3092\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001React\u304cWeatherComponent\u306e\u4f5c\u6210\u3092\u5b8c\u5168\u306b\u7d42\u4e86\u3059\u308b\u307e\u3067\u30b3\u30fc\u30c9\u306e\u5b9f\u884c\u3092\u5f85\u3064\u3088\u3046\u306b\u6307\u793a\u3057\u307e\u3059\u3002<\/p>\n<p>\u6700\u7d42\u7684\u306b\u3001await expect(weatherComponent).toContainText(&#8216;Hanoi&#8217;)\u306e\u4e2d\u3067\u3001weatherComponent\u5909\u6570\u304c\u30c6\u30ad\u30b9\u30c8\u300cHanoi\u300d\u3092\u542b\u3093\u3067\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u3053\u3067\u306fawait\u3092\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002Playwright\u3082\u975e\u540c\u671f\u3067\u30b3\u30fc\u30c9\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u3001await\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001weatherComponent\u5909\u6570\u304cWeatherComponent\u304b\u3089\u306e\u5024\u3092\u53d7\u3051\u53d6\u3063\u305f\u5f8c\u306b\u3001weatherComponent\u304c\u30c6\u30ad\u30b9\u30c8\u300cHanoi\u300d\u3092\u542b\u3093\u3067\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u3042\u306a\u305f\u306e\u5b8c\u5168\u306aWeatherInfoComponent.spec.jsx\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u884c\u304c\u542b\u307e\u308c\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\n<div>\u4ee5\u4e0b\u306e\u884c\u3092\u65e5\u672c\u8a9e\u3067\u81ea\u7136\u306b\u8868\u73fe\u3057\u3066\u304f\u3060\u3055\u3044\u30021\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u5927\u4e08\u592b\u3067\u3059\uff1a<br \/>\n`src\/tests\/WeatherInfoComponent.spec.jsx`<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> test<span class=\"token punctuation\">,<\/span> expect <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'@playwright\/experimental-ct-react'<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword module\">import<\/span> <span class=\"token imports\"><span class=\"token punctuation\">{<\/span> <span class=\"token maybe-class-name\">WeatherComponent<\/span> <span class=\"token punctuation\">}<\/span><\/span> <span class=\"token keyword module\">from<\/span> <span class=\"token string\">'..\/modules\/WeatherInfoComponent'<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n\r\n<span class=\"token function\">test<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'WeatherInfo accepts name and value'<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\"><span class=\"token punctuation\">{<\/span> mount <span class=\"token punctuation\">}<\/span><\/span><span class=\"token punctuation\">)<\/span> <span class=\"token arrow operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n    <span class=\"token keyword\">const<\/span> weatherInfo <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"coord\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"lon\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">105.8412<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"lat\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">21.0245<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"weather\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">800<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"main\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"Clear\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"description\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"clear sky\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"icon\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"01n\"<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"base\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"stations\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"main\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"temp\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"feels_like\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">301.35<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"temp_min\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"temp_max\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">302.15<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"pressure\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1003<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"humidity\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">35<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sea_level\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1003<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"grnd_level\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1002<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"visibility\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">10000<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"wind\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"speed\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">2.71<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"deg\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">73<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"gust\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">3.29<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"clouds\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"all\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"dt\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673694125<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sys\"<\/span><span class=\"token operator\">:<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string-property property\">\"type\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">9308<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"country\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"VN\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sunrise\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673652961<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"sunset\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1673692464<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"timezone\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">25200<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"id\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">1581130<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"name\"<\/span><span class=\"token operator\">:<\/span><span class=\"token string\">\"Hanoi\"<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string-property property\">\"cod\"<\/span><span class=\"token operator\">:<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">}<\/span>\r\n    <span class=\"token keyword\">const<\/span> weatherComponent <span class=\"token operator\">=<\/span> <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">mount<\/span><span class=\"token punctuation\">(<\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">WeatherComponent<\/span><\/span>\r\n    <span class=\"token attr-name\">weather<\/span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">(<\/span>weatherInfo<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span>\r\n    <span class=\"token punctuation\">\/&gt;<\/span><\/span> <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n    <span class=\"token keyword control-flow\">await<\/span> <span class=\"token function\">expect<\/span><span class=\"token punctuation\">(<\/span>weatherComponent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token method function property-access\">toContainText<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">'Hanoi'<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>CTRL+X\u3092\u62bc\u3057\u3066\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3057\u3066\u7d42\u4e86\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u3042\u306a\u305f\u306f\u4eca\u3001WeatherInfoComponent\u306e\u30c6\u30b9\u30c8\u306e\u4f5c\u6210\u3092\u7d42\u3048\u307e\u3057\u305f\u3002\u6b21\u306b\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b3\u3064\u306e\u30d6\u30e9\u30a6\u30b6\u306b\u5bfe\u3057\u3066\u3001CityComponent\u3068WeatherInfoComponent\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<br \/>\n(Anata wa ima, WeatherInfoComponent no tesuto no sakusei o oeta. Tsugi ni, insutoru sarete iru mitsu no burauza ni taishite, CityComponent to WeatherInfoComponent no tesuto o jikk\u014d shimasu.)<\/p>\n<h2>\u30b9\u30c6\u30c3\u30d75 \u2014 \u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b<\/h2>\n<p>\u3053\u306e\u624b\u9806\u3067\u306f\u3001Chromium\u3001Firefox\u3001\u304a\u3088\u3073WebKit\u306e3\u3064\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d6\u30e9\u30a6\u30b6\u3067CityComponent\u304a\u3088\u3073WeatherInfoComponent\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u3001\u3053\u308c\u3089\u306e2\u3064\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u305d\u308c\u3089\u306e\u30d6\u30e9\u30a6\u30b6\u4e0a\u3067\u9069\u5207\u306b\u52d5\u4f5c\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u6700\u521d\u306b\u3001\u30eb\u30fc\u30c8\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token builtin class-name\">cd<\/span> <span class=\"token punctuation\">..<\/span>\/<span class=\"token punctuation\">..<\/span>\r\n<\/code><\/pre>\n<p>\u4e0a\u8a18\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3068\u3001react-component-testing-demo\u30d5\u30a9\u30eb\u30c0\u30fc\u306b\u79fb\u52d5\u3057\u307e\u3059\u3002\u305d\u306e\u5f8c\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"token function\">npm<\/span> run test-ct\r\n<\/code><\/pre>\n<p>\u811a\u672c\u5bb6\u306f\u30012\u3064\u306e\u30c6\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092Chromium\u3001Firefox\u3001\u304a\u3088\u3073WebKit\u306e3\u3064\u306e\u30d6\u30e9\u30a6\u30b6\u3067\u5b9f\u884c\u3057\u307e\u3059\u3002\u6b21\u306e\u51fa\u529b\u306b\u4f3c\u305f\u7d50\u679c\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>Running 9 tests using 2 workers\r\n\r\nvite v3.2.5 building for production...\r\n\u2713 89 modules transformed.\r\nplaywright\/.cache\/playwright\/index.html      0.32 KiB\r\nplaywright\/.cache\/assets\/index.2b5442e2.js   313.68 KiB \/ gzip: 81.07 KiB\r\n\r\n  9 passed (12s)\r\n\r\nTo open last HTML report run:\r\n\r\n  npx playwright show-report\r\n<\/code><\/pre>\n<p>\u30ec\u30dd\u30fc\u30c8\u3092GUI\u5f62\u5f0f\u3067\u8868\u793a\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code>npx playwright show-report\r\n<\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-conf-desc\">Note<\/p>\n<div>\u6ce8\u610f\uff1a<br \/>\n\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30b0\u30e9\u30d5\u30a3\u30ab\u30eb\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\uff08GUI\uff09\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u3067\u5b9f\u884c\u3057\u3001Chrome\u3084Firefox\u306e\u3088\u3046\u306a\u30d6\u30e9\u30a6\u30b6\u304c\u3059\u3067\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001\u5929\u6c17\u30a2\u30d7\u30ea\u306f\u81ea\u52d5\u7684\u306b\u30d6\u30e9\u30a6\u30b6\u3067\u958b\u304d\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30ea\u30e2\u30fc\u30c8\u30b5\u30fc\u30d0\u30fc\u3067\u5b9f\u884c\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001SSH\u3092\u4ecb\u3057\u3066\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u4f7f\u7528\u3057\u3066\u3001\u30a2\u30d7\u30ea\u3092\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u3067\u958b\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u65b0\u3057\u3044\u30bf\u30fc\u30df\u30ca\u30eb\u3067\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\uff1a<br \/>\nssh -L 9223:localhost:9223 your_non_root_user@your_server_ip<\/div>\n<p>\u3053\u308c\u3067\u3001\u30ed\u30fc\u30ab\u30eb\u30de\u30b7\u30f3\u304b\u3089\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n<p>\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u306e\u6982\u8981\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u30fc\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/125-0.png\" alt=\"Screencapture of the overall report\" \/><\/div>\n<p>\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u306f\u3001\u4ee5\u4e0b\u306e3\u3064\u306e\u7570\u306a\u308b\u30c6\u30b9\u30c8\u306b\u5206\u304b\u308c\u3066\u3044\u307e\u3059\uff1a cityField\u306f\u30c6\u30ad\u30b9\u30c8\u5165\u529b\u3092\u53d7\u3051\u5165\u308c\u3001Search\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068fetchWeather\u306e\u30d7\u30ed\u30c3\u30d7\u304c\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002\u305d\u3057\u3066WeatherInfo\u306f\u540d\u524d\u3068\u5024\u3092\u53d7\u3051\u5165\u308c\u307e\u3059\u3002\u5404\u30c6\u30b9\u30c8\u306f\u3001\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u306b\u304b\u304b\u3063\u305f\u5168\u4f53\u306e\u6642\u9593\u3068\u3001\u5404\u30d6\u30e9\u30a6\u30b6\u306e\u30c6\u30b9\u30c8\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<p>\u5404\u30c6\u30b9\u30c8\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u305f\u3068\u3048\u3070cityField\u304c\u30c6\u30ad\u30b9\u30c8\u5165\u529b\u3092\u53d7\u3051\u4ed8\u3051\u308b\u30c6\u30b9\u30c8\u306e\u8a73\u7d30\u306a\u6642\u9593\u3068\u30b3\u30fc\u30c9\u306e\u884c\u6570\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/128-0.png\" alt=\"Screen capture of the cityField accepts text input report details displaying the length of time that each element of the test took\" \/><\/div>\n<p>\u7d50\u679c\u304b\u3089\u3001City\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u306f\u3001Chromium\u4e0a\u3067\u30c6\u30ad\u30b9\u30c8\u3092\u5165\u529b\u3068\u3057\u3066\u53d7\u3051\u5165\u308c\u308bCity\u5165\u529b\u30dc\u30c3\u30af\u30b9\u306e\u30c6\u30b9\u30c8\u304c\u6210\u529f\u3057\u305f\u3053\u3068\u304c\u793a\u3055\u308c\u307e\u3057\u305f\u3002\u8a73\u7d30\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u624b\u9806\u306b\u306fBefore Hooks\u3068After Hooks\u306e\u30b9\u30c6\u30c3\u30d7\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002Before Hooks\u30bb\u30af\u30b7\u30e7\u30f3\u306f\u3001\u901a\u5e38\u3001\u30b3\u30f3\u30bd\u30fc\u30eb\u3078\u306e\u30ed\u30b0\u30a4\u30f3\u3084\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u53d6\u308a\u306a\u3069\u306e\u521d\u671f\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059\u3002\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u5f8c\u3001After Hooks\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u304c\u884c\u308f\u308c\u308b\u3053\u3068\u304c\u3088\u304f\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>locator.fill()\u884c\u306f\u3001\u8981\u7d20\u304c\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u3067\u3069\u306e\u3088\u3046\u306b\u898b\u3064\u304b\u308b\u304b\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u5834\u5408\u3001\u8981\u7d20\u306fCSS\u30bb\u30ec\u30af\u30bf\u3092\u4f7f\u7528\u3057\u3066[placeholder=&#8221;City&#8221;]\u306e\u5024\u3067\u898b\u3064\u3051\u3089\u308c\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/131-0.png\" alt=\"Screen capture of the locator.fill() method detail in the test report\" \/><\/div>\n<p>\u3053\u306eexpect.toHaveValue\u306e\u884c\u306f\u3001\u30c6\u30b9\u30c8\u306e\u30a2\u30b5\u30fc\u30b7\u30e7\u30f3\uff08\u691c\u8a3c\uff09\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30c6\u30b9\u30c8\u3067\u306f\u3001cityField\u306e\u5024\u304ccityName\u3067\u3042\u308b\u3053\u3068\u3092\u671f\u5f85\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/133-0.png\" alt=\"Screen capture of the expect.toHaveValue() assertion detail in the test report\" \/><\/div>\n<p>\u3042\u306a\u305f\u306f\u73fe\u5728\u3001\u5929\u6c17\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eCityComponent\u3068WeatherInfoComponent\u306e\u30c6\u30b9\u30c8\u3092\u5b8c\u5168\u306b\u5b9f\u88c5\u3057\u3001Chromium\u3001Firefox\u3001\u304a\u3088\u3073WebKit\u3067\u306e\u52d5\u4f5c\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002GitHub\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30e1\u30a4\u30f3\u30d6\u30e9\u30f3\u30c1\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3068\u30c6\u30b9\u30c8\u306e\u5b8c\u5168\u306a\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u30c1\u30a7\u30c3\u30af\u3067\u304d\u307e\u3059\u3002<\/p>\n<h2>\u7d50\u8ad6<\/h2>\n<p>\u3042\u306a\u305f\u306fPlaywright\u3092\u4f7f\u7528\u3057\u3066\u3001React\u30d9\u30fc\u30b9\u306e\u5929\u6c17\u30a2\u30d7\u30ea\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092\u5b9f\u88c5\u3057\u307e\u3057\u305f\u3002\u307e\u305a\u3001CityComponent\u3068WeatherInfoComponent\u3068\u3044\u3046\u5929\u6c17\u30a2\u30d7\u30ea\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u5fc5\u8981\u306a\u30c6\u30b9\u30c8\u306e\u4f9d\u5b58\u95a2\u4fc2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3057\u305f\u3002\u6b21\u306b\u30012\u3064\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30c6\u30b9\u30c8\u3092\u4f5c\u6210\u3057\u3066\u5b9f\u884c\u3057\u307e\u3057\u305f\u3002\u6700\u5f8c\u306b\u3001\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u671f\u5f85\u3069\u304a\u308a\u306b\u52d5\u4f5c\u3059\u308b\u304b\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u3001GUI\u5f62\u5f0f\u306e\u30c6\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>Playwright\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u3054\u89a7\u3044\u305f\u3060\u304f\u3068\u3001Playwright\u304c\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u306e\u6a5f\u80fd\u3084\u305d\u306e\u4ed6\u306e\u6a5f\u80fd\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u5b66\u3076\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f5c\u8005\u306f\u3001\u66f8\u304d\u7269\u5bc4\u4ed8\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u4e00\u74b0\u3068\u3057\u3066\u3001Open Sourcing Mental Illness\u3092\u5bc4\u4ed8\u306e\u5bfe\u8c61\u306b\u9078\u3073\u307e\u3057\u305f\u3002 \u4ee5\u4e0b\u306f\u65e5\u672c\u8a9e\u3067\u81ea\u7136\u306a\u8868\u73fe\u306b\u8a00\u3044\u63db\u3048\u305f\u3082\u306e\u3067\u3059\u3002\uff11\u3064\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002 \u7d39\u4ecb \u30bd\u30d5\u30c8\u30a6\u30a7 [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[26,61],"class_list":["post-38","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-26","tag-61"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5 - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/ja\/blog\/react\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092playwright\/\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\" \/>\n<meta property=\"og:description\" content=\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/ja\/blog\/react\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092playwright\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-10T22:00:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-31T04:35:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/24-0.png\" \/>\n<meta name=\"author\" content=\"\u82bd\u4f9d, \u96e8\u591c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u82bd\u4f9d, \u96e8\u591c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"43\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/\",\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/\",\"name\":\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#website\"},\"datePublished\":\"2022-08-10T22:00:09+00:00\",\"dateModified\":\"2025-07-31T04:35:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/aeb60a7861f2f002b54c66bd65bc6c27\"},\"description\":\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/ja\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/aeb60a7861f2f002b54c66bd65bc6c27\",\"name\":\"\u82bd\u4f9d, \u96e8\u591c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6305fe5cabc2b854c1208975a47fbf3f8cef3f7cd775b94dceedbe59b74a8010?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6305fe5cabc2b854c1208975a47fbf3f8cef3f7cd775b94dceedbe59b74a8010?s=96&d=mm&r=g\",\"caption\":\"\u82bd\u4f9d, \u96e8\u591c\"},\"url\":\"https:\/\/www.silicloud.com\/ja\/blog\/author\/meiamaya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5 - Blog - Silicon Cloud","description":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/ja\/blog\/react\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092playwright\/","og_locale":"ja_JP","og_type":"article","og_title":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5","og_description":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","og_url":"https:\/\/www.silicloud.com\/ja\/blog\/react\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092playwright\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-08-10T22:00:09+00:00","article_modified_time":"2025-07-31T04:35:16+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564437edaa94e2bdf7acb42\/24-0.png"}],"author":"\u82bd\u4f9d, \u96e8\u591c","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"\u82bd\u4f9d, \u96e8\u591c","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"43\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/","url":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/","name":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/#website"},"datePublished":"2022-08-10T22:00:09+00:00","dateModified":"2025-07-31T04:35:16+00:00","author":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/aeb60a7861f2f002b54c66bd65bc6c27"},"description":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5\u3092\u5206\u304b\u308a\u3084\u3059\u304f\u89e3\u8aac\u3002\u5b9f\u8df5\u7684\u306a\u4f8b\u3068\u30b3\u30fc\u30c9\u3001\u6ce8\u610f\u70b9\u3092\u542b\u3081\u3066\u521d\u5fc3\u8005\u306b\u3082\u7406\u89e3\u3067\u304d\u308b\u3088\u3046\u8aac\u660e\u3057\u307e\u3059\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/ja\/blog\/"},{"@type":"ListItem","position":2,"name":"React\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30c6\u30b9\u30c8\u3092Playwright\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u88c5\u306e\u65b9\u6cd5"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#website","url":"https:\/\/www.silicloud.com\/ja\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/aeb60a7861f2f002b54c66bd65bc6c27","name":"\u82bd\u4f9d, \u96e8\u591c","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.silicloud.com\/ja\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6305fe5cabc2b854c1208975a47fbf3f8cef3f7cd775b94dceedbe59b74a8010?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6305fe5cabc2b854c1208975a47fbf3f8cef3f7cd775b94dceedbe59b74a8010?s=96&d=mm&r=g","caption":"\u82bd\u4f9d, \u96e8\u591c"},"url":"https:\/\/www.silicloud.com\/ja\/blog\/author\/meiamaya\/"},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.silicloud.com\/ja\/blog\/react%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%8d%e3%83%b3%e3%83%88%e3%83%86%e3%82%b9%e3%83%88%e3%82%92playwright\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":325662,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/posts\/38\/revisions\/325662"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/ja\/blog\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}