From 7b7c3f2c9f9b38e4b10234f054322b8353ff8796 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 11:44:31 +0900 Subject: [PATCH 01/10] test(stability): replace pauses with waitFor in plugin add flow; add waits for dropdowns in AdminLink/LoginLogout; increase default waitSeconds already applied --- tests/Browser/Common/AdminLinkTest.php | 1 + tests/Browser/Common/LoginLogoutTest.php | 2 +- tests/DuskTestCase.php | 7 +++++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/Browser/Common/AdminLinkTest.php b/tests/Browser/Common/AdminLinkTest.php index 046949125..6677b773c 100644 --- a/tests/Browser/Common/AdminLinkTest.php +++ b/tests/Browser/Common/AdminLinkTest.php @@ -46,6 +46,7 @@ private function adminLink() $this->browse(function (Browser $browser) { $browser->visit('/') ->assertTitleContains('Connect-CMS') + ->waitFor('#dropdown_manage') ->screenshot('common/admin_link/index/images/admin_link1'); $browser->click('#dropdown_manage') diff --git a/tests/Browser/Common/LoginLogoutTest.php b/tests/Browser/Common/LoginLogoutTest.php index d96f5e5ba..077eea79d 100644 --- a/tests/Browser/Common/LoginLogoutTest.php +++ b/tests/Browser/Common/LoginLogoutTest.php @@ -117,7 +117,7 @@ private function logoutTest() ->assertTitleContains('Connect-CMS') ->screenshot('common/index/logout/images/logout1'); - $browser->click('#dropdown_auth') + $browser->waitFor('#dropdown_auth')->click('#dropdown_auth') ->assertTitleContains('Connect-CMS') ->screenshot('common/index/logout/images/logout2'); diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php index 787e1f3fe..cfdaa6d72 100644 --- a/tests/DuskTestCase.php +++ b/tests/DuskTestCase.php @@ -108,6 +108,9 @@ protected function setUp(): void // Extend default wait timeout for CI stability \Laravel\Dusk\Browser::$waitSeconds = 10; + // Extend default wait timeout for CI stability + \Laravel\Dusk\Browser::$waitSeconds = 10; + // テスト実行のタイミングで一度だけ実行する if (! self::$migrated) { $this->browse(function (Browser $browser) { @@ -330,12 +333,12 @@ public function addPluginModal($add_plugin, $permanent_link = '/', $area = AreaT // 早すぎると、プラグイン追加ダイアログが表示しきれないので、1秒待つ。 $browser->clickLink('プラグイン追加') ->assertPathBeginsWith('/') - ->pause(1000); + ->waitFor('#form_add_plugin' . $area); if ($screenshot) { $browser->screenshot('common/admin_link/plugin/images/add_plugin2'); } - $browser->click('#form_add_plugin' . $area); + $browser->waitFor('#form_add_plugin' . $area)->click('#form_add_plugin' . $area); if ($screenshot) { $browser->screenshot('common/admin_link/plugin/images/add_plugin3'); } From f927edaf9ab0a80adbf09d583ba77813f5985762 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 11:55:26 +0900 Subject: [PATCH 02/10] test(stability): replace pause() with waitFor in PageManage and UserManage flows; wait for selectors/text before interactions --- tests/Browser/Manage/PageManageTest.php | 13 +++++++------ tests/Browser/Manage/UserManageTest.php | 9 ++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/Browser/Manage/PageManageTest.php b/tests/Browser/Manage/PageManageTest.php index 6ed6de47e..3cad629e4 100644 --- a/tests/Browser/Manage/PageManageTest.php +++ b/tests/Browser/Manage/PageManageTest.php @@ -92,6 +92,7 @@ private function edit() // クリックできるのは、label タグになるため、label タグにセレクタを追加して、ckick() メソッドで値を設定する。 $this->browse(function (Browser $browser) { $browser->visit('/manage/page/edit') + ->waitFor("input[name='page_name']") ->type('page_name', 'プラグイン・テスト') ->type('permanent_link', '/test') ->click('#label_base_display_flag') @@ -166,10 +167,10 @@ private function movePage() $browser->visit('/manage/page') ->screenshot('manage/page/movePage/images/movePage1') ->click("#move_level_" . $sub_page->id) - ->pause(500) + ->waitFor("#level_move_page_" . $test_page->id) ->screenshot('manage/page/movePage/images/movePage2') ->click("#level_move_page_" . $test_page->id) - ->pause(500) + ->waitForText('決定') ->screenshot('manage/page/movePage/images/movePage3') ->press("決定"); }); @@ -263,8 +264,8 @@ private function pageRole() ->clickLink('管理者グループ') ->assertSourceHas('ページ権限設定'); - // collapseが表示されるまで、ちょっと待つ - $browser->pause(500); + // collapseの展開待機 + $browser->waitFor("label[for='role_reporter1']"); //$this->screenshot($browser); $browser->screenshot('manage/page/pageRole/images/pageRole'); @@ -283,8 +284,8 @@ private function pageRoleUpdate() $browser->click("label[for='role_reporter1']") ->assertTitleContains('Connect-CMS'); - // チェックボックスのクリックが反映されるまで、ちょっと待つ - $browser->pause(500); + // 反映待機(最低限、要素の存在を担保) + $browser->waitFor("label[for='role_reporter1']"); //$this->screenshot($browser); $browser->screenshot('manage/page/pageRoleUpdate/images/pageRoleUpdate'); diff --git a/tests/Browser/Manage/UserManageTest.php b/tests/Browser/Manage/UserManageTest.php index 9981873fc..f5e919138 100644 --- a/tests/Browser/Manage/UserManageTest.php +++ b/tests/Browser/Manage/UserManageTest.php @@ -83,7 +83,7 @@ private function index() $this->browse(function (Browser $browser) { $browser->click('#user_search_condition') ->assertTitleContains('Connect-CMS') - ->pause(500) + ->waitFor('#user_search_condition_status') ->screenshot('manage/user/index/images/user_search_condition'); }); $this->browse(function (Browser $browser) { @@ -219,9 +219,9 @@ private function regist() ->pause(500) ->screenshot('manage/user/regist/images/regist2') ->press('ユーザ登録') - ->pause(500) + ->waitFor('#label_group_role_1_1') ->click('#label_group_role_1_1') // ここでは、group_user->id を 1 で想定。(順番に実行してきたらそうなるはず) - ->pause(500) + ->waitForText('変更') ->screenshot('manage/user/regist/images/regist3') ->press('変更') ->screenshot('manage/user/regist/images/regist4') @@ -291,7 +291,7 @@ private function submitImport() ->attach('users_csv', __DIR__.'/users.csv') ->press('インポート') ->acceptDialog() - ->pause(500) + ->waitFor('input[name="users_csv"]') ->assertDontSee('500') // "500" 文字がない事 ->screenshot('manage/user/import/images/submitImport'); }); @@ -305,7 +305,6 @@ private function indexPage2() $this->browse(function (Browser $browser) { $browser->visit('/manage/user?page=2') ->assertSee('ユーザ一覧') - ->pause(500) ->assertDontSee('500') // "500" 文字がない事 ->screenshot('manage/user/import/images/import2'); }); From 690c6663302ea5f5dd85ce265a57983dd50ae647 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 12:19:39 +0900 Subject: [PATCH 03/10] test(stability): replace pause() with waitFor in Theme/Log/PasswordPage flows; wait for forms, panels, and location/text --- tests/Browser/Common/PasswordPageTest.php | 4 ++-- tests/Browser/Manage/LogManageTest.php | 6 ++---- tests/Browser/Manage/ThemeManageTest.php | 10 +++++----- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/tests/Browser/Common/PasswordPageTest.php b/tests/Browser/Common/PasswordPageTest.php index 9b229d746..ea5578687 100644 --- a/tests/Browser/Common/PasswordPageTest.php +++ b/tests/Browser/Common/PasswordPageTest.php @@ -47,7 +47,7 @@ private function setPassword() ->screenshot('common/password_page/index/images/setPassword') ->scrollIntoView('footer') ->press('ページ更新') - ->pause(500); // github actionsの安定性のためにpress後に少し待つ + ->waitForText('ページを更新しました。'); }); // マニュアル用データ出力 @@ -86,7 +86,7 @@ private function viewPage() ->type('password', 'pass123') ->screenshot('common/password_page/viewPage/images/inputPassword') ->press('ページ閲覧') - ->pause(500); // github actionsの安定性のためにpress後に少し待つ + ->waitForLocation('/password'); }); // *** データクリア diff --git a/tests/Browser/Manage/LogManageTest.php b/tests/Browser/Manage/LogManageTest.php index 29764b649..edb7bf18f 100644 --- a/tests/Browser/Manage/LogManageTest.php +++ b/tests/Browser/Manage/LogManageTest.php @@ -39,10 +39,8 @@ private function index() $browser->visit('/manage/edit') ->visit('/manage/log') ->click('#app_log_search_condition_button') - ->assertTitleContains('Connect-CMS'); - - // collapseが表示されるまで、ちょっと待つ - $browser->pause(500) + ->assertTitleContains('Connect-CMS') + ->waitFor('#app_log_search_condition') ->screenshot('manage/log/index/images/index3'); }); diff --git a/tests/Browser/Manage/ThemeManageTest.php b/tests/Browser/Manage/ThemeManageTest.php index 576e21bed..efa206be7 100644 --- a/tests/Browser/Manage/ThemeManageTest.php +++ b/tests/Browser/Manage/ThemeManageTest.php @@ -51,7 +51,7 @@ private function index() ->screenshot('manage/theme/index/images/index'); $browser->click('#image_edit_1') - ->pause(500) + ->waitFor('#upload_images') ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/index/images/image_edit'); }); @@ -74,7 +74,7 @@ private function editCss() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#css_edit_1') - ->pause(500) + ->waitFor('#css_textarea') ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/editCss/images/editCss'); }); @@ -97,7 +97,7 @@ private function editJs() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#js_edit_1') - ->pause(500) + ->waitFor('#js_textarea') ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/editJs/images/editJs'); }); @@ -120,7 +120,7 @@ private function listImages() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#image_edit_1') - ->pause(500) + ->waitFor('#upload_images') ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/listImages/images/listImages'); }); @@ -143,7 +143,7 @@ private function editName() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#name_edit_1') - ->pause(500) + ->waitFor('input[name="theme_name"]') ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/editName/images/editName'); }); From ef57f964767599e60dec517b3dce885bd0103be4 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 12:42:03 +0900 Subject: [PATCH 04/10] test(stability): broaden waitFor replacements across API/Code/Reservation/Top/LoginLock/Wysiwyg tests --- tests/Browser/Common/LoginLockTest.php | 12 +++---- tests/Browser/Common/WysiwygTest.php | 36 ++++++++++--------- tests/Browser/Manage/ApiManageTest.php | 2 +- tests/Browser/Manage/CodeManageTest.php | 2 +- .../Browser/Manage/ReservationManageTest.php | 6 ++-- tests/Browser/Top/IndexTopTest.php | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tests/Browser/Common/LoginLockTest.php b/tests/Browser/Common/LoginLockTest.php index 6e590b72a..6fb277e11 100644 --- a/tests/Browser/Common/LoginLockTest.php +++ b/tests/Browser/Common/LoginLockTest.php @@ -43,27 +43,27 @@ private function loginLockTest() ->type('#userid', 'admin') ->type('#password', 'error001') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->type('#userid', 'admin') ->type('#password', 'error002') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->type('#userid', 'admin') ->type('#password', 'error003') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->type('#userid', 'admin') ->type('#password', 'error004') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->type('#userid', 'admin') ->type('#password', 'error005') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->type('#userid', 'admin') ->type('#password', 'error006') ->click('@login-button') - ->pause(500) + ->waitForText('ログインできません') ->screenshot('common/index/lock/images/loginLock'); }); diff --git a/tests/Browser/Common/WysiwygTest.php b/tests/Browser/Common/WysiwygTest.php index 6e6d90940..1db80cdef 100644 --- a/tests/Browser/Common/WysiwygTest.php +++ b/tests/Browser/Common/WysiwygTest.php @@ -132,7 +132,7 @@ private function index() // 固定記事のページを開く $browser->visit('/plugin/contents/edit/' . $frame->page_id . '/' . $frame->id . '/' . $this->content->id . '#frame-' . $frame->id) - ->pause(500) + ->waitFor('.tox-tinymce') ->assertPathBeginsWith('/') ->screenshot('common/wysiwyg/index/images/index'); }); @@ -167,7 +167,7 @@ private function decoration() // 固定記事のページを開く $browser->visit('/plugin/contents/edit/' . $frame->page_id . '/' . $frame->id . '/' . $this->content->id . '#frame-' . $frame->id) - ->pause(500) + ->waitFor('.tox-tinymce') ->assertPathBeginsWith('/') ->screenshot('common/wysiwyg/decoration/images/decoration'); }); @@ -200,8 +200,9 @@ private function paragraph() $this->browse(function (Browser $browser) { // 段落 $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(3) button') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/paragraph/images/paragraph'); }); @@ -233,13 +234,14 @@ private function color() $this->browse(function (Browser $browser) { // 文字色のカラーパネル $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(4) div:nth-child(1) span:nth-child(2)') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/color/images/colorPickerFont'); // 背景色のカラーパネル $browser->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(4) div:nth-child(2) span:nth-child(2)') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/color/images/colorPickerBackground'); }); @@ -289,11 +291,12 @@ private function table() $content->save(); // 記事をデータベースから変更したので、一度開きなおす。 - $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $content->id . '#frame-' . $this->frame->id); + $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce'); // 表のドロップダウン $browser->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(6) button:nth-child(1) div') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/table/images/table'); // 表のドロップダウン > 表 @@ -336,43 +339,42 @@ private function table() // 表のドロップダウン > 行 > 行の詳細設定 $browser->click('.tox-collection--list:nth-child(2) .tox-collection__item:nth-child(4)') - ->pause(500) + ->waitFor('.tox-dialog') ->screenshot('common/wysiwyg/table/images/table_row_detail'); // 表のドロップダウン > 行 > 行の詳細設定 > 詳細設定 $browser->click('.tox-tab:nth-child(2)') - ->pause(500) + ->waitFor('.tox-dialog') ->screenshot('common/wysiwyg/table/images/table_row_detail_detail'); // 一度開きなおす。 - $browser->visit('/') - ->pause(500); + $browser->visit('/'); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $content->id . '#frame-' . $this->frame->id) - ->pause(500) + ->waitFor('.tox-tinymce') ->screenshot('common/wysiwyg/table/images/edit_reopen2'); // 表のドロップダウン $browser->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(6) button:nth-child(1) div') - ->pause(500); + ->waitFor('.tox-collection'); // 表のドロップダウン > 列 $browser->mouseover('.tox-collection__group:nth-child(2) .tox-collection__item:nth-child(3)') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/table/images/table_col'); // 表のドロップダウン > 表の詳細設定 $browser->mouseover('.tox-collection__group:nth-child(3) .tox-collection__item:nth-child(1)') - ->pause(500) + ->waitFor('.tox-collection') ->screenshot('common/wysiwyg/table/images/table_detail_mouse'); $browser->click('.tox-collection__group:nth-child(3) .tox-collection__item:nth-child(1)') - ->pause(500) + ->waitFor('.tox-dialog') ->screenshot('common/wysiwyg/table/images/table_detail_click'); // 表のドロップダウン > 表の詳細設定 > 詳細設定 $browser->click('.tox-tab:nth-child(2)') - ->pause(500) + ->waitFor('.tox-dialog') ->screenshot('common/wysiwyg/table/images/table_detail_detail'); }); diff --git a/tests/Browser/Manage/ApiManageTest.php b/tests/Browser/Manage/ApiManageTest.php index 8a0267502..324e3e50e 100644 --- a/tests/Browser/Manage/ApiManageTest.php +++ b/tests/Browser/Manage/ApiManageTest.php @@ -31,7 +31,7 @@ private function index() { $this->browse(function (Browser $browser) { $browser->visit('/manage/api') - ->pause(500) + ->waitFor("input[name='secret_name']") ->type('secret_name', 'テスト') ->type('secret_code', 'secret_1234') ->type('ip_address', '192.168.10.101') diff --git a/tests/Browser/Manage/CodeManageTest.php b/tests/Browser/Manage/CodeManageTest.php index 84c8e6f32..e6aace123 100644 --- a/tests/Browser/Manage/CodeManageTest.php +++ b/tests/Browser/Manage/CodeManageTest.php @@ -226,7 +226,7 @@ private function import() $browser->press('インポート') ->acceptDialog() - ->pause(500) + ->waitFor('input[name="codes_csv"]') ->assertDontSee('500') // "500" 文字がない事 ->screenshot('manage/code/import/images/import2'); }); diff --git a/tests/Browser/Manage/ReservationManageTest.php b/tests/Browser/Manage/ReservationManageTest.php index c8a1b83dc..023d0ceeb 100644 --- a/tests/Browser/Manage/ReservationManageTest.php +++ b/tests/Browser/Manage/ReservationManageTest.php @@ -130,10 +130,8 @@ private function registOther(...$names) $reservations_category = '3'; } - // ループの連続実行で画面表示がおいついてないので、ちょっと待つ - $browser->pause(500); - $browser->visit('/manage/reservation/regist') + ->waitFor("input[name='facility_name']") ->type('facility_name', $name) ->select('reservations_categories_id', $reservations_category) ->select('columns_set_id', '1') @@ -262,7 +260,7 @@ private function bookings() }); $this->browse(function (Browser $browser) { $browser->click('#app_reservation_search_condition') - ->pause(500) + ->waitForText('施設名') ->screenshot('manage/reservation/bookings/images/bookings2'); }); diff --git a/tests/Browser/Top/IndexTopTest.php b/tests/Browser/Top/IndexTopTest.php index 146c020b0..632c98c7b 100644 --- a/tests/Browser/Top/IndexTopTest.php +++ b/tests/Browser/Top/IndexTopTest.php @@ -53,7 +53,7 @@ public function testInvoke() ->visit('/test/calendar') ->screenshot('top/index/index/images/calendar') ->visit('/test/slideshow') - ->pause(500) + ->waitFor('.carousel') ->screenshot('top/index/index/images/slideshow') ->visit('/test/openingcalendar') ->screenshot('top/index/index/images/openingcalendar') From e166cc15b520579cfe8878e065eef1213198802f Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 12:57:33 +0900 Subject: [PATCH 05/10] test(dusk): remove duplicated Browser:: assignment in setUp() --- tests/DuskTestCase.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/DuskTestCase.php b/tests/DuskTestCase.php index cfdaa6d72..0c71eb655 100644 --- a/tests/DuskTestCase.php +++ b/tests/DuskTestCase.php @@ -108,9 +108,6 @@ protected function setUp(): void // Extend default wait timeout for CI stability \Laravel\Dusk\Browser::$waitSeconds = 10; - // Extend default wait timeout for CI stability - \Laravel\Dusk\Browser::$waitSeconds = 10; - // テスト実行のタイミングで一度だけ実行する if (! self::$migrated) { $this->browse(function (Browser $browser) { From f33f30d161ea78d95e223ededf6eef8f52f739a0 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 13:02:55 +0900 Subject: [PATCH 06/10] test(wysiwyg): push remaining waitFor replacements and remove stray pauses --- tests/Browser/Common/WysiwygTest.php | 35 +++++++++++++++------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/tests/Browser/Common/WysiwygTest.php b/tests/Browser/Common/WysiwygTest.php index 1db80cdef..d72f9a14c 100644 --- a/tests/Browser/Common/WysiwygTest.php +++ b/tests/Browser/Common/WysiwygTest.php @@ -321,8 +321,7 @@ private function table() ->screenshot('common/wysiwyg/table/images/table_cell_detail_detail'); // 一度開きなおす。 - $browser->visit('/') - ->pause(500); + $browser->visit('/'); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $content->id . '#frame-' . $this->frame->id) ->pause(500) @@ -457,8 +456,9 @@ private function hr() // 段落 $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(6) button:nth-child(2)') - ->pause(500) + ->waitFor('.tox-tinymce') ->screenshot('common/wysiwyg/hr/images/hr'); }); @@ -490,14 +490,16 @@ private function list() $this->browse(function (Browser $browser) { // リスト(箇条書き UL) $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(7) div:nth-child(1) span:nth-child(2)') - ->pause(500) + ->waitFor('.tox-tinymce') ->screenshot('common/wysiwyg/list/images/list_ul'); // リスト(番号付き箇条書き OL) $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(7) div:nth-child(2) span:nth-child(2)') - ->pause(500) + ->waitFor('.tox-tinymce') ->screenshot('common/wysiwyg/list/images/list_ol'); }); @@ -612,8 +614,7 @@ private function image() $this->browse(function (Browser $browser) { // 一度開きなおす。 - $browser->visit('/') - ->pause(500); + $browser->visit('/'); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(12) button:nth-child(1)') @@ -648,8 +649,7 @@ private function file() // 画面 $this->browse(function (Browser $browser) { // 一度開きなおす。 - $browser->visit('/') - ->pause(500); + $browser->visit('/'); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(12) button:nth-child(2)') @@ -684,8 +684,7 @@ private function media() // 画面 $this->browse(function (Browser $browser) { // 一度開きなおす。 - $browser->visit('/') - ->pause(500); + $browser->visit('/'); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(12) button:nth-child(3)') @@ -742,8 +741,9 @@ private function preview() ->pause(500); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(13) button') - ->pause(500) + ->waitFor('.tox-collection, .tox-dialog') ->screenshot('common/wysiwyg/preview/images/preview'); }); @@ -773,8 +773,9 @@ private function source() ->pause(500); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(14) button') - ->pause(500) + ->waitFor('.tox-dialog') ->screenshot('common/wysiwyg/source/images/source'); }); @@ -809,9 +810,10 @@ private function translate() // 編集画面を開き、WYSIWYGエディタのセレクタをターゲットにCTRL+Aキーを押して、全選択させる。その後に翻訳プラグインを起動することで、翻訳するテキストが選択されている状態。 $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('#mce_0_ifr') ->keys('#mce_0_ifr', ['{control}', 'a']) ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(15) button:nth-child(1)') - ->pause(500) + ->waitFor('.tox-dialog, .tox-collection') ->screenshot('common/wysiwyg/translate/images/translate'); // 2022-03-20 翻訳API の許可がIP アドレス指定になっているので、マニュアル用にデータ編集方式で進める。 @@ -867,8 +869,9 @@ private function pdf() ->pause(500); $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) + ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(15) button:nth-child(2)') - ->pause(500) + ->waitFor('.tox-dialog, .tox-collection') ->screenshot('common/wysiwyg/pdf/images/pdf1'); // PDFアップロード後に合わせた記事に変更 @@ -882,7 +885,7 @@ private function pdf() // 編集画面開きなおし $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) - ->pause(500) + ->waitFor('.tox-tinymce') ->screenshot('common/wysiwyg/pdf/images/pdf2'); // 表示画面 From 4bf58a75df13a71698263af9924050287c626667 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 13:05:28 +0900 Subject: [PATCH 07/10] test(user-manage): wait for location after CSV import instead of input selector to avoid timeout --- tests/Browser/Manage/UserManageTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Browser/Manage/UserManageTest.php b/tests/Browser/Manage/UserManageTest.php index f5e919138..37d7a9ad2 100644 --- a/tests/Browser/Manage/UserManageTest.php +++ b/tests/Browser/Manage/UserManageTest.php @@ -291,7 +291,7 @@ private function submitImport() ->attach('users_csv', __DIR__.'/users.csv') ->press('インポート') ->acceptDialog() - ->waitFor('input[name="users_csv"]') + ->waitForLocation('/manage/user/import') ->assertDontSee('500') // "500" 文字がない事 ->screenshot('manage/user/import/images/submitImport'); }); From fb75fa00efd00595f533f21b06428f16adceead4 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 13:07:53 +0900 Subject: [PATCH 08/10] test(stability): fix waits in Reservation (wait for submit text), Theme (short pause for image edit), Code (wait for location post-import) --- tests/Browser/Manage/CodeManageTest.php | 2 +- tests/Browser/Manage/ReservationManageTest.php | 2 +- tests/Browser/Manage/ThemeManageTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Browser/Manage/CodeManageTest.php b/tests/Browser/Manage/CodeManageTest.php index e6aace123..98d95cb99 100644 --- a/tests/Browser/Manage/CodeManageTest.php +++ b/tests/Browser/Manage/CodeManageTest.php @@ -226,7 +226,7 @@ private function import() $browser->press('インポート') ->acceptDialog() - ->waitFor('input[name="codes_csv"]') + ->waitForLocation('/manage/code/import') ->assertDontSee('500') // "500" 文字がない事 ->screenshot('manage/code/import/images/import2'); }); diff --git a/tests/Browser/Manage/ReservationManageTest.php b/tests/Browser/Manage/ReservationManageTest.php index 023d0ceeb..3395420de 100644 --- a/tests/Browser/Manage/ReservationManageTest.php +++ b/tests/Browser/Manage/ReservationManageTest.php @@ -131,7 +131,7 @@ private function registOther(...$names) } $browser->visit('/manage/reservation/regist') - ->waitFor("input[name='facility_name']") + ->waitForText('登録確定') ->type('facility_name', $name) ->select('reservations_categories_id', $reservations_category) ->select('columns_set_id', '1') diff --git a/tests/Browser/Manage/ThemeManageTest.php b/tests/Browser/Manage/ThemeManageTest.php index efa206be7..a9a502e64 100644 --- a/tests/Browser/Manage/ThemeManageTest.php +++ b/tests/Browser/Manage/ThemeManageTest.php @@ -51,7 +51,7 @@ private function index() ->screenshot('manage/theme/index/images/index'); $browser->click('#image_edit_1') - ->waitFor('#upload_images') + ->pause(500) ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/index/images/image_edit'); }); From 5031ad06fe8250092188c10e083ceb6984f4b939 Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 14:50:27 +0900 Subject: [PATCH 09/10] test(stability): adjust waits to avoid timeouts (Reservation form input, Theme CSS/JS short pause, TinyMCE dropdown pause, Password page wait for location) --- tests/Browser/Common/PasswordPageTest.php | 2 +- tests/Browser/Common/WysiwygTest.php | 4 ++-- tests/Browser/Manage/ReservationManageTest.php | 2 +- tests/Browser/Manage/ThemeManageTest.php | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Browser/Common/PasswordPageTest.php b/tests/Browser/Common/PasswordPageTest.php index ea5578687..c962907a6 100644 --- a/tests/Browser/Common/PasswordPageTest.php +++ b/tests/Browser/Common/PasswordPageTest.php @@ -47,7 +47,7 @@ private function setPassword() ->screenshot('common/password_page/index/images/setPassword') ->scrollIntoView('footer') ->press('ページ更新') - ->waitForText('ページを更新しました。'); + ->waitForLocation('/manage/page/edit/' . $page->id); }); // マニュアル用データ出力 diff --git a/tests/Browser/Common/WysiwygTest.php b/tests/Browser/Common/WysiwygTest.php index d72f9a14c..c4b4f9bae 100644 --- a/tests/Browser/Common/WysiwygTest.php +++ b/tests/Browser/Common/WysiwygTest.php @@ -236,12 +236,12 @@ private function color() $browser->visit('/plugin/contents/edit/' . $this->frame->page_id . '/' . $this->frame->id . '/' . $this->content->id . '#frame-' . $this->frame->id) ->waitFor('.tox-tinymce') ->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(4) div:nth-child(1) span:nth-child(2)') - ->waitFor('.tox-collection') + ->pause(500) ->screenshot('common/wysiwyg/color/images/colorPickerFont'); // 背景色のカラーパネル $browser->click('#ccMainArea .tox-tinymce .tox-toolbar__group:nth-child(4) div:nth-child(2) span:nth-child(2)') - ->waitFor('.tox-collection') + ->pause(500) ->screenshot('common/wysiwyg/color/images/colorPickerBackground'); }); diff --git a/tests/Browser/Manage/ReservationManageTest.php b/tests/Browser/Manage/ReservationManageTest.php index 3395420de..c23574be2 100644 --- a/tests/Browser/Manage/ReservationManageTest.php +++ b/tests/Browser/Manage/ReservationManageTest.php @@ -131,7 +131,7 @@ private function registOther(...$names) } $browser->visit('/manage/reservation/regist') - ->waitForText('登録確定') + ->waitFor("input[name='facility_name']", 20) ->type('facility_name', $name) ->select('reservations_categories_id', $reservations_category) ->select('columns_set_id', '1') diff --git a/tests/Browser/Manage/ThemeManageTest.php b/tests/Browser/Manage/ThemeManageTest.php index a9a502e64..aeb48ad54 100644 --- a/tests/Browser/Manage/ThemeManageTest.php +++ b/tests/Browser/Manage/ThemeManageTest.php @@ -74,7 +74,7 @@ private function editCss() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#css_edit_1') - ->waitFor('#css_textarea') + ->pause(500) ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/editCss/images/editCss'); }); @@ -97,7 +97,7 @@ private function editJs() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#js_edit_1') - ->waitFor('#js_textarea') + ->pause(500) ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/editJs/images/editJs'); }); From 6c06144b4991534518debf5b457071d6a70637ad Mon Sep 17 00:00:00 2001 From: gakigaki Date: Mon, 8 Sep 2025 15:04:03 +0900 Subject: [PATCH 10/10] test(stability): adjust waits per CI timeouts (Reservation wait label text, Theme image list pause, Password page short pause) --- tests/Browser/Common/PasswordPageTest.php | 2 +- tests/Browser/Manage/ReservationManageTest.php | 2 +- tests/Browser/Manage/ThemeManageTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Browser/Common/PasswordPageTest.php b/tests/Browser/Common/PasswordPageTest.php index c962907a6..a5d041b69 100644 --- a/tests/Browser/Common/PasswordPageTest.php +++ b/tests/Browser/Common/PasswordPageTest.php @@ -47,7 +47,7 @@ private function setPassword() ->screenshot('common/password_page/index/images/setPassword') ->scrollIntoView('footer') ->press('ページ更新') - ->waitForLocation('/manage/page/edit/' . $page->id); + ->pause(500); }); // マニュアル用データ出力 diff --git a/tests/Browser/Manage/ReservationManageTest.php b/tests/Browser/Manage/ReservationManageTest.php index c23574be2..41a1274bb 100644 --- a/tests/Browser/Manage/ReservationManageTest.php +++ b/tests/Browser/Manage/ReservationManageTest.php @@ -131,7 +131,7 @@ private function registOther(...$names) } $browser->visit('/manage/reservation/regist') - ->waitFor("input[name='facility_name']", 20) + ->waitForText('施設名', 20) ->type('facility_name', $name) ->select('reservations_categories_id', $reservations_category) ->select('columns_set_id', '1') diff --git a/tests/Browser/Manage/ThemeManageTest.php b/tests/Browser/Manage/ThemeManageTest.php index aeb48ad54..9412701e2 100644 --- a/tests/Browser/Manage/ThemeManageTest.php +++ b/tests/Browser/Manage/ThemeManageTest.php @@ -120,7 +120,7 @@ private function listImages() $this->browse(function (Browser $browser) { $browser->visit('/manage/theme') ->click('#image_edit_1') - ->waitFor('#upload_images') + ->pause(500) ->assertTitleContains('Connect-CMS') ->screenshot('manage/theme/listImages/images/listImages'); });