diff --git a/core/lib/Drupal/Core/Entity/EntityListBuilder.php b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
index 7d6aa5926fb7569471188322d4b2e039395e64c7..a9c649888df142751fb3a8a5556ef98d88fc7ac2 100644
--- a/core/lib/Drupal/Core/Entity/EntityListBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityListBuilder.php
@@ -142,13 +142,35 @@ public function getOperations(EntityInterface $entity) {
   protected function getDefaultOperations(EntityInterface $entity) {
     $operations = [];
     if ($entity->access('update') && $entity->hasLinkTemplate('edit-form')) {
+      $edit_url = $this->ensureDestination($entity->toUrl('edit-form'));
+      if (!empty($entity->label())) {
+        $label = $this->t('Edit @entity_label', ['@entity_label' => $entity->label()]);
+      }
+      else {
+        $label = $this->t('Edit @entity_bundle @entity_id', ['@entity_bundle' => $entity->bundle(), '@entity_id' => $entity->id()]);
+      }
+      $attributes = $edit_url->getOption('attributes') ?: [];
+      $attributes += ['aria-label' => $label];
+      $edit_url->setOption('attributes', $attributes);
+
       $operations['edit'] = [
         'title' => $this->t('Edit'),
         'weight' => 10,
-        'url' => $this->ensureDestination($entity->toUrl('edit-form')),
+        'url' => $edit_url,
       ];
     }
     if ($entity->access('delete') && $entity->hasLinkTemplate('delete-form')) {
+      $delete_url = $this->ensureDestination($entity->toUrl('delete-form'));
+      if (!empty($entity->label())) {
+        $label = $this->t('Delete @entity_label', ['@entity_label' => $entity->label()]);
+      }
+      else {
+        $label = $this->t('Delete @entity_bundle @entity_id', ['@entity_bundle' => $entity->bundle(), '@entity_id' => $entity->id()]);
+      }
+      $attributes = $delete_url->getOption('attributes') ?: [];
+      $attributes += ['aria-label' => $label];
+      $delete_url->setOption('attributes', $attributes);
+
       $operations['delete'] = [
         'title' => $this->t('Delete'),
         'weight' => 100,
@@ -159,7 +181,7 @@ protected function getDefaultOperations(EntityInterface $entity) {
             'width' => 880,
           ]),
         ],
-        'url' => $this->ensureDestination($entity->toUrl('delete-form')),
+        'url' => $delete_url,
       ];
     }
 
diff --git a/core/modules/config/tests/src/Functional/ConfigEntityListTest.php b/core/modules/config/tests/src/Functional/ConfigEntityListTest.php
index 6bad38c77b14701f52aaded94862c72c0f6fc79a..05e4286cce297c59b9dcb54b1257d97269f00bbb 100644
--- a/core/modules/config/tests/src/Functional/ConfigEntityListTest.php
+++ b/core/modules/config/tests/src/Functional/ConfigEntityListTest.php
@@ -58,11 +58,17 @@ public function testList() {
     $this->assertInstanceOf(ConfigTest::class, $entity);
 
     // Test getOperations() method.
+    $edit_url = $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $edit_url->setOption('attributes', ['aria-label' => 'Edit ' . $entity->label()]);
+
+    $delete_url = $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $delete_url->setOption('attributes', ['aria-label' => 'Delete ' . $entity->label()]);
+
     $expected_operations = [
       'edit' => [
         'title' => 'Edit',
         'weight' => 10,
-        'url' => $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray()),
+        'url' => $edit_url,
       ],
       'disable' => [
         'title' => 'Disable',
@@ -79,7 +85,7 @@ public function testList() {
             'width' => 880,
           ]),
         ],
-        'url' => $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray()),
+        'url' => $delete_url,
       ],
     ];
 
@@ -140,11 +146,50 @@ public function testList() {
     $entity = $list['default'];
 
     // Test getOperations() method.
+    $edit_url = $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $edit_url->setOption('attributes', ['aria-label' => 'Edit ' . $entity->label()]);
+
+    $delete_url = $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $delete_url->setOption('attributes', ['aria-label' => 'Delete ' . $entity->label()]);
+    $expected_operations = [
+      'edit' => [
+        'title' => 'Edit',
+        'weight' => 10,
+        'url' => $edit_url,
+      ],
+      'delete' => [
+        'title' => 'Delete',
+        'weight' => 100,
+        'attributes' => [
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'modal',
+          'data-dialog-options' => Json::encode([
+            'width' => 880,
+          ]),
+        ],
+        'url' => $delete_url,
+      ],
+    ];
+
+    $actual_operations = $controller->getOperations($entity);
+    // Sort the operations to normalize link order.
+    uasort($actual_operations, ['Drupal\Component\Utility\SortArray', 'sortByWeightElement']);
+    $this->assertEquals($expected_operations, $actual_operations, 'The operations are identical.');
+
+    // Test getOperations when label doesn't exist.
+    $entity->set('label', '');
+    $entity->save();
+
+    $edit_url = $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $edit_url->setOption('attributes', ['aria-label' => 'Edit ' . $entity->bundle() . ' ' . $entity->id()]);
+
+    $delete_url = $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray());
+    $delete_url->setOption('attributes', ['aria-label' => 'Delete ' . $entity->bundle() . ' ' . $entity->id()]);
     $expected_operations = [
       'edit' => [
         'title' => 'Edit',
         'weight' => 10,
-        'url' => $entity->toUrl()->setOption('query', $this->getRedirectDestination()->getAsArray()),
+        'url' => $edit_url,
       ],
       'delete' => [
         'title' => 'Delete',
@@ -156,7 +201,7 @@ public function testList() {
             'width' => 880,
           ]),
         ],
-        'url' => $entity->toUrl('delete-form')->setOption('query', $this->getRedirectDestination()->getAsArray()),
+        'url' => $delete_url,
       ],
     ];
 
diff --git a/core/modules/user/tests/src/Functional/UserAdminTest.php b/core/modules/user/tests/src/Functional/UserAdminTest.php
index 8c79b8fa620bb45bd1f021a1e8f527e548d8b29b..57cabd3d2feeed86c76b59bab83303ca2538eeb1 100644
--- a/core/modules/user/tests/src/Functional/UserAdminTest.php
+++ b/core/modules/user/tests/src/Functional/UserAdminTest.php
@@ -75,7 +75,10 @@ public function testUserAdmin() {
     $this->assertSession()->pageTextContains($admin_user->getAccountName());
 
     // Test for existence of edit link in table.
-    $link = $user_a->toLink('Edit', 'edit-form', ['query' => ['destination' => $user_a->toUrl('collection')->toString()]])->toString();
+    $link = $user_a->toLink('Edit', 'edit-form', [
+      'query' => ['destination' => $user_a->toUrl('collection')->toString()],
+      'attributes' => ['aria-label' => 'Edit ' . $user_a->label()],
+    ])->toString();
     $this->assertSession()->responseContains($link);
 
     // Test exposed filter elements.
diff --git a/core/modules/views/tests/src/Kernel/Plugin/RowRenderCacheTest.php b/core/modules/views/tests/src/Kernel/Plugin/RowRenderCacheTest.php
index 672d3823088344aca95572bc5685b4f66d45a7dd..12db6c7e82c4fbce7771dbf98500b95980919325 100644
--- a/core/modules/views/tests/src/Kernel/Plugin/RowRenderCacheTest.php
+++ b/core/modules/views/tests/src/Kernel/Plugin/RowRenderCacheTest.php
@@ -184,8 +184,8 @@ protected function doTestRenderedOutput(AccountInterface $account, $check_cache
       $output = $view->style_plugin->getField($index, 'delete_node');
       $this->assertSame($expected, (string) $output);
       $expected = $access ? '  <div class="dropbutton-wrapper" data-drupal-ajax-container><div class="dropbutton-widget"><ul class="dropbutton">' .
-        '<li><a href="' . $node_url . '/edit?destination=/" hreflang="en">Edit</a></li>' .
-        '<li><a href="' . $node_url . '/delete?destination=/" class="use-ajax" data-dialog-type="modal" data-dialog-options="' . Html::escape(Json::encode(['width' => 880])) . '" hreflang="en">Delete</a></li>' .
+        '<li><a href="' . $node_url . '/edit?destination=/" aria-label="Edit ' . $node->label() . '" hreflang="en">Edit</a></li>' .
+        '<li><a href="' . $node_url . '/delete?destination=/" aria-label="Delete ' . $node->label() . '" class="use-ajax" data-dialog-type="modal" data-dialog-options="' . Html::escape(Json::encode(['width' => 880])) . '" hreflang="en">Delete</a></li>' .
         '</ul></div></div>' : '';
       $output = $view->style_plugin->getField($index, 'operations');
       $this->assertSame($expected, (string) $output);