diff --git a/core/modules/config/src/Tests/ConfigEntityTest.php b/core/modules/config/src/Tests/ConfigEntityTest.php
index c0dc97b..fb9fade 100644
--- a/core/modules/config/src/Tests/ConfigEntityTest.php
+++ b/core/modules/config/src/Tests/ConfigEntityTest.php
@@ -233,109 +233,14 @@ public function testCRUD() {
   public function testCRUDUI() {
     $this->drupalLogin($this->drupalCreateUser(['administer site configuration']));
 
-    $id = strtolower($this->randomMachineName());
-    $label1 = $this->randomMachineName();
-    $label2 = $this->randomMachineName();
-    $label3 = $this->randomMachineName();
-    $message_insert = format_string('%label configuration has been created.', ['%label' => $label1]);
-    $message_update = format_string('%label configuration has been updated.', ['%label' => $label2]);
-    $message_delete = format_string('The test configuration %label has been deleted.', ['%label' => $label2]);
-
-    // Create a configuration entity.
-    $edit = [
-      'id' => $id,
-      'label' => $label1,
-    ];
-    $this->drupalPostForm('admin/structure/config_test/add', $edit, 'Save');
-    $this->assertUrl('admin/structure/config_test');
-    $this->assertResponse(200);
-    $this->assertRaw($message_insert);
-    $this->assertNoRaw($message_update);
-    $this->assertLinkByHref("admin/structure/config_test/manage/$id");
-
-    // Update the configuration entity.
-    $edit = [
-      'label' => $label2,
-    ];
-    $this->drupalPostForm("admin/structure/config_test/manage/$id", $edit, 'Save');
-    $this->assertUrl('admin/structure/config_test');
-    $this->assertResponse(200);
-    $this->assertNoRaw($message_insert);
-    $this->assertRaw($message_update);
-    $this->assertLinkByHref("admin/structure/config_test/manage/$id");
-    $this->assertLinkByHref("admin/structure/config_test/manage/$id/delete");
-
-    // Delete the configuration entity.
-    $this->drupalGet("admin/structure/config_test/manage/$id");
-    $this->clickLink(t('Delete'));
-    $this->assertUrl("admin/structure/config_test/manage/$id/delete");
-    $this->drupalPostForm(NULL, [], 'Delete');
-    $this->assertUrl('admin/structure/config_test');
-    $this->assertResponse(200);
-    $this->assertNoRaw($message_update);
-    $this->assertRaw($message_delete);
-    $this->assertNoText($label1);
-    $this->assertNoLinkByHref("admin/structure/config_test/manage/$id");
-
-    // Re-create a configuration entity.
-    $edit = [
-      'id' => $id,
-      'label' => $label1,
-    ];
-    $this->drupalPostForm('admin/structure/config_test/add', $edit, 'Save');
-    $this->assertUrl('admin/structure/config_test');
-    $this->assertResponse(200);
-    $this->assertText($label1);
-    $this->assertLinkByHref("admin/structure/config_test/manage/$id");
-
-    // Rename the configuration entity's ID/machine name.
-    $edit = [
-      'id' => strtolower($this->randomMachineName()),
-      'label' => $label3,
-    ];
-    $this->drupalPostForm("admin/structure/config_test/manage/$id", $edit, 'Save');
-    $this->assertUrl('admin/structure/config_test');
-    $this->assertResponse(200);
-    $this->assertNoText($label1);
-    $this->assertNoText($label2);
-    $this->assertText($label3);
-    $this->assertNoLinkByHref("admin/structure/config_test/manage/$id");
-    $id = $edit['id'];
-    $this->assertLinkByHref("admin/structure/config_test/manage/$id");
-
-    // Create a configuration entity with '0' machine name.
-    $edit = [
-      'id' => '0',
-      'label' => '0',
-    ];
-    $this->drupalPostForm('admin/structure/config_test/add', $edit, 'Save');
-    $this->assertResponse(200);
-    $message_insert = format_string('%label configuration has been created.', ['%label' => $edit['label']]);
-    $this->assertRaw($message_insert);
-    $this->assertLinkByHref('admin/structure/config_test/manage/0');
-    $this->assertLinkByHref('admin/structure/config_test/manage/0/delete');
-    $this->drupalPostForm('admin/structure/config_test/manage/0/delete', [], 'Delete');
-    $this->assertFalse(entity_load('config_test', '0'), 'Test entity deleted');
-
-    // Create a configuration entity with a property that uses AJAX to show
-    // extra form elements.
-    $this->drupalGet('admin/structure/config_test/add');
-
-    // Test that the dependent element is not shown initially.
-    $this->assertFieldByName('size');
-    $this->assertNoFieldByName('size_value');
-
+    // Create a configuration entity with a property that uses the non-JS case
+    // by using a 'js-hidden' submit button.
     $id = strtolower($this->randomMachineName());
     $edit = [
       'id' => $id,
       'label' => $this->randomString(),
       'size' => 'custom',
     ];
-    $this->drupalPostAjaxForm(NULL, $edit, 'size');
-
-    // Check that the dependent element is shown after selecting a 'size' value.
-    $this->assertFieldByName('size');
-    $this->assertFieldByName('size_value');
 
     // Test the same scenario but it in a non-JS case by using a 'js-hidden'
     // submit button.
diff --git a/core/modules/config/tests/src/FunctionalJavascript/ConfigEntityTest.php b/core/modules/config/tests/src/FunctionalJavascript/ConfigEntityTest.php
new file mode 100644
index 0000000..b58c6a8
--- /dev/null
+++ b/core/modules/config/tests/src/FunctionalJavascript/ConfigEntityTest.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Drupal\Tests\config\FunctionalJavascript;
+
+use Drupal\Component\Render\FormattableMarkup;
+use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
+
+/**
+ * Tests the View UI filter criteria group dialog.
+ *
+ * @group views_ui
+ */
+class ConfigEntityTest extends JavascriptTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['config_test'];
+
+  /**
+   * Tests CRUD operations through the UI.
+   */
+  public function testCRUDUI() {
+    $this->drupalLogin($this->drupalCreateUser(['administer site configuration']));
+
+    $id = strtolower($this->randomMachineName());
+    $label1 = $this->randomMachineName();
+    $label2 = $this->randomMachineName();
+    $label3 = $this->randomMachineName();
+    $message_insert = new FormattableMarkup('%label configuration has been created.', ['%label' => $label1]);
+    $message_update = new FormattableMarkup('%label configuration has been updated.', ['%label' => $label2]);
+    $message_delete = new FormattableMarkup('The test configuration %label has been deleted.', ['%label' => $label2]);
+
+    // Create a configuration entity.
+    $this->drupalGet('admin/structure/config_test/add');
+
+    $session = $this->getSession();
+    $assert_session = $this->assertSession();
+    $page = $session->getPage();
+
+    $field_id = $page->findField('id');
+    $field_label = $page->findField('label');
+    $button_save = $page->findButton('Save');
+
+    // Set values for the configuration entity and submit the form.
+    $field_id->setValue($id);
+    $field_label->setValue($label1);
+    $button_save->click();
+
+    $assert_session->addressEquals('admin/structure/config_test');
+    $assert_session->statusCodeEquals(200);
+    $assert_session->responseContains($message_insert);
+    $assert_session->responseNotContains($message_update);
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+
+    // Update the configuration entity.
+    $this->drupalGet("admin/structure/config_test/manage/$id");
+    $field_label->setValue($label2);
+    $button_save->click();
+    $assert_session->addressEquals('admin/structure/config_test');
+    $assert_session->statusCodeEquals(200);
+    $assert_session->responseNotContains($message_insert);
+    $assert_session->responseContains($message_update);
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '/delete"]'));
+
+    // Delete the configuration entity.
+    $this->drupalGet("admin/structure/config_test/manage/$id");
+    $this->clickLink(t('Delete'));
+    $assert_session->addressEquals("admin/structure/config_test/manage/$id/delete");
+    $page->findButton('Delete')->click();
+
+    $assert_session->addressEquals('admin/structure/config_test');
+    $assert_session->statusCodeEquals(200);
+    $assert_session->responseNotContains($message_update);
+    $assert_session->responseContains($message_delete);
+    $assert_session->responseNotContains($label1);
+    $this->assertNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+
+    // Re-create a configuration entity.
+    $this->drupalGet('admin/structure/config_test/add');
+    $field_id->setValue($id);
+    $field_label->setValue($label1);
+    $button_save->click();
+
+    $assert_session->addressEquals('admin/structure/config_test');
+    $assert_session->statusCodeEquals(200);
+    $assert_session->responseContains($label1);
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+
+    // Rename the configuration entity's ID/machine name.
+    $new_id = strtolower($this->randomMachineName());
+    $this->drupalGet("admin/structure/config_test/manage/$id");
+    $field_id->setValue($new_id);
+    $field_label->setValue($label3);
+    $button_save->click();
+
+    $assert_session->addressEquals('admin/structure/config_test');
+    $assert_session->statusCodeEquals(200);
+    $assert_session->responseNotContains($label1);
+    $assert_session->responseNotContains($label2);
+    $assert_session->responseContains($label3);
+    $this->assertNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+
+    $id = $new_id;
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/' . $id . '"]'));
+
+    // Create a configuration entity with '0' machine name.
+    $this->drupalGet('admin/structure/config_test/add');
+    $field_id->setValue('0');
+    $field_label->setValue('0');
+    $button_save->click();
+
+    $assert_session->statusCodeEquals(200);
+    $message_insert = new FormattableMarkup('%label configuration has been created.', ['%label' => '0']);
+    $assert_session->responseContains($message_insert);
+
+    $this->assertNotNull($page->find('css', 'a[href="/admin/structure/config_test/manage/0"]'));
+    $delete_link = $page->find('css', 'a[href="/admin/structure/config_test/manage/0/delete"]');
+
+    // Expand the options.
+    $ul = $delete_link->getParent()->getParent();
+    $ul->find('css', '.dropbutton-toggle button')->click();
+    $this->assertTrue($delete_link->isVisible());
+
+    // Navigate to the delete page and submit the delete form.
+    $delete_link->click();
+    $page->findButton('Delete')->click();
+
+    $entity = \Drupal::entityTypeManager()->getStorage('config_test')->load('0');
+    $this->assertFalse($entity, 'Test entity deleted');
+
+    // Create a configuration entity with a property that uses AJAX to show
+    // extra form elements.
+    $this->drupalGet('admin/structure/config_test/add');
+
+    // Test that the dependent element is not shown initially.
+    $field_size = $page->findField('size');
+    $field_size_value = $page->findField('size_value');
+    $this->assertNotNull($field_size);
+    $this->assertNull($field_size_value);
+
+    $id = strtolower($this->randomMachineName());
+    $field_id->setValue($id);
+    $field_label->setValue($this->randomString());
+    $field_size->setValue('custom');
+    $assert_session->assertWaitOnAjaxRequest();
+
+    // Check that the dependent element is shown after selecting a 'size' value.
+    $field_size_value = $page->findField('size_value');
+    $this->assertNotNull($field_size);
+    $this->assertNotNull($field_size_value);
+
+    $field_size_value->setValue('medium');
+    $button_save->click();
+
+    $entity = \Drupal::entityTypeManager()->getStorage('config_test')->load($id);
+    $this->assertEquals('custom', $entity->get('size'));
+    $this->assertEquals('medium', $entity->get('size_value'));
+  }
+
+}
