diff --git a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
index 4192a00248667b07df7a7194cabaaf2ad23cacbf..ab90ab0791a42a489af8ecc6d6640a42f512d823 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
@@ -85,7 +85,11 @@ export default {
       role="button"
       @click="openFileInEditor"
     >
-      <span class="multi-file-commit-list-file-path d-flex align-items-center">
+      <span
+        class="multi-file-commit-list-file-path d-flex align-items-center"
+        data-qa-selector="file_to_commit_content"
+        :data-qa-file-name="file.name"
+      >
         <file-icon :file-name="file.name" class="gl-mr-3" />
         <template v-if="file.prevName && file.prevName !== file.name">
           {{ file.prevName }} &#x2192;
diff --git a/app/assets/javascripts/ide/components/ide_tree.vue b/app/assets/javascripts/ide/components/ide_tree.vue
index e563de6659a9550badbceeb965d432a1e007f974..d10714a687dc2c2249dc9394c0778ee288aa33d5 100644
--- a/app/assets/javascripts/ide/components/ide_tree.vue
+++ b/app/assets/javascripts/ide/components/ide_tree.vue
@@ -58,8 +58,9 @@ export default {
         <new-entry-button
           :label="__('New file')"
           :show-label="false"
-          class="d-flex border-0 p-0 mr-3 qa-new-file"
+          class="d-flex border-0 p-0 mr-3"
           icon="doc-new"
+          data-qa-selector="new_file_button"
           @click="createNewFile()"
         />
         <upload
@@ -73,6 +74,7 @@ export default {
           :show-label="false"
           class="d-flex border-0 p-0"
           icon="folder-new"
+          data-qa-selector="new_directory_button"
           @click="createNewFolder()"
         />
       </div>
diff --git a/app/assets/javascripts/vue_shared/components/file_icon.vue b/app/assets/javascripts/vue_shared/components/file_icon.vue
index 6190b07962df14f10cd132e9dc46a79e60e74219..5b42f65e85ee71f7e24f45359cdf67c0194538a0 100644
--- a/app/assets/javascripts/vue_shared/components/file_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/file_icon.vue
@@ -90,6 +90,12 @@ export default {
     <svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]">
       <use v-bind="{ 'xlink:href': spriteHref }" />
     </svg>
-    <gl-icon v-else :name="folderIconName" :size="size" class="folder-icon" />
+    <gl-icon
+      v-else
+      :name="folderIconName"
+      :size="size"
+      class="folder-icon"
+      data-qa-selector="folder_icon_content"
+    />
   </span>
 </template>
diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb
index 2fc67b29f74e2b4c9167795c7d49c6d34b074f96..45c46004790e6b71e5dd38f3823df392a06fab85 100644
--- a/qa/qa/page/project/web_ide/edit.rb
+++ b/qa/qa/page/project/web_ide/edit.rb
@@ -18,7 +18,8 @@ module QA
           end
 
           view 'app/assets/javascripts/ide/components/ide_tree.vue' do
-            element :new_file
+            element :new_file_button
+            element :new_directory_button
           end
 
           view 'app/assets/javascripts/ide/components/ide_tree_list.vue' do
@@ -83,6 +84,10 @@ module QA
             element :changed_file_icon_content
           end
 
+          view 'app/assets/javascripts/vue_shared/components/file_icon.vue' do
+            element :folder_icon_content
+          end
+
           view 'app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue' do
             element :preview_container
           end
@@ -99,12 +104,20 @@ module QA
             element :file_upload_field
           end
 
+          view 'app/assets/javascripts/ide/components/commit_sidebar/list_item.vue' do
+            element :file_to_commit_content
+          end
+
           def has_file?(file_name)
             within_element(:file_list) do
-              has_text?(file_name)
+              has_element?(:file_name_content, file_name: file_name)
             end
           end
 
+          def has_file_to_commit?(file_name)
+            has_element?(:file_to_commit_content, file_name: file_name)
+          end
+
           def has_project_path?(project_path)
             has_element?(:project_path_content, project_path: project_path)
           end
@@ -115,6 +128,12 @@ module QA
             end
           end
 
+          def has_folder_icon?(file_name)
+            within_element(:file_row_container, file_name: file_name) do
+              has_element?(:folder_icon_content)
+            end
+          end
+
           def has_download_button?(file_name)
             click_element(:file_row_container, file_name: file_name)
             within_element(:preview_container) do
@@ -141,7 +160,7 @@ module QA
           end
 
           def create_new_file_from_template(file_name, template)
-            click_element(:new_file, Page::Component::WebIDE::Modal::CreateNewFile)
+            click_element(:new_file_button, Page::Component::WebIDE::Modal::CreateNewFile)
 
             within_element(:template_list) do
               click_on file_name
@@ -234,7 +253,7 @@ module QA
           end
 
           def add_file(file_name, file_text)
-            click_element(:new_file, Page::Component::WebIDE::Modal::CreateNewFile)
+            click_element(:new_file_button, Page::Component::WebIDE::Modal::CreateNewFile)
             fill_element(:file_name_field, file_name)
             click_button('Create file')
             wait_until(reload: false) { has_file?(file_name) }
@@ -243,6 +262,13 @@ module QA
             end
           end
 
+          def add_directory(directory_name)
+            click_element(:new_directory_button, Page::Component::WebIDE::Modal::CreateNewFile)
+            fill_element(:file_name_field, directory_name)
+            click_button('Create directory')
+            wait_until(reload: false) { has_file?(directory_name) }
+          end
+
           def rename_file(file_name, new_file_name)
             click_element(:file_name_content, file_name: file_name)
             click_element(:dropdown_button)
@@ -273,6 +299,10 @@ module QA
             click_element(:dropdown_button)
             click_element(:delete_button)
           end
+
+          def switch_to_commit_tab
+            click_element(:commit_mode_tab)
+          end
         end
       end
     end
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
new file mode 100644
index 0000000000000000000000000000000000000000..206b8e9aa71baf9628855b813a260594a886810b
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module QA
+  RSpec.describe 'Create' do
+    describe 'Add a directory in Web IDE' do
+      let(:project) do
+        Resource::Project.fabricate_via_api! do |project|
+          project.name = 'add-directory-project'
+          project.initialize_with_readme = true
+        end
+      end
+
+      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' }
+
+        before do
+          Resource::Repository::Commit.fabricate_via_api! do |commit|
+            commit.project = project
+            commit.add_files([
+              {
+                file_path: 'first_directory/test_file.txt',
+                content: "Test file content"
+              }
+            ])
+          end
+
+          project.visit!
+
+          Page::Project::Show.perform(&:open_web_ide!)
+        end
+
+        it 'throws an error' do
+          Page::Project::WebIDE::Edit.perform do |ide|
+            ide.add_directory(directory_name)
+          end
+
+          expect(page).to have_content('The name "first_directory" is already taken in this directory.')
+        end
+      end
+
+      context 'when user adds a new empty directory' do
+        let(:directory_name) { 'new_empty_directory' }
+
+        before do
+          Page::Project::Show.perform(&:open_web_ide!)
+        end
+
+        it 'shows in the tree view but cannot be committed' do
+          Page::Project::WebIDE::Edit.perform do |ide|
+            ide.add_directory(directory_name)
+
+            expect(ide).to have_file(directory_name)
+            expect(ide).to have_folder_icon(directory_name)
+            expect(ide).not_to have_file_addition_icon(directory_name)
+
+            ide.switch_to_commit_tab
+
+            expect(ide).not_to have_file_to_commit(directory_name)
+          end
+        end
+      end
+    end
+  end
+end
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 d62f894279f768a70cc7e40f1a0fdfa069abef87..0a342664dd248fdbefd0f2d733255bbda751d65c 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
@@ -22,7 +22,7 @@ module QA
       context 'when a file with the same name already exists' do
         let(:file_name) { 'README.md' }
 
-        it 'throws an error' do
+        it 'throws an error', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1136' do
           Page::Project::WebIDE::Edit.perform do |ide|
             ide.upload_file(file_path)
           end
@@ -34,7 +34,7 @@ module QA
       context 'when the file is a text file' do
         let(:file_name) { 'text_file.txt' }
 
-        it 'shows the Edit tab with the text' do
+        it 'shows the Edit tab with the text', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1138' do
           Page::Project::WebIDE::Edit.perform do |ide|
             ide.upload_file(file_path)
 
@@ -52,7 +52,7 @@ module QA
       context 'when the file is binary' do
         let(:file_name) { 'logo_sample.svg' }
 
-        it 'shows a Download button' do
+        it 'shows a Download button', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1137' do
           Page::Project::WebIDE::Edit.perform do |ide|
             ide.upload_file(file_path)
 
@@ -70,7 +70,7 @@ module QA
       context 'when the file is an image' do
         let(:file_name) { 'dk.png' }
 
-        it 'shows an image viewer' do
+        it 'shows an image viewer', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1139' do
           Page::Project::WebIDE::Edit.perform do |ide|
             ide.upload_file(file_path)