diff --git a/core/modules/outside_in/tests/src/FunctionalJavascript/OffCanvasTest.php b/core/modules/outside_in/tests/src/FunctionalJavascript/OffCanvasTest.php
index b81c723..4e3fc0e 100644
--- a/core/modules/outside_in/tests/src/FunctionalJavascript/OffCanvasTest.php
+++ b/core/modules/outside_in/tests/src/FunctionalJavascript/OffCanvasTest.php
@@ -18,9 +18,8 @@ class OffCanvasTest extends OutsideInJavascriptTestBase {
    * Tests that regular non-contextual links will work with the off-canvas tray.
    */
   public function testOffCanvasLinks() {
-    $themes = ['bartik', 'stark'];
     // Test the same functionality on multiple themes.
-    foreach ($themes as $theme) {
+    foreach ($this->getTestThemes() as $theme) {
       $this->enableTheme($theme);
       $this->drupalGet('/offcanvas-test-links');
 
@@ -73,7 +72,6 @@ public function testOffCanvasLinks() {
    * Tests the body displacement behaves differently at a narrow width.
    */
   public function testNarrowWidth() {
-    $themes = ['stark', 'bartik'];
     $narrow_width_breakpoint = 768;
     $offset = 20;
     $height = 800;
@@ -81,7 +79,7 @@ public function testNarrowWidth() {
     $web_assert = $this->assertSession();
 
     // Test the same functionality on multiple themes.
-    foreach ($themes as $theme) {
+    foreach ($this->getTestThemes() as $theme) {
       $this->enableTheme($theme);
       // Testing at the wider width.
       $this->getSession()->resizeWindow($narrow_width_breakpoint + $offset, $height);
diff --git a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
index c62436c..e9c4dfb 100644
--- a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
+++ b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\outside_in\FunctionalJavascript;
 
+use Drupal\block\Entity\Block;
 use Drupal\user\Entity\Role;
 
 /**
@@ -36,9 +37,6 @@ class OutsideInBlockFormTest extends OutsideInJavascriptTestBase {
    */
   protected function setUp() {
     parent::setUp();
-    // @todo Ensure that this test class works against bartik and stark:
-    //   https://www.drupal.org/node/2784881.
-    $this->enableTheme('bartik');
     $user = $this->createUser([
       'administer blocks',
       'access contextual links',
@@ -48,10 +46,6 @@ protected function setUp() {
       'search content',
     ]);
     $this->drupalLogin($user);
-
-    $this->placeBlock('system_powered_by_block', ['id' => 'powered']);
-    $this->placeBlock('system_branding_block', ['id' => 'branding']);
-    $this->placeBlock('search_form_block', ['id' => 'search']);
   }
 
   /**
@@ -59,76 +53,84 @@ protected function setUp() {
    *
    * @dataProvider providerTestBlocks
    */
-  public function testBlocks($block_id, $new_page_text, $element_selector, $label_selector, $button_text, $toolbar_item) {
+  public function testBlocks($block_plugin, $new_page_text, $element_selector, $label_selector, $button_text, $toolbar_item) {
     $web_assert = $this->assertSession();
     $page = $this->getSession()->getPage();
-    $block_selector = '#' . $block_id;
-    $this->drupalGet('user');
-    if (isset($toolbar_item)) {
-      // Check that you can open a toolbar tray and it will be closed after
-      // entering edit mode.
-      if ($element = $page->find('css', "#toolbar-administration a.is-active")) {
-        // If a tray was open from page load close it.
-        $element->click();
-        $this->waitForNoElement("#toolbar-administration a.is-active");
-      }
-      $page->find('css', $toolbar_item)->click();
-      $web_assert->waitForElementVisible('css', "{$toolbar_item}.is-active");
-    }
-    $this->enableEditMode();
-    if (isset($toolbar_item)) {
-      $this->waitForNoElement("{$toolbar_item}.is-active");
-    }
+    foreach ($this->getTestThemes() as $theme) {
+      $this->enableTheme($theme);
 
-    $this->openBlockForm($block_selector);
+      $block = $this->placeBlock($block_plugin);
+      $block_selector = str_replace('_', '-', $this->getBlockSelector($block));
+
+      $this->drupalGet('user');
+      if (isset($toolbar_item)) {
+        // Check that you can open a toolbar tray and it will be closed after
+        // entering edit mode.
+        if ($element = $page->find('css', "#toolbar-administration a.is-active")) {
+          // If a tray was open from page load close it.
+          $element->click();
+          $this->waitForNoElement("#toolbar-administration a.is-active");
+        }
+        $page->find('css', $toolbar_item)->click();
+        $web_assert->waitForElementVisible('css', "{$toolbar_item}.is-active");
+      }
+      $this->enableEditMode();
+      if (isset($toolbar_item)) {
+        $this->waitForNoElement("{$toolbar_item}.is-active");
+      }
 
-    switch ($block_id) {
-      case 'block-powered':
-        // Fill out form, save the form.
-        $page->fillField('settings[label]', $new_page_text);
-        $page->checkField('settings[label_display]');
-        break;
+      $this->openBlockForm($block_selector);
 
-      case 'block-branding':
-        // Fill out form, save the form.
-        $page->fillField('settings[site_information][site_name]', $new_page_text);
-        break;
-    }
+      switch ($block_plugin) {
+        case 'system_powered_by_block':
+          // Fill out form, save the form.
+          $page->fillField('settings[label]', $new_page_text);
+          $page->checkField('settings[label_display]');
+          break;
 
-    if (isset($new_page_text)) {
-      $page->pressButton($button_text);
-      // Make sure the changes are present.
-      // @todo Use a wait method that will take into account the form submitting
-      //   and all JavaScript activity. https://www.drupal.org/node/2837676
-      //   The use \Behat\Mink\WebAssert::pageTextContains to check text.
-      $this->assertJsCondition('jQuery("' . $block_selector . ' ' . $label_selector . '").html() == "' . $new_page_text . '"');
-    }
+        case 'system_branding_block':
+          // Fill out form, save the form.
+          $page->fillField('settings[site_information][site_name]', $new_page_text);
+          break;
+      }
 
-    $this->openBlockForm($block_selector);
+      if (isset($new_page_text)) {
+        $page->pressButton($button_text);
+        // Make sure the changes are present.
+        // @todo Use a wait method that will take into account the form submitting
+        //   and all JavaScript activity. https://www.drupal.org/node/2837676
+        //   The use \Behat\Mink\WebAssert::pageTextContains to check text.
+        $this->assertJsCondition('jQuery("' . $block_selector . ' ' . $label_selector . '").html() == "' . $new_page_text . '"');
+      }
 
-    $this->disableEditMode();
-    // Canvas should close when editing module is closed.
-    $this->waitForOffCanvasToClose();
+      $this->openBlockForm($block_selector);
 
-    $this->enableEditMode();
+      $this->disableEditMode();
+      // Canvas should close when editing module is closed.
+      $this->waitForOffCanvasToClose();
 
-    $element_selector = "$block_selector {$element_selector}";
-    // Open block form by clicking a element inside the block.
-    // This confirms that default action for links and form elements is
-    // suppressed.
-    $this->openBlockForm($element_selector);
+      $this->enableEditMode();
 
-    // Exit edit mode using ESC.
-    $web_assert->elementTextContains('css', '.contextual-toolbar-tab button', 'Editing');
-    $web_assert->elementAttributeContains('css', '.dialog-offcanvas__main-canvas', 'class', 'js-outside-in-edit-mode');
-    // Simulate press the Escape key.
-    $this->getSession()->executeScript('jQuery("body").trigger(jQuery.Event("keyup", { keyCode: 27 }));');
-    $this->waitForOffCanvasToClose();
-    $this->getSession()->wait(100);
-    $this->assertEditModeDisabled();
-    $web_assert->elementTextContains('css', '#drupal-live-announce', 'Exited edit mode.');
-    $web_assert->elementTextNotContains('css', '.contextual-toolbar-tab button', 'Editing');
-    $web_assert->elementAttributeNotContains('css', '.dialog-offcanvas__main-canvas', 'class', 'js-outside-in-edit-mode');
+      // Open block form by clicking a element inside the block.
+      // This confirms that default action for links and form elements is
+      // suppressed.
+      $this->openBlockForm("$block_selector {$element_selector}");
+
+      // Exit edit mode using ESC.
+      $web_assert->elementTextContains('css', '.contextual-toolbar-tab button', 'Editing');
+      $web_assert->elementAttributeContains('css', '.dialog-offcanvas__main-canvas', 'class', 'js-outside-in-edit-mode');
+      // Simulate press the Escape key.
+      $this->getSession()
+        ->executeScript('jQuery("body").trigger(jQuery.Event("keyup", { keyCode: 27 }));');
+      $this->waitForOffCanvasToClose();
+      $this->getSession()->wait(100);
+      $this->assertEditModeDisabled();
+      $web_assert->elementTextContains('css', '#drupal-live-announce', 'Exited edit mode.');
+      $web_assert->elementTextNotContains('css', '.contextual-toolbar-tab button', 'Editing');
+      $web_assert->elementAttributeNotContains('css', '.dialog-offcanvas__main-canvas', 'class', 'js-outside-in-edit-mode');
+      // Delete the block that was placed for the current theme.
+      $block->delete();
+    }
   }
 
   /**
@@ -137,23 +139,23 @@ public function testBlocks($block_id, $new_page_text, $element_selector, $label_
   public function providerTestBlocks() {
     $blocks = [
       'block-powered' => [
-        'id' => 'block-powered',
+        'block_plugin' => 'system_powered_by_block',
         'new_page_text' => 'Can you imagine anyone showing the label on this block?',
-        'element_selector' => '.content a',
+        'element_selector' => 'span a',
         'label_selector' => 'h2',
         'button_text' => 'Save Powered by Drupal',
         'toolbar_item' => '#toolbar-item-user',
       ],
       'block-branding' => [
-        'id' => 'block-branding',
+        'block_plugin' => 'system_branding_block',
         'new_page_text' => 'The site that will live a very short life.',
-        'element_selector' => 'a[rel="home"]:nth-child(2)',
-        'label_selector' => '.site-branding__name a',
+        'element_selector' => "a[rel='home']:last-child",
+        'label_selector' => "a[rel='home']:last-child",
         'button_text' => 'Save Site branding',
         'toolbar_item' => '#toolbar-item-administration',
       ],
       'block-search' => [
-        'id' => 'block-search',
+        'block_plugin' => 'search_form_block',
         'new_page_text' => NULL,
         'element_selector' => '#edit-submit',
         'label_selector' => 'h2',
@@ -209,10 +211,10 @@ protected function openBlockForm($block_selector) {
    * Tests QuickEdit links behavior.
    */
   public function testQuickEditLinks() {
-    $quick_edit_selector = '#quickedit-entity-toolbar';
-    $body_selector = '.field--name-body p';
-    $block_selector = '#block-powered';
     $web_assert = $this->assertSession();
+    $quick_edit_selector = '#quickedit-entity-toolbar';
+    $node_selector = '[data-quickedit-entity-id="node/1"]';
+    $body_selector = '[data-quickedit-field-id="node/1/body/en/full"]';
     // Create a Content type and two test nodes.
     $this->createContentType(['type' => 'page']);
     $auth_role = Role::load(Role::AUTHENTICATED_ID);
@@ -233,88 +235,103 @@ public function testQuickEditLinks() {
       ]
     );
     $page = $this->getSession()->getPage();
-    // Load the same page twice.
-    foreach ([1, 2] as $page_load_times) {
-      $this->drupalGet('node/' . $node->id());
-      // Waiting for Toolbar module.
-      // @todo Remove the hack after https://www.drupal.org/node/2542050.
-      $web_assert->waitForElementVisible('css', '.toolbar-fixed');
-      // Waiting for Toolbar animation.
-      $web_assert->assertWaitOnAjaxRequest();
-      // The 2nd page load we should already be in edit mode.
-      if ($page_load_times == 1) {
+    $block_plugin = 'system_powered_by_block';
+
+    foreach ($this->getTestThemes() as $theme) {
+      $this->enableTheme($theme);
+      $block = $this->placeBlock($block_plugin);
+
+      $block_selector = str_replace('_', '-', $this->getBlockSelector($block));
+      // Load the same page twice.
+      foreach ([1, 2] as $page_load_times) {
+        $this->drupalGet('node/' . $node->id());
+        // Waiting for Toolbar module.
+        // @todo Remove the hack after https://www.drupal.org/node/2542050.
+        $web_assert->waitForElementVisible('css', '.toolbar-fixed');
+        // Waiting for Toolbar animation.
+        $web_assert->assertWaitOnAjaxRequest();
+        // The 2nd page load we should already be in edit mode.
+        if ($page_load_times == 1) {
+          $this->enableEditMode();
+        }
+        // In Edit mode clicking field should open QuickEdit toolbar.
+        $page->find('css', $body_selector)->click();
+        $web_assert->waitForElementVisible('css', $quick_edit_selector);
+
+        $this->disableEditMode();
+        // Exiting Edit mode should close QuickEdit toolbar.
+        $web_assert->elementNotExists('css', $quick_edit_selector);
+        // When not in Edit mode QuickEdit toolbar should not open.
+        $page->find('css', $body_selector)->click();
+        $web_assert->elementNotExists('css', $quick_edit_selector);
+
         $this->enableEditMode();
+        $this->openBlockForm($block_selector);
+        $page->find('css', $body_selector)->click();
+        $web_assert->waitForElementVisible('css', $quick_edit_selector);
+        // Offcanvas should be closed when opening QuickEdit toolbar.
+        $this->waitForOffCanvasToClose();
+
+        $this->openBlockForm($block_selector);
+        // QuickEdit toolbar should be closed when opening Offcanvas.
+        $web_assert->elementNotExists('css', $quick_edit_selector);
       }
-      // In Edit mode clicking field should open QuickEdit toolbar.
-      $page->find('css', $body_selector)->click();
-      $web_assert->waitForElementVisible('css', $quick_edit_selector);
 
+      // Check using contextual links to invoke QuickEdit and open the tray.
+      $this->drupalGet('node/' . $node->id());
+      $web_assert->assertWaitOnAjaxRequest();
       $this->disableEditMode();
-      // Exiting Edit mode should close QuickEdit toolbar.
-      $web_assert->elementNotExists('css', $quick_edit_selector);
-      // When not in Edit mode QuickEdit toolbar should not open.
-      $page->find('css', $body_selector)->click();
-      $web_assert->elementNotExists('css', $quick_edit_selector);
-
-      $this->enableEditMode();
-      $this->openBlockForm($block_selector);
-      $page->find('css', $body_selector)->click();
+      // Open QuickEdit toolbar before going into Edit mode.
+      $this->clickContextualLink($node_selector, "Quick edit");
       $web_assert->waitForElementVisible('css', $quick_edit_selector);
-      // Offcanvas should be closed when opening QuickEdit toolbar.
-      $this->waitForOffCanvasToClose();
-
-      $this->openBlockForm($block_selector);
+      // Open off-canvas and enter Edit mode via contextual link.
+      $this->clickContextualLink($block_selector, "Quick edit");
+      $this->waitForOffCanvasToOpen();
       // QuickEdit toolbar should be closed when opening Offcanvas.
       $web_assert->elementNotExists('css', $quick_edit_selector);
+      // Open QuickEdit toolbar via contextual link while in Edit mode.
+      $this->clickContextualLink($node_selector, "Quick edit", FALSE);
+      $this->waitForOffCanvasToClose();
+      $web_assert->waitForElementVisible('css', $quick_edit_selector);
+      $this->disableEditMode();
     }
 
-    // Check using contextual links to invoke QuickEdit and open the tray.
-    $this->drupalGet('node/' . $node->id());
-    $web_assert->assertWaitOnAjaxRequest();
-    $this->disableEditMode();
-    // Open QuickEdit toolbar before going into Edit mode.
-    $this->clickContextualLink('.node', "Quick edit");
-    $web_assert->waitForElementVisible('css', $quick_edit_selector);
-    // Open off-canvas and enter Edit mode via contextual link.
-    $this->clickContextualLink($block_selector, "Quick edit");
-    $this->waitForOffCanvasToOpen();
-    // QuickEdit toolbar should be closed when opening Offcanvas.
-    $web_assert->elementNotExists('css', $quick_edit_selector);
-    // Open QuickEdit toolbar via contextual link while in Edit mode.
-    $this->clickContextualLink('.node', "Quick edit", FALSE);
-    $this->waitForOffCanvasToClose();
-    $web_assert->waitForElementVisible('css', $quick_edit_selector);
   }
 
   /**
    * Tests enabling and disabling Edit Mode.
    */
   public function testEditModeEnableDisable() {
-    foreach (['contextual_link', 'toolbar_link'] as $enable_option) {
-      $this->drupalGet('user');
-      $this->assertEditModeDisabled();
-      switch ($enable_option) {
-        // Enable Edit mode.
-        case 'contextual_link':
-          $this->clickContextualLink('#block-powered', "Quick edit");
-          $this->waitForOffCanvasToOpen();
-          $this->assertEditModeEnabled();
-          break;
-
-        case 'toolbar_link':
-          $this->enableEditMode();
-          break;
+    foreach ($this->getTestThemes() as $theme) {
+      $this->enableTheme($theme);
+      $block = $this->placeBlock('system_powered_by_block');
+      foreach (['contextual_link', 'toolbar_link'] as $enable_option) {
+        $this->drupalGet('user');
+        $this->assertEditModeDisabled();
+        switch ($enable_option) {
+          // Enable Edit mode.
+          case 'contextual_link':
+            $this->clickContextualLink($this->getBlockSelector($block), "Quick edit");
+            $this->waitForOffCanvasToOpen();
+            $this->assertEditModeEnabled();
+            break;
+
+          case 'toolbar_link':
+            $this->enableEditMode();
+            break;
+        }
+        $this->disableEditMode();
+
+        // Make another page request to ensure Edit mode is still disabled.
+        $this->drupalGet('user');
+        $this->assertEditModeDisabled();
+        // Make sure on this page request it also re-enables and disables
+        // correctly.
+        $this->enableEditMode();
+        $this->disableEditMode();
       }
-      $this->disableEditMode();
-
-      // Make another page request to ensure Edit mode is still disabled.
-      $this->drupalGet('user');
-      $this->assertEditModeDisabled();
-      // Make sure on this page request it also re-enables and disables
-      // correctly.
-      $this->enableEditMode();
-      $this->disableEditMode();
     }
+
   }
 
   /**
@@ -364,4 +381,13 @@ protected function pressToolbarEditButton() {
     $this->assertSession()->assertWaitOnAjaxRequest();
   }
 
+
+  /**
+   * @param \Drupal\block\Entity\Block $block
+   * @return string
+   */
+  public function getBlockSelector(Block $block) {
+    return '#block-' . $block->id();
+  }
+
 }
diff --git a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
index 325aec7..817a7dc 100644
--- a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
+++ b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
@@ -29,8 +29,10 @@ protected function drupalGet($path, array $options = [], array $headers = []) {
    *   The theme.
    */
   public function enableTheme($theme) {
-    // Enable the theme.
-    \Drupal::service('theme_installer')->install([$theme]);
+    if (!\Drupal::service('theme_handler')->themeExists($theme)) {
+      // Enable the theme.
+      \Drupal::service('theme_installer')->install([$theme]);
+    }
     $theme_config = \Drupal::configFactory()->getEditable('system.theme');
     $theme_config->set('default', $theme);
     $theme_config->save();
@@ -118,4 +120,14 @@ protected function toggleContextualTriggerVisibility($selector) {
     $this->getSession()->executeScript("jQuery('{$selector} .contextual .trigger').toggleClass('visually-hidden');");
   }
 
+  /**
+   * Get themes to test.
+   *
+   * @return string[]
+   *   Theme names to test.
+   */
+  protected function getTestThemes() {
+    return ['bartik', 'stark', 'classy', 'stable'];
+  }
+
 }
