diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index e9a2359b7..e31b45591 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -51,7 +51,7 @@ jobs: # Defines the WordPress and PHP Versions matrix to run tests on. strategy: matrix: - wp-versions: [ 'latest' ] #[ '6.1.1', 'latest' ] + wp-versions: [ '7.1-RC1' ] #[ '6.1.1', 'latest' ] php-versions: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] #[ '7.3', '7.4', '8.0', '8.1' ] # Steps to install, configure and run tests diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1e6581ad2..c82e1a1e8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - wp-version: [ 'latest' ] + wp-version: [ '7.1-RC1' ] php-version: [ '8.1', '8.2', '8.3', '8.4' ] test-group: - 'EndToEnd/broadcasts/blocks-shortcodes' diff --git a/tests/EndToEnd/general/plugin-screens/PluginSettingsFormEntriesCest.php b/tests/EndToEnd/general/plugin-screens/PluginSettingsFormEntriesCest.php index 301eef3fd..8adfb8f74 100644 --- a/tests/EndToEnd/general/plugin-screens/PluginSettingsFormEntriesCest.php +++ b/tests/EndToEnd/general/plugin-screens/PluginSettingsFormEntriesCest.php @@ -462,8 +462,8 @@ public function testFormEntriesTableDeleteBulkAction(EndToEndTester $I) $I->waitForElementNotVisible('input#convertkit_form_entries_per_page'); // Select the first two entries. - $I->checkOption('tbody#the-list tr:first-child th.check-column input[type="checkbox"]'); - $I->checkOption('tbody#the-list tr:nth-child(2) th.check-column input[type="checkbox"]'); + $I->checkOption('tbody#the-list tr:first-child .check-column input[type="checkbox"]'); + $I->checkOption('tbody#the-list tr:nth-child(2) .check-column input[type="checkbox"]'); // Click Delete. $I->selectOption('#bulk-action-selector-top', 'Delete'); diff --git a/tests/EndToEnd/general/plugin-screens/PluginSetupWizardCest.php b/tests/EndToEnd/general/plugin-screens/PluginSetupWizardCest.php index 33ed640af..de00f95b9 100644 --- a/tests/EndToEnd/general/plugin-screens/PluginSetupWizardCest.php +++ b/tests/EndToEnd/general/plugin-screens/PluginSetupWizardCest.php @@ -53,7 +53,7 @@ public function testSetupWizardDoesNotDisplayWhenConfigured(EndToEndTester $I) $I->waitForElementVisible('table.plugins tr[data-slug=convertkit].active'); // Click Setup Wizard link underneath the Plugin in the WP_List_Table. - $I->click('tr[data-slug="convertkit"] td div.row-actions span.setup_wizard a'); + $I->click('tr[data-slug="convertkit"] .row-actions span.setup_wizard a'); } /** @@ -665,7 +665,7 @@ public function testSetupWizardLinkOnPluginsScreen(EndToEndTester $I) $I->waitForElementVisible('body.plugins-php'); // Click Setup Wizard link underneath the Plugin in the WP_List_Table. - $I->click('tr[data-slug="convertkit"] td div.row-actions span.setup_wizard a'); + $I->click('tr[data-slug="convertkit"] .row-actions span.setup_wizard a'); // Confirm expected setup wizard screen is displayed. $this->_seeExpectedSetupWizardScreen( diff --git a/tests/Support/Helper/Divi5Theme.php b/tests/Support/Helper/Divi5Theme.php index 344bcdab9..78cd4fe53 100644 --- a/tests/Support/Helper/Divi5Theme.php +++ b/tests/Support/Helper/Divi5Theme.php @@ -40,9 +40,19 @@ public function createDivi5Page($I, $title) // Edit Page. $I->amOnPage('/wp-admin/post.php?post=' . $pageID . '&action=edit'); + // Switch to the Gutenberg IFrame. + if ($I->isGutenbergIFrameEditorEnabled()) { + $I->switchToGutenbergIFrameEditor($I); + } + // Click "Use The Divi Builder" button. $I->click('#et-switch-to-divi'); + // Switch back to main window. + if ($I->isGutenbergIFrameEditorEnabled()) { + $I->switchToIFrame(); + } + // Wait for Divi Builder to load. $I->waitForElementVisible('body.et_pb_pagebuilder_layout'); } diff --git a/tests/Support/Helper/ThirdPartyPlugin.php b/tests/Support/Helper/ThirdPartyPlugin.php index eb1d29141..93c91205e 100644 --- a/tests/Support/Helper/ThirdPartyPlugin.php +++ b/tests/Support/Helper/ThirdPartyPlugin.php @@ -43,7 +43,7 @@ public function activateThirdPartyPlugin($I, $name, $wizardExpectsToDisplay = tr default: // Activate the Plugin. - $I->checkOption('//*[@data-slug="' . $name . '"]/th/input'); + $I->checkOption('//*[@data-slug="' . $name . '"]//input[@type="checkbox"]'); $I->selectOption('action', 'activate-selected'); $I->click('#doaction'); break; @@ -114,7 +114,7 @@ public function deactivateThirdPartyPlugin($I, $name) default: // Deactivate the Plugin. - $I->checkOption('//*[@data-slug="' . $name . '"]/th/input'); + $I->checkOption('//*[@data-slug="' . $name . '"]//input[@type="checkbox"]'); $I->selectOption('action', 'deactivate-selected'); $I->click('#doaction'); break; diff --git a/tests/Support/Helper/WPGutenberg.php b/tests/Support/Helper/WPGutenberg.php index a892f4d29..a4d9d4b2a 100644 --- a/tests/Support/Helper/WPGutenberg.php +++ b/tests/Support/Helper/WPGutenberg.php @@ -33,9 +33,15 @@ public function isGutenbergIFrameEditorEnabled() */ public function switchToGutenbergIFrameEditor($I) { - // Don't switch if the iframe doesn't exist e.g. Divi is active, which prevents - // the iframe block editor in WordPress 7.0+ from being used. - if ( ! $I->tryToSeeElement('iframe[name="editor-canvas"]')) { + // Wait for the iframe to mount. In WordPress 7.1+ the editor iframe + // can take longer to appear in the DOM than a tryToSeeElement() + // check, causing the switch to be silently skipped. Catch the timeout + // so that environments which intentionally have no iframe (e.g. Divi + // is active, which prevents the iframe block editor from being used) + // still fall through to the non-iframe path. + try { + $I->waitForElement('iframe[name="editor-canvas"]', 10); + } catch (\Facebook\WebDriver\Exception\TimeoutException $e) { return; } @@ -123,7 +129,7 @@ public function addGutenbergBlock($I, $blockName, $blockProgrammaticName, $block // Also add last segment after slash, for compatibility with older WordPress versions. $parts = explode('/', $blockProgrammaticName); if (count($parts) === 2) { - $potentialNames[] = $parts[1]; + array_unshift($potentialNames, $parts[1]); } } @@ -215,22 +221,15 @@ public function addGutenbergBlock($I, $blockName, $blockProgrammaticName, $block */ public function addGutenbergParagraphBlock($I, $text) { - // Add paragraph block. - $I->addGutenbergBlock($I, 'Paragraph', 'paragraph/paragraph'); - - // Switch to the Gutenberg IFrame. - if ($this->isGutenbergIFrameEditorEnabled()) { - $I->switchToGutenbergIFrameEditor($I); - } - - // Click the editor area and enter the text in the paragraph. - $I->click('.wp-block-post-content'); - $I->fillField('.wp-block-post-content p[data-empty="true"]', $text); - - // Switch back to main window. - if ($this->isGutenbergIFrameEditorEnabled()) { - $I->switchToIFrame(); - } + // Programmatically insert a Paragraph block with the given content via + // Gutenberg's data store. Bypasses the block inserter + click + + // fillField sequence that WP 7.1's iframed editor makes unreliable. + // Resolve whichever window has it before dispatching. + $I->executeJS( + 'var w = (typeof wp !== "undefined" && wp.data) ? window : (document.querySelector("iframe[name=\"editor-canvas\"]") || {}).contentWindow;' . + 'w.wp.data.dispatch("core/block-editor").insertBlock(w.wp.blocks.createBlock("core/paragraph", {content: arguments[0]}));', + [ $text ] + ); } /** @@ -402,12 +401,18 @@ public function seeGutenbergBlockAvailable($I, $blockName, $blockProgrammaticNam $I->wait(2); // Build potential programmatic block names. + // Try the short name (last segment after any `/`) FIRST — modern + // WordPress uses a class like `editor-block-list-item-paragraph`, + // which matches via a fast CSS selector. The full `paragraph/paragraph` + // form only matches an XPath that DOM classes can never satisfy (CSS + // classes can't contain `/`), so leaving it first burned the full + // waitForElementVisible timeout on every insertion. $potentialNames = [ $blockProgrammaticName ]; if (strpos($blockProgrammaticName, '/') !== false) { // Also add last segment after slash, for compatibility with older WordPress versions. $parts = explode('/', $blockProgrammaticName); if (count($parts) === 2) { - $potentialNames[] = $parts[1]; + array_unshift($potentialNames, $parts[1]); } }