diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue
index 7f0a049a6adcd3dd85560571896846faa149542b..395bdad5dcc5599d3cb1876daee3d8cf4d0932c9 100644
--- a/app/assets/javascripts/security_configuration/components/feature_card.vue
+++ b/app/assets/javascripts/security_configuration/components/feature_card.vue
@@ -95,6 +95,9 @@ export default {
     showSecondaryConfigurationHelpPath() {
       return Boolean(this.available && this.feature.secondary?.configurationHelpPath);
     },
+    hyphenatedFeature() {
+      return this.feature.type.replace(/_/g, '-');
+    },
   },
   methods: {
     onError(message) {
@@ -167,7 +170,7 @@ export default {
         :href="feature.configurationPath"
         variant="confirm"
         :category="configurationButton.category"
-        :data-testid="`${feature.type}_enable_button`"
+        :data-testid="`${hyphenatedFeature}-enable-button`"
         class="gl-mt-5"
       >
         {{ configurationButton.text }}
@@ -179,7 +182,7 @@ export default {
         variant="confirm"
         :category="manageViaMrButtonCategory"
         class="gl-mt-5"
-        :data-testid="`${feature.type}_mr_button`"
+        :data-testid="`${hyphenatedFeature}-mr-button`"
         @error="onError"
       />
 
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
index 0ce8389579de67fbc77ddb3e99baf3964ca00168..ac434c5be4ed3482a36940b22072ef6b50fbdae6 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
@@ -634,7 +634,6 @@ export default {
                   variant="confirm"
                   :disabled="isMergeButtonDisabled"
                   :loading="isMakingRequest"
-                  data-qa-selector="merge_button"
                   @click="handleMergeButtonClick(isAutoMergeAvailable)"
                   >{{ mergeButtonText }}</gl-button
                 >
@@ -644,7 +643,6 @@ export default {
                   :disabled="isMergeButtonDisabled"
                   variant="confirm"
                   data-testid="merge-immediately-dropdown"
-                  data-qa-selector="merge_moment_dropdown"
                   toggle-class="btn-icon js-merge-moment"
                 >
                   <template #button-content>
@@ -655,7 +653,6 @@ export default {
                     icon-name="warning"
                     button-class="accept-merge-request"
                     data-testid="merge-immediately-button"
-                    data-qa-selector="merge_immediately_menu_item"
                     @click="handleMergeImmediatelyButtonClick"
                   >
                     {{ __('Merge immediately') }}
@@ -692,7 +689,7 @@ export default {
             <div
               v-else
               class="gl-w-full gl-order-n1 mr-widget-merge-details"
-              data-qa-selector="merged_status_content"
+              data-testid="merged-status-content"
             >
               <p v-if="showMergeDetailsHeader" class="gl-mb-2 gl-text-gray-900">
                 {{ __('Merge details') }}
diff --git a/ee/app/assets/javascripts/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue b/ee/app/assets/javascripts/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue
index 4a30466612d9e14b9b2e9b5dd08f09a217354fa1..2c514741d276cae6a8796cbc9fe9377738422955 100644
--- a/ee/app/assets/javascripts/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue
+++ b/ee/app/assets/javascripts/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue
@@ -62,7 +62,7 @@ export default {
       <gl-button ref="cancelButton" @click="cancel">{{ __('Cancel') }}</gl-button>
       <gl-button
         variant="danger"
-        data-qa-selector="merge_immediately_button"
+        data-testid="merge-immediately-confirmation-button"
         @click="mergeImmediately"
         >{{ __('Merge immediately') }}</gl-button
       >
diff --git a/qa/qa/ee/page/merge_request/show.rb b/qa/qa/ee/page/merge_request/show.rb
index 03f235ec166e9f6f6ccd972759aa4a94d8a23bfc..5546a258ec0d52e3cd7a67585d86cd3c9262650c 100644
--- a/qa/qa/ee/page/merge_request/show.rb
+++ b/qa/qa/ee/page/merge_request/show.rb
@@ -44,7 +44,7 @@ def self.prepended(base)
               end
 
               view 'ee/app/assets/javascripts/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue' do
-                element :merge_immediately_button
+                element 'merge-immediately-confirmation-button'
               end
 
               view 'ee/app/assets/javascripts/security_dashboard/components/pipeline/vulnerability_finding_modal.vue' do
@@ -234,13 +234,13 @@ def num_approvals_required
           end
 
           def skip_merge_train_and_merge_immediately
-            click_element :merge_moment_dropdown
-            click_element :merge_immediately_menu_item
+            click_element 'merge-immediately-dropdown'
+            click_element 'merge-immediately-button'
 
             # Wait for the warning modal dialog to appear
-            wait_for_animated_element :merge_immediately_button
+            wait_for_animated_element 'merge-immediately-confirmation-button'
 
-            click_element :merge_immediately_button
+            click_element 'merge-immediately-confirmation-button'
 
             finished_loading?
           end
diff --git a/qa/qa/ee/page/project/pipeline/show.rb b/qa/qa/ee/page/project/pipeline/show.rb
index ab16f07d4b24948b1897ba2c3361934881fba406..15c04f4e271e02d35303e8c95fe17a391fdc64da 100644
--- a/qa/qa/ee/page/project/pipeline/show.rb
+++ b/qa/qa/ee/page/project/pipeline/show.rb
@@ -36,18 +36,6 @@ def has_license?(name)
               has_element?('report-item-row', text: name)
             end
 
-            def has_approved_license?(name)
-              within_element('report-item-row', text: name) do
-                has_element?(:status_success_icon, wait: 1)
-              end
-            end
-
-            def has_denied_license?(name)
-              within_element('report-item-row', text: name) do
-                has_element?(:status_failed_icon, wait: 1)
-              end
-            end
-
             def wait_for_pipeline_job_replication(name)
               QA::Runtime::Logger.debug(%(#{self.class.name} - wait_for_pipeline_job_replication))
               wait_until(max_duration: Runtime::Geo.max_file_replication_time) do
diff --git a/qa/qa/page/blame/show.rb b/qa/qa/page/blame/show.rb
index 42fb217d2df528b3dc4faa5817dcdba7def089e8..39117efb2a553a23256dac348219b83e50158bf8 100644
--- a/qa/qa/page/blame/show.rb
+++ b/qa/qa/page/blame/show.rb
@@ -9,7 +9,7 @@ class Show < Page::Base
         end
 
         view 'app/views/projects/blame/show.html.haml' do
-          element :blame_file_content
+          element 'blob-content-holder'
         end
 
         def has_file?(file_name)
@@ -23,11 +23,11 @@ def has_no_file?(file_name)
         end
 
         def has_file_content?(file_content)
-          within_element(:blame_file_content) { has_text?(file_content) }
+          within_element('blob-content-holder') { has_text?(file_content) }
         end
 
         def has_no_file_content?(file_content)
-          within_element(:blame_file_content) do
+          within_element('blob-content-holder') do
             has_no_text?(file_content)
           end
         end
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 66a709c4d2322f8d2813d50d798c4ffbb3d815a1..ddde9ac590f5312783147a72d4ae59187918a1ef 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -81,10 +81,10 @@ class Show < Page::Base
         end
 
         view 'app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue' do
-          element :merge_button
-          element :merge_moment_dropdown
-          element :merge_immediately_menu_item
-          element :merged_status_content
+          element 'merge-button'
+          element 'merge-immediately-dropdown'
+          element 'merge-immediately-button'
+          element 'merged-status-content'
         end
 
         view 'app/assets/javascripts/vue_merge_request_widget/components/states/sha_mismatch.vue' do
@@ -253,13 +253,13 @@ def open_file_tree
         def has_merge_button?
           refresh
 
-          has_element?(:merge_button)
+          has_element?('merge-button')
         end
 
         def has_no_merge_button?
           refresh
 
-          has_no_element?(:merge_button)
+          has_no_element?('merge-button')
         end
 
         RSpec::Matchers.define :have_merge_button do
@@ -306,7 +306,7 @@ def merge!
         def merge_when_pipeline_succeeds!
           wait_until_ready_to_merge
 
-          click_element(:merge_button, text: 'Merge when pipeline succeeds')
+          click_element('merge-button', text: 'Merge when pipeline succeeds')
         end
 
         def merged?
@@ -317,17 +317,17 @@ def merged?
           # To remove page refresh logic if possible
           # We don't raise on failure because this method is used as a predicate matcher
           retry_until(max_attempts: 3, reload: true, raise_on_failure: false) do
-            has_element?(:merged_status_content, text: /The changes were merged into|Changes merged into/, wait: 20)
+            has_element?('merged-status-content', text: /The changes were merged into|Changes merged into/, wait: 20)
           end
         end
 
         RSpec::Matchers.define :be_mergeable do
           match do |page|
-            page.has_element?(:merge_button, disabled: false)
+            page.has_element?('merge-button', disabled: false)
           end
 
           match_when_negated do |page|
-            page.has_no_element?(:merge_button, disabled: false)
+            page.has_no_element?('merge-button', disabled: false)
           end
         end
 
@@ -347,9 +347,9 @@ def wait_until_ready_to_merge(transient_test: false)
           wait_until(message: "Waiting for ready to merge", sleep_interval: 1) do
             # changes in mr are rendered async, because of that mr can sometimes show no changes and there will be no
             # merge button, in such case we must retry loop otherwise find_element will raise ElementNotFound error
-            next false unless has_element?(:merge_button, wait: 1)
+            next false unless has_element?('merge-button', wait: 1)
 
-            break true unless find_element(:merge_button).disabled?
+            break true unless find_element('merge-button').disabled?
 
             # If the widget shows "Merge blocked: new changes were just added" we can refresh the page and check again
             next false if has_element?(:head_mismatch_content, wait: 1)
@@ -380,11 +380,11 @@ def rebase!
 
         def merge_immediately!
           retry_until(reload: true, sleep_interval: 1, max_attempts: 12) do
-            if has_element?(:merge_moment_dropdown)
-              click_element(:merge_moment_dropdown, skip_finished_loading_check: true)
-              click_element(:merge_immediately_menu_item, skip_finished_loading_check: true)
+            if has_element?('merge-immediately-dropdown')
+              click_element('merge-immediately-dropdown', skip_finished_loading_check: true)
+              click_element('merge-immediately-button', skip_finished_loading_check: true)
             else
-              click_element(:merge_button, skip_finished_loading_check: true)
+              click_element('merge-button', skip_finished_loading_check: true)
             end
 
             merged?
@@ -395,9 +395,9 @@ def try_to_merge!
           # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042
           # To remove page refresh logic if possible
           wait_until_ready_to_merge
-          wait_until { !find_element(:merge_button).text.include?('when pipeline succeeds') } # rubocop:disable Rails/NegateInclude
+          wait_until { !find_element('merge-button').text.include?('when pipeline succeeds') } # rubocop:disable Rails/NegateInclude
 
-          click_element(:merge_button)
+          click_element('merge-button')
         end
 
         def view_email_patches
diff --git a/qa/qa/page/project/secure/configuration_form.rb b/qa/qa/page/project/secure/configuration_form.rb
index 32609943f3e23a46c92630f69899c6507063b8d8..28d96d54caf9c8214bed42a75307c52347245f72 100644
--- a/qa/qa/page/project/secure/configuration_form.rb
+++ b/qa/qa/page/project/secure/configuration_form.rb
@@ -14,8 +14,8 @@ class ConfigurationForm < QA::Page::Base
 
           view 'app/assets/javascripts/security_configuration/components/feature_card.vue' do
             element 'feature-status'
-            element :sast_enable_button, "`${feature.type}_enable_button`" # rubocop:disable QA/ElementWithPattern
-            element :dependency_scanning_mr_button, "`${feature.type}_mr_button`" # rubocop:disable QA/ElementWithPattern
+            element 'sast-enable-button', "`${hyphenatedFeature}-enable-button`" # rubocop:disable QA/ElementWithPattern
+            element 'dependency-scanning-mr-button', "`${hyphenatedFeature}-mr-button`" # rubocop:disable QA/ElementWithPattern
           end
 
           view 'app/assets/javascripts/security_configuration/components/auto_dev_ops_alert.vue' do
@@ -35,11 +35,11 @@ def click_security_configuration_history_link
           end
 
           def click_sast_enable_button
-            click_element(:sast_enable_button)
+            click_element('sast-enable-button')
           end
 
           def click_dependency_scanning_mr_button
-            click_element(:dependency_scanning_mr_button)
+            click_element('dependency-scanning-mr-button')
           end
 
           def has_true_sast_status?
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
index cad50fc032b36c52a6043451aadd985e7c9a3748..5ef265e67dc39d806659c3667901347d8d69d530 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb
@@ -75,7 +75,7 @@ module QA
 
               mr.retry_until(reload: true, message: 'Wait until ready to click MWPS') do
                 # Click the MWPS button if we can
-                break mr.merge_when_pipeline_succeeds! if mr.has_element?(:merge_button, text: 'Merge when pipeline succeeds')
+                break mr.merge_when_pipeline_succeeds! if mr.has_element?('merge-button', text: 'Merge when pipeline succeeds')
 
                 # But fail if the button is missing because the pipeline is complete
                 raise "The pipeline already finished before we could click MWPS" if mr.wait_until { project.pipelines.first }[:status] == 'success'