diff --git a/packages/e2e-tests/specs/editor/plugins/__snapshots__/inner-blocks-render-appender.test.js.snap b/packages/e2e-tests/specs/editor/plugins/__snapshots__/inner-blocks-render-appender.test.js.snap
deleted file mode 100644
index 232e6e02b398eb..00000000000000
--- a/packages/e2e-tests/specs/editor/plugins/__snapshots__/inner-blocks-render-appender.test.js.snap
+++ /dev/null
@@ -1,25 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`RenderAppender prop of InnerBlocks Users can customize the appender and can still insert blocks using exposed components 1`] = `
-"
-
-"
-`;
-
-exports[`RenderAppender prop of InnerBlocks Users can dynamically customize the appender 1`] = `
-"
-
-"
-`;
diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js
deleted file mode 100644
index 1322713b033e24..00000000000000
--- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * WordPress dependencies
- */
-import {
- activatePlugin,
- createNewPost,
- deactivatePlugin,
- getAllBlockInserterItemTitles,
- getEditedPostContent,
- insertBlock,
- closeGlobalBlockInserter,
-} from '@wordpress/e2e-test-utils';
-
-const INSERTER_RESULTS_SELECTOR =
- '.block-editor-inserter__quick-inserter-results';
-const QUOTE_INSERT_BUTTON_SELECTOR = '//button[.="Quote"]';
-const APPENDER_SELECTOR = '.my-custom-awesome-appender';
-const DYNAMIC_APPENDER_SELECTOR = 'my-dynamic-blocks-appender';
-
-describe( 'RenderAppender prop of InnerBlocks', () => {
- beforeAll( async () => {
- await activatePlugin( 'gutenberg-test-innerblocks-render-appender' );
- } );
-
- beforeEach( async () => {
- await createNewPost();
- } );
-
- afterAll( async () => {
- await deactivatePlugin( 'gutenberg-test-innerblocks-render-appender' );
- } );
-
- it( 'Users can customize the appender and can still insert blocks using exposed components', async () => {
- // Insert the InnerBlocks renderAppender block.
- await insertBlock( 'InnerBlocks renderAppender' );
- await closeGlobalBlockInserter();
- // Wait for the custom block appender to appear.
- await page.waitForSelector( APPENDER_SELECTOR );
- // Verify if the custom block appender text is the expected one.
- expect(
- await page.evaluate(
- ( el ) => el.innerText,
- await page.$( `${ APPENDER_SELECTOR } > span` )
- )
- ).toEqual( 'My custom awesome appender' );
-
- // Open the inserter of our custom block appender and expand all the categories.
- await page.click(
- `${ APPENDER_SELECTOR } .block-editor-button-block-appender`
- );
- // Verify if the blocks the custom inserter is rendering are the expected ones.
- expect( await getAllBlockInserterItemTitles() ).toEqual( [
- 'Quote',
- 'Video',
- ] );
-
- // Find the quote block insert button option within the inserter popover.
- const inserterPopover = await page.$( INSERTER_RESULTS_SELECTOR );
- const quoteButton = (
- await inserterPopover.$x( QUOTE_INSERT_BUTTON_SELECTOR )
- )[ 0 ];
-
- // Insert a quote block.
- await quoteButton.click();
- // Verify if the post content is the expected one e.g: the quote was inserted.
- expect( await getEditedPostContent() ).toMatchSnapshot();
- } );
-
- it( 'Users can dynamically customize the appender', async () => {
- // Insert the InnerBlocks renderAppender dynamic block.
- await insertBlock( 'InnerBlocks renderAppender dynamic' );
- await closeGlobalBlockInserter();
-
- // Wait for the custom dynamic block appender to appear.
- await page.waitForSelector( '.' + DYNAMIC_APPENDER_SELECTOR );
-
- // Verify if the custom block appender text is the expected one.
- await page.waitForXPath(
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "empty-blocks-appender")][contains(text(), "Empty Blocks Appender")]`
- );
-
- // Open the inserter of our custom block appender and expand all the categories.
- const blockAppenderButtonSelector = `.${ DYNAMIC_APPENDER_SELECTOR } .block-editor-button-block-appender`;
- await page.click( blockAppenderButtonSelector );
-
- // Verify if the blocks the custom inserter is rendering are the expected ones.
- expect( await getAllBlockInserterItemTitles() ).toEqual( [
- 'Quote',
- 'Video',
- ] );
-
- // Find the quote block insert button option within the inserter popover.
- const inserterPopover = await page.$( INSERTER_RESULTS_SELECTOR );
- const quoteButton = (
- await inserterPopover.$x( QUOTE_INSERT_BUTTON_SELECTOR )
- )[ 0 ];
-
- // Insert a quote block.
- await quoteButton.click();
-
- // Select the quote block.
- await page.keyboard.press( 'ArrowDown' );
-
- // Verify if the custom block appender text changed as expected.
- await page.waitForXPath(
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "single-blocks-appender")][contains(text(), "Single Blocks Appender")]`
- );
-
- // Verify that the custom appender button is still being rendered.
- expect( await page.$( blockAppenderButtonSelector ) ).toBeTruthy();
-
- // Insert a video block.
- await insertBlock( 'Video' );
-
- // Verify if the custom block appender text changed as expected.
- await page.waitForXPath(
- `//*[contains(@class, "${ DYNAMIC_APPENDER_SELECTOR }")]/span[contains(@class, "multiple-blocks-appender")][contains(text(), "Multiple Blocks Appender")]`
- );
-
- // Verify that the custom appender button is now not being rendered.
- expect( await page.$( blockAppenderButtonSelector ) ).toBeFalsy();
-
- // Verify that final block markup is the expected one.
- expect( await getEditedPostContent() ).toMatchSnapshot();
- } );
-} );
diff --git a/test/e2e/specs/editor/plugins/inner-blocks-render-appender.spec.js b/test/e2e/specs/editor/plugins/inner-blocks-render-appender.spec.js
new file mode 100644
index 00000000000000..9886bd00fe2b66
--- /dev/null
+++ b/test/e2e/specs/editor/plugins/inner-blocks-render-appender.spec.js
@@ -0,0 +1,129 @@
+/**
+ * WordPress dependencies
+ */
+const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' );
+
+test.describe( 'RenderAppender prop of InnerBlocks', () => {
+ test.beforeAll( async ( { requestUtils } ) => {
+ await requestUtils.activatePlugin(
+ 'gutenberg-test-innerblocks-render-appender'
+ );
+ } );
+
+ test.beforeEach( async ( { admin } ) => {
+ await admin.createNewPost();
+ } );
+
+ test.afterAll( async ( { requestUtils } ) => {
+ await requestUtils.deactivatePlugin(
+ 'gutenberg-test-innerblocks-render-appender'
+ );
+ } );
+
+ test( 'Users can customize the appender and can still insert blocks using exposed components', async ( {
+ editor,
+ page,
+ } ) => {
+ await editor.insertBlock( {
+ name: 'test/inner-blocks-render-appender',
+ } );
+
+ const customAppender = page.locator( '.my-custom-awesome-appender' );
+
+ // Verify if the custom block appender text is the expected one.
+ await expect( customAppender ).toContainText(
+ 'My custom awesome appender'
+ );
+
+ // Open the inserter of our custom block appender.
+ await customAppender
+ .getByRole( 'button', { name: 'Add block' } )
+ .click();
+
+ // Verify if the blocks the custom inserter is rendering are the expected ones.
+ const blockListBox = page.getByRole( 'listbox', { name: 'Blocks' } );
+ await expect( blockListBox.getByRole( 'option' ) ).toHaveText( [
+ 'Quote',
+ 'Video',
+ ] );
+
+ // Insert a quote block.
+ await blockListBox.getByRole( 'option', { name: 'Quote' } ).click();
+
+ // Verify if the post content is the expected one.
+ await expect.poll( editor.getBlocks ).toMatchObject( [
+ {
+ name: 'test/inner-blocks-render-appender',
+ innerBlocks: [
+ {
+ name: 'core/quote',
+ },
+ ],
+ },
+ ] );
+ } );
+
+ test( 'Users can dynamically customize the appender', async ( {
+ editor,
+ page,
+ } ) => {
+ await editor.insertBlock( {
+ name: 'test/inner-blocks-render-appender-dynamic',
+ } );
+
+ const dynamimcAppender = page.locator( '.my-dynamic-blocks-appender' );
+ const addBlockBtn = dynamimcAppender.getByRole( 'button', {
+ name: 'Add block',
+ } );
+
+ // Verify if the custom block appender text is the expected one.
+ await expect( dynamimcAppender ).toContainText(
+ 'Empty Blocks Appender'
+ );
+
+ // Open the inserter of our custom block appender.
+ await addBlockBtn.click();
+
+ // Verify if the blocks the custom inserter is rendering are the expected ones.
+ const blockListBox = page.getByRole( 'listbox', { name: 'Blocks' } );
+ await expect( blockListBox.getByRole( 'option' ) ).toHaveText( [
+ 'Quote',
+ 'Video',
+ ] );
+
+ // Insert a quote block.
+ await blockListBox.getByRole( 'option', { name: 'Quote' } ).click();
+
+ // Verify if the custom block appender text changed as expected.
+ await expect(
+ dynamimcAppender.getByText( 'Single Blocks Appender' )
+ ).toBeVisible();
+
+ // Insert a video block.
+ await addBlockBtn.click();
+ await blockListBox.getByRole( 'option', { name: 'Video' } ).click();
+
+ // Verify if the custom block appender text changed as expected.
+ await expect(
+ dynamimcAppender.getByText( 'Multiple Blocks Appender' )
+ ).toBeVisible();
+
+ // Verify that the custom appender button is now not being rendered.
+ await expect( addBlockBtn ).toBeHidden();
+
+ // Verify if the post content is the expected one.
+ await expect.poll( editor.getBlocks ).toMatchObject( [
+ {
+ name: 'test/inner-blocks-render-appender-dynamic',
+ innerBlocks: [
+ {
+ name: 'core/quote',
+ },
+ {
+ name: 'core/video',
+ },
+ ],
+ },
+ ] );
+ } );
+} );