diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
index 662451c5eb43b538b5fc6b543342f42f31404ae2..62924dcd0a822d4613d78934b701a50807fc4b64 100644
--- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -281,7 +281,7 @@ export default {
           :shape="$options.AVATAR_SHAPE_OPTION_RECT"
         />
         <div>
-          <div data-testid="project-name" data-qa-selector="project_name">{{ item.name }}</div>
+          <div data-testid="project-name">{{ item.name }}</div>
           <div class="gl-text-gray-500" data-testid="project-full-path">
             {{ item.fullPath }}
           </div>
diff --git a/app/assets/javascripts/authentication/password/components/password_input.vue b/app/assets/javascripts/authentication/password/components/password_input.vue
index 6e3af96cf33839e53b72316140338a17d6407660..7f2a2beaa47939a7a2e58c4ff1510853a2da854d 100644
--- a/app/assets/javascripts/authentication/password/components/password_input.vue
+++ b/app/assets/javascripts/authentication/password/components/password_input.vue
@@ -27,11 +27,6 @@ export default {
       required: false,
       default: null,
     },
-    qaSelector: {
-      type: String,
-      required: false,
-      default: null,
-    },
     testid: {
       type: String,
       required: false,
@@ -80,7 +75,6 @@ export default {
       :autocomplete="autocomplete"
       :name="name"
       :minlength="minimumPasswordLength"
-      :data-qa-selector="qaSelector"
       :data-testid="testid"
       :title="title"
       :type="type"
diff --git a/app/assets/javascripts/authentication/password/index.js b/app/assets/javascripts/authentication/password/index.js
index a4f2d038cf74abb10c90959b0a743d0600454ff9..903512a7b533cbcd1417993fa00bd276e651e1a7 100644
--- a/app/assets/javascripts/authentication/password/index.js
+++ b/app/assets/javascripts/authentication/password/index.js
@@ -9,7 +9,7 @@ export const initPasswordInput = () => {
     }
 
     const { form } = el;
-    const { title, id, minimumPasswordLength, qaSelector, testid, autocomplete, name } = el.dataset;
+    const { title, id, minimumPasswordLength, testid, autocomplete, name } = el.dataset;
 
     // eslint-disable-next-line no-new
     new Vue({
@@ -21,7 +21,6 @@ export const initPasswordInput = () => {
             title,
             id,
             minimumPasswordLength,
-            qaSelector,
             testid,
             autocomplete,
             name,
diff --git a/app/assets/javascripts/authentication/two_factor_auth/components/manage_two_factor_form.vue b/app/assets/javascripts/authentication/two_factor_auth/components/manage_two_factor_form.vue
index 907b68e6ffc242aa8f023e29d59ef6b1beda771b..e97846bae2906201f90fa18fbf8f823e7c656ab0 100644
--- a/app/assets/javascripts/authentication/two_factor_auth/components/manage_two_factor_form.vue
+++ b/app/assets/javascripts/authentication/two_factor_auth/components/manage_two_factor_form.vue
@@ -119,7 +119,6 @@ export default {
         type="password"
         name="current_password"
         :state="currentPasswordState"
-        data-qa-selector="current_password_field"
       />
     </gl-form-group>
 
diff --git a/app/assets/javascripts/blob/filepath_form/components/template_selector.vue b/app/assets/javascripts/blob/filepath_form/components/template_selector.vue
index 379d5e3819734f0a7fa385e48c8bf2f7c5ab9a1f..e9f54639fdd459a8f64429ec2f665d11b39b75af 100644
--- a/app/assets/javascripts/blob/filepath_form/components/template_selector.vue
+++ b/app/assets/javascripts/blob/filepath_form/components/template_selector.vue
@@ -149,7 +149,6 @@ export default {
       block
       class="gl-font-regular"
       data-testid="template-selector"
-      data-qa-selector="template_selector"
       :toggle-text="dropdownToggleText"
       :search-placeholder="$options.i18n.searchPlaceholder"
       :items="dropdownItems"
diff --git a/app/helpers/ssh_keys_helper.rb b/app/helpers/ssh_keys_helper.rb
index 6100093b7c24aba4c89aa4edb0c4b4252e153dc6..974a6869528636130eaa920a97cb0f5e69a4b144 100644
--- a/app/helpers/ssh_keys_helper.rb
+++ b/app/helpers/ssh_keys_helper.rb
@@ -7,11 +7,11 @@ def ssh_key_delete_modal_data(key, path)
     {
         path: path,
         method: 'delete',
-        qa_selector: 'delete_ssh_key_button',
+        testid: 'delete-ssh-key-button',
         title: title,
         aria_label: title,
         modal_attributes: {
-            'data-qa-selector': 'ssh_key_delete_modal',
+            'data-testid': 'ssh-key-delete-modal',
             title: _('Are you sure you want to delete this SSH key?'),
             message: _('This action cannot be undone, and will permanently delete the %{key} SSH key') % { key: key.title },
             okVariant: 'danger',
diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml
index b1df63a72ab7a0ed9a22695e2d2c7673463afe20..edb52f31eccee749bd41a4cb5f7718f65287089e 100644
--- a/app/views/profiles/keys/_form.html.haml
+++ b/app/views/profiles/keys/_form.html.haml
@@ -5,12 +5,12 @@
 
     .form-group
       = f.label :key, s_('Profiles|Key'), class: 'label-bold'
-      = f.text_area :key, class: "form-control gl-form-input js-add-ssh-key-validation-input", rows: 8, required: true, data: { supported_algorithms: Gitlab::SSHPublicKey.supported_algorithms, qa_selector: 'key_public_key_field' }
+      = f.text_area :key, class: "form-control gl-form-input js-add-ssh-key-validation-input", rows: 8, required: true, data: { supported_algorithms: Gitlab::SSHPublicKey.supported_algorithms, testid: 'key-public-key-field' }
       %p.form-text.text-muted= s_('Profiles|Begins with %{ssh_key_algorithms}.') % { ssh_key_algorithms: ssh_key_allowed_algorithms }
     .form-row
       .col.form-group
         = f.label :title, s_('Profiles|Title'), class: 'label-bold'
-        = f.text_field :title, class: "form-control gl-form-input input-lg", required: true, placeholder: s_('Profiles|Example: MacBook key'), data: { qa_selector: 'key_title_field' }
+        = f.text_field :title, class: "form-control gl-form-input input-lg", required: true, placeholder: s_('Profiles|Example: MacBook key'), data: { testid: 'key-title-field' }
         %p.form-text.text-muted= s_('Profiles|Key titles are publicly visible.')
     .form-row
       .col.form-group
@@ -32,6 +32,6 @@
         button_options: { class: 'js-add-ssh-key-validation-confirm-submit' }) do
         = _("Yes, add it")
 
-    = f.submit s_('Profiles|Add key'), class: "js-add-ssh-key-validation-original-submit", pajamas_button: true, data: { qa_selector: 'add_key_button' }
+    = f.submit s_('Profiles|Add key'), class: "js-add-ssh-key-validation-original-submit", pajamas_button: true, data: { testid: 'add-key-button' }
     = render Pajamas::ButtonComponent.new(button_options: { type: 'reset', class: 'js-add-ssh-key-validation-cancel gl-ml-2 js-toggle-button' }) do
       = _('Cancel')
diff --git a/app/views/profiles/keys/_key_table.html.haml b/app/views/profiles/keys/_key_table.html.haml
index cfe507ad65d3e8990076482407b4139db80ee95d..efd59503041f61cd14f6fbef48b80b9cf102b94e 100644
--- a/app/views/profiles/keys/_key_table.html.haml
+++ b/app/views/profiles/keys/_key_table.html.haml
@@ -3,7 +3,7 @@
 
 - if @keys.any?
   .table-holder
-    %table.table.b-table.gl-table.b-table-stacked-md.gl-mt-n1.gl-mb-n2.ssh-keys-list{ data: { qa_selector: 'ssh_keys_list' } }
+    %table.table.b-table.gl-table.b-table-stacked-md.gl-mt-n1.gl-mb-n2.ssh-keys-list{ data: { testid: 'ssh-keys-list' } }
       %thead.d-none.d-md-table-header-group
         %tr
           %th= _('Title')
diff --git a/qa/qa/page/file/form.rb b/qa/qa/page/file/form.rb
index 30cd4f11bb4249b135d8fc1e47c497c52f09163b..61216f7b28dd9fc9b91fb2ab59d98db1fe34f65c 100644
--- a/qa/qa/page/file/form.rb
+++ b/qa/qa/page/file/form.rb
@@ -15,7 +15,7 @@ class Form < Page::Base
         end
 
         view 'app/assets/javascripts/blob/filepath_form/components/template_selector.vue' do
-          element :template_selector
+          element 'template-selector'
         end
 
         def add_name(name)
@@ -35,7 +35,7 @@ def add_custom_name(template_name)
         def select_template(template_type, template)
           case template_type
           when '.gitignore', '.gitlab-ci.yml', 'Dockerfile', 'LICENSE'
-            click_element :template_selector
+            click_element 'template-selector'
           else
             raise %(Unsupported template_type "#{template_type}". Please confirm that it is a valid option.)
           end
diff --git a/qa/qa/page/profile/ssh_keys.rb b/qa/qa/page/profile/ssh_keys.rb
index c9ec056261adc85fd4e73327d161b6de2b0a48a2..b26b86e37130a73cf4aacbc20bf6a715cf47638f 100644
--- a/qa/qa/page/profile/ssh_keys.rb
+++ b/qa/qa/page/profile/ssh_keys.rb
@@ -5,9 +5,9 @@ module Page
     module Profile
       class SSHKeys < Page::Base
         view 'app/views/profiles/keys/_form.html.haml' do
-          element :key_title_field
-          element :key_public_key_field
-          element :add_key_button
+          element 'key-title-field'
+          element 'key-public-key-field'
+          element 'add-key-button'
         end
 
         view 'app/assets/javascripts/access_tokens/components/expires_at_field.vue' do
@@ -15,25 +15,25 @@ class SSHKeys < Page::Base
         end
 
         view 'app/helpers/ssh_keys_helper.rb' do
-          element :delete_ssh_key_button
-          element :ssh_key_delete_modal
+          element 'delete-ssh-key-button'
+          element 'ssh-key-delete-modal'
         end
 
         view 'app/views/profiles/keys/_key_table.html.haml' do
-          element :ssh_keys_list
+          element 'ssh-keys-list'
         end
 
         def add_key(public_key, title)
           click_button('Add new key')
 
-          fill_element(:key_public_key_field, public_key)
-          fill_element(:key_title_field, title)
+          fill_element('key-public-key-field', public_key)
+          fill_element('key-title-field', title)
           # Expire in 2 days just in case the key is created just before midnight
           fill_expiry_date(Date.today + 2)
           # Close the datepicker
           find_element('expiry-date-field').find('input').send_keys(:enter)
 
-          click_element(:add_key_button)
+          click_element('add-key-button')
         end
 
         def fill_expiry_date(date)
@@ -50,19 +50,19 @@ def fill_expiry_date(date)
         def remove_key(title)
           click_link(title)
 
-          click_element(:delete_ssh_key_button)
+          click_element('delete-ssh-key-button')
 
           # Retrying due to https://gitlab.com/gitlab-org/gitlab/-/issues/255287
           retry_on_exception do
-            wait_for_animated_element(:ssh_key_delete_modal)
-            within_element(:ssh_key_delete_modal) do
+            wait_for_animated_element('ssh-key-delete-modal')
+            within_element('ssh-key-delete-modal') do
               click_button('Delete')
             end
           end
         end
 
         def keys_list
-          find_element(:ssh_keys_list).text
+          find_element('ssh-keys-list').text
         end
       end
     end
diff --git a/spec/frontend/authentication/password/components/password_input_spec.js b/spec/frontend/authentication/password/components/password_input_spec.js
index 5b2a9da993b96fc7374c1181475bb5d3d066b0e6..62438e824cf3ceeba31971e50642508e1e0b1af2 100644
--- a/spec/frontend/authentication/password/components/password_input_spec.js
+++ b/spec/frontend/authentication/password/components/password_input_spec.js
@@ -9,7 +9,6 @@ describe('PasswordInput', () => {
     title: 'This field is required',
     id: 'new_user_password',
     minimumPasswordLength: '8',
-    qaSelector: 'new_user_password_field',
     testid: 'new_user_password',
     autocomplete: 'new-password',
     name: 'new_user',