diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb
index a50e706bcb4aa236fed3c400a775512c12bf1e79..d7df03eac5de5fd3ed6354c18fdd509afaabd785 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb
@@ -3,15 +3,11 @@
 module QA
   RSpec.describe 'Create', :skip_live_env, product_group: :remote_development do
     describe 'Add first file in Web IDE' do
+      include_context 'Web IDE test prep'
       let(:project) { create(:project, :with_readme, name: 'webide-create-file-project') }
 
       before do
-        Flow::Login.sign_in
-        project.visit!
-        Page::Project::Show.perform(&:open_web_ide!)
-        Page::Project::WebIDE::VSCode.perform do |ide|
-          ide.wait_for_ide_to_load('README.md')
-        end
+        load_web_ide
       end
 
       context 'when a file with the same name already exists' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
index 864105ce76ba2cab97cc86795bac21ca357a8599..ee84b9db235e8fdb6023b6d9daa8949acad0aab6 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
@@ -3,13 +3,9 @@
 module QA
   RSpec.describe 'Create', product_group: :remote_development do
     describe 'Add a directory in Web IDE' do
+      include_context 'Web IDE test prep'
       let(:project) { create(:project, :with_readme, name: 'webide-add-directory-project') }
 
-      before do
-        Flow::Login.sign_in
-        project.visit!
-      end
-
       context 'when a directory with the same name already exists' do
         let(:directory_name) { 'first_directory' }
 
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb
index 84699f696b41ee8774e0fd7c1faee94a2764a9a4..c653776a3d22765b5afc25b09da0f960ff1ad395 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb
@@ -3,16 +3,12 @@
 module QA
   RSpec.describe 'Create', product_group: :remote_development do
     describe 'Closing Web IDE' do
+      include_context "Web IDE test prep"
       let(:file_name) { 'file.txt' }
       let(:project) { create(:project, :with_readme, name: 'webide-close-with-unsaved-changes') }
 
       before do
-        Flow::Login.sign_in
-        project.visit!
-        Page::Project::Show.perform(&:open_web_ide!)
-        Page::Project::WebIDE::VSCode.perform do |ide|
-          ide.wait_for_ide_to_load('README.md')
-        end
+        load_web_ide
       end
 
       it 'shows an alert when there are unsaved changes', :blocking,
diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
index 52ba1e19a56e1fc8c66c72007883f2574cbbc1a6..f6d4e36548c48ac10910b196f8b2a308535ff42e 100644
--- a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb
@@ -3,16 +3,12 @@
 module QA
   RSpec.describe 'Create', product_group: :remote_development do
     describe 'Upload a file in Web IDE' do
+      include_context "Web IDE test prep"
       let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', file_name)) }
       let(:project) { create(:project, :with_readme, name: 'webide-upload-file-project') }
 
       before do
-        Flow::Login.sign_in
-        project.visit!
-        Page::Project::Show.perform(&:open_web_ide!)
-        Page::Project::WebIDE::VSCode.perform do |ide|
-          ide.wait_for_ide_to_load('README.md')
-        end
+        load_web_ide
       end
 
       context 'when a file with the same name already exists' do
diff --git a/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb b/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb
index 90985c625ed42d60e9b59d48b6bbe0bc552ee35b..6d74ae9eaca3202ad9c3dbb1298ae2c6c8f1ae51 100644
--- a/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb
@@ -5,22 +5,16 @@ module QA
   # See https://docs.gitlab.com/ee/development/code_suggestions/#code-suggestions-development-setup
   RSpec.describe 'Create', product_group: :remote_development do
     describe 'Code Suggestions in Web IDE' do
+      include_context "Web IDE test prep"
       let(:project) { create(:project, :with_readme, name: 'webide-code-suggestions-project') }
       let(:file_name) { 'new_file.rb' }
       let(:prompt_data) { 'def reverse_string' }
 
       before do
-        Flow::Login.sign_in
-
         create(:commit, project: project, actions: [
           { action: 'create', file_path: file_name, content: '# test' }
         ])
-
-        project.visit!
-        Page::Project::Show.perform(&:open_web_ide!)
-        Page::Project::WebIDE::VSCode.perform do |ide|
-          ide.wait_for_ide_to_load(file_name)
-        end
+        load_web_ide(file_name)
       end
 
       shared_examples 'a code generation suggestion' do |testcase|
diff --git a/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/duo_chat_in_web_ide_spec.rb b/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/duo_chat_in_web_ide_spec.rb
index 5bf4733c074b0d68a17db1b08ecd1ce853083f05..7af8c560ebe58b4e9355ec082cd68a305bc1a25e 100644
--- a/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/duo_chat_in_web_ide_spec.rb
+++ b/qa/qa/specs/features/ee/browser_ui/3_create/web_ide/duo_chat_in_web_ide_spec.rb
@@ -4,6 +4,7 @@ module QA
   # https://docs.gitlab.com/ee/development/ai_features/duo_chat.html
   RSpec.describe 'Create', product_group: :remote_development do
     describe 'Duo Chat in Web IDE' do
+      include_context 'Web IDE test prep'
       shared_examples 'Duo Chat' do |testcase|
         it 'gets a response back from Duo Chat', testcase: testcase do
           Page::Project::WebIDE::VSCode.perform do |ide|
@@ -25,12 +26,7 @@ module QA
       let(:project) { create(:project, :with_readme, name: 'webide-duo-chat-project') }
 
       before do
-        Flow::Login.sign_in
-        project.visit!
-        Page::Project::Show.perform(&:open_web_ide!)
-        Page::Project::WebIDE::VSCode.perform do |ide|
-          ide.wait_for_ide_to_load('README.md')
-        end
+        load_web_ide
       end
 
       context 'on GitLab.com', :external_ai_provider,
diff --git a/qa/qa/specs/features/shared_contexts/web_ide_shared_context.rb b/qa/qa/specs/features/shared_contexts/web_ide_shared_context.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3a21f49670af33ba3487e9ad9e59fb59aac9b1f4
--- /dev/null
+++ b/qa/qa/specs/features/shared_contexts/web_ide_shared_context.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module QA
+  include Support::API
+
+  RSpec.shared_context 'Web IDE test prep' do
+    before do
+      Flow::Login.sign_in
+      project.visit!
+    end
+
+    after(:context) do
+      clear_settings_sync_data
+    end
+
+    def load_web_ide(file_name = 'README.md')
+      Page::Project::Show.perform(&:open_web_ide!)
+      Page::Project::WebIDE::VSCode.perform do |ide|
+        ide.wait_for_ide_to_load(file_name)
+      end
+    end
+
+    private
+
+    def clear_settings_sync_data
+      # why: since the same user is used to run QA tests, the Web IDE settings can grow significantly.
+      # For example: The Web IDE keeps track of recently opened files with no upper limit set.
+      # https://gitlab.com/gitlab-org/gitlab-web-ide/-/issues/389
+      token = Resource::PersonalAccessToken.fabricate!.token
+      url = "#{Runtime::Scenario.gitlab_address}/api/v4/vscode/settings_sync/v1/collection"
+      Support::API.delete(url, {
+        headers: { Authorization: "Bearer #{token}" }
+      })
+    end
+  end
+end