diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml
index 48025f9bd20016755b9d7a9066b7800402ffd471..3625224fbcd2712ad6234f6e637f4e0028c0929e 100644
--- a/app/views/layouts/nav/sidebar/_project.html.haml
+++ b/app/views/layouts/nav/sidebar/_project.html.haml
@@ -309,7 +309,7 @@
                   %span
                     = _('General')
             = nav_link(controller: :project_members) do
-              = link_to project_project_members_path(@project), title: _('Members') do
+              = link_to project_project_members_path(@project), title: _('Members'), class: 'qa-link-members-settings' do
                 %span
                   = _('Members')
             - if can_edit
diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml
index 517fd249f6e06c491e2777ffac991198514748bf..5e21442bb6022d2464d717cc7ecce03c2d3013cb 100644
--- a/app/views/projects/project_members/_new_project_member.html.haml
+++ b/app/views/projects/project_members/_new_project_member.html.haml
@@ -3,7 +3,7 @@
     = form_for @project_member, as: :project_member, url: project_project_members_path(@project), html: { class: 'users-project-form' } do |f|
       .form-group
         = label_tag :user_ids, "Select members to invite", class: "label-bold"
-        = users_select_tag(:user_ids, multiple: true, class: "input-clamp", scope: :all, email_user: true, placeholder: "Search for members to update or invite")
+        = users_select_tag(:user_ids, multiple: true, class: "input-clamp qa-member-select-input", scope: :all, email_user: true, placeholder: "Search for members to update or invite")
       .form-group
         = label_tag :access_level, "Choose a role permission", class: "label-bold"
         .select-wrapper
@@ -17,5 +17,5 @@
           = label_tag :expires_at, 'Access expiration date', class: 'label-bold'
           = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date', placeholder: 'Expiration date'
           %i.clear-icon.js-clear-input
-      = f.submit "Add to project", class: "btn btn-success"
+      = f.submit "Add to project", class: "btn btn-success qa-add-member-button"
       = link_to "Import", import_project_project_members_path(@project), class: "btn btn-default", title: "Import members from another project"
diff --git a/app/views/projects/project_members/_team.html.haml b/app/views/projects/project_members/_team.html.haml
index 0c5a187f20831627108f8a7facf6200eb1b82afd..9682f8ac9224046f31bc8a8c2cc898ba89cac2c2 100644
--- a/app/views/projects/project_members/_team.html.haml
+++ b/app/views/projects/project_members/_team.html.haml
@@ -14,5 +14,5 @@
           %button.member-search-btn{ type: "submit", "aria-label" => "Submit search" }
             = icon("search")
         = render 'shared/members/sort_dropdown'
-  %ul.content-list.members-list
+  %ul.content-list.members-list.qa-members-list
     = render partial: 'shared/members/member', collection: members, as: :member
diff --git a/qa/qa.rb b/qa/qa.rb
index a0511186e70eadfac318b97deacd93ec833f7c0f..a7b40fe08f847143c27ffed3a24ac36788dff949 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -180,6 +180,7 @@ module Settings
         autoload :SecretVariables, 'qa/page/project/settings/secret_variables'
         autoload :Runners, 'qa/page/project/settings/runners'
         autoload :MergeRequest, 'qa/page/project/settings/merge_request'
+        autoload :Members, 'qa/page/project/settings/members'
       end
 
       module Issue
@@ -267,6 +268,7 @@ module Component
       autoload :GroupsFilter, 'qa/page/component/groups_filter'
       autoload :Select2, 'qa/page/component/select2'
       autoload :DropdownFilter, 'qa/page/component/dropdown_filter'
+      autoload :UsersSelect, 'qa/page/component/users_select'
 
       module Issuable
         autoload :Common, 'qa/page/component/issuable/common'
diff --git a/qa/qa/page/component/users_select.rb b/qa/qa/page/component/users_select.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f88d6450a33ace61dd7dacdf2640784816fb3e55
--- /dev/null
+++ b/qa/qa/page/component/users_select.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module QA
+  module Page
+    module Component
+      module UsersSelect
+        def select_user(element, username)
+          find("#{element_selector_css(element)} input").set(username)
+          find('.ajax-users-dropdown .user-username', text: "@#{username}").click
+        end
+      end
+    end
+  end
+end
diff --git a/qa/qa/page/project/menu.rb b/qa/qa/page/project/menu.rb
index d9f01c50f1951f5a030531aefad99219dab97312..63c719e5fe12be73393be2b3ddde14492d5b310c 100644
--- a/qa/qa/page/project/menu.rb
+++ b/qa/qa/page/project/menu.rb
@@ -9,6 +9,7 @@ class Menu < Page::Base
           element :settings_link, 'link_to edit_project_path'
           element :repository_link, "title: _('Repository')"
           element :link_pipelines
+          element :link_members_settings
           element :pipelines_settings_link, "title: _('CI / CD')"
           element :operations_kubernetes_link, "title: _('Kubernetes')"
           element :operations_environments_link
@@ -51,6 +52,14 @@ def click_operations_environments
           end
         end
 
+        def click_members_settings
+          hover_settings do
+            within_submenu do
+              click_element :link_members_settings
+            end
+          end
+        end
+
         def click_operations_kubernetes
           hover_operations do
             within_submenu do
diff --git a/qa/qa/page/project/settings/members.rb b/qa/qa/page/project/settings/members.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7fed93ca83f08c5c0582abdee5e0e907e2814c47
--- /dev/null
+++ b/qa/qa/page/project/settings/members.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module QA
+  module Page
+    module Project
+      module Settings
+        class Members < Page::Base
+          include Page::Component::UsersSelect
+
+          view 'app/views/projects/project_members/_new_project_member.html.haml' do
+            element :member_select_input
+            element :add_member_button
+          end
+
+          view 'app/views/projects/project_members/_team.html.haml' do
+            element :members_list
+          end
+
+          def add_member(username)
+            select_user :member_select_input, username
+            click_element :add_member_button
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b276c7ee579c24f4397864cc5bdfc077f878d0a6
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module QA
+  context :manage do
+    describe 'Add project member' do
+      it 'user adds project member' do
+        Runtime::Browser.visit(:gitlab, Page::Main::Login)
+
+        user = Factory::Resource::User.fabricate!
+
+        Page::Main::Menu.perform { |main| main.sign_out }
+        Page::Main::Login.act { sign_in_using_credentials }
+
+        Factory::Resource::Project.fabricate! do |resource|
+          resource.name = 'add-member-project'
+        end
+
+        Page::Project::Menu.act { click_members_settings }
+        Page::Project::Settings::Members.perform do |page|
+          page.add_member(user.username)
+        end
+
+        expect(page).to have_content("#{user.name} @#{user.username} Given access")
+      end
+    end
+  end
+end