diff --git a/app/assets/javascripts/jobs/components/stages_dropdown.vue b/app/assets/javascripts/jobs/components/stages_dropdown.vue
index 91332c21b52d89f3e7f3a6c3c650226b7e75056a..c5076d65ff9cff7be7ca99af221e544ea87ccfc0 100644
--- a/app/assets/javascripts/jobs/components/stages_dropdown.vue
+++ b/app/assets/javascripts/jobs/components/stages_dropdown.vue
@@ -39,7 +39,9 @@ export default {
     <ci-icon :status="pipeline.details.status" class="vertical-align-middle" />
 
     <span class="font-weight-bold">{{ __('Pipeline') }}</span>
-    <a :href="pipeline.path" class="js-pipeline-path link-commit">#{{ pipeline.id }}</a>
+    <a :href="pipeline.path" class="js-pipeline-path link-commit qa-pipeline-path"
+      >#{{ pipeline.id }}</a
+    >
     <template v-if="hasRef">
       {{ __('from') }}
       <a :href="pipeline.ref.path" class="link-commit ref-name">{{ pipeline.ref.name }}</a>
diff --git a/app/assets/javascripts/pipelines/components/graph/job_item.vue b/app/assets/javascripts/pipelines/components/graph/job_item.vue
index cf9db89e32b7395560d9c391f24bccd823b05fa9..2b32a6e4a98b8bb8c2ab8b630853076e150098b3 100644
--- a/app/assets/javascripts/pipelines/components/graph/job_item.vue
+++ b/app/assets/javascripts/pipelines/components/graph/job_item.vue
@@ -108,7 +108,7 @@ export default {
       :href="status.details_path"
       :title="tooltipText"
       :class="cssClassJobName"
-      class="js-pipeline-graph-job-link"
+      class="js-pipeline-graph-job-link qa-job-link"
     >
       <job-name-component :name="job.name" :status="job.status" />
     </gl-link>
diff --git a/qa/qa/page/project/job/show.rb b/qa/qa/page/project/job/show.rb
index d688f15914c3160e4522049dd371008f4d6b0340..49c676c01f254765e959a6583443829a435bcbc8 100644
--- a/qa/qa/page/project/job/show.rb
+++ b/qa/qa/page/project/job/show.rb
@@ -16,11 +16,19 @@ module QA::Page
         element :status_badge
       end
 
+      view 'app/assets/javascripts/jobs/components/stages_dropdown.vue' do
+        element :pipeline_path
+      end
+
       def completed?
         COMPLETED_STATUSES.include?(status_badge)
       end
 
-      def passed?
+      def successful?(timeout: 60)
+        wait(reload: false, max: timeout) do
+          completed? && !trace_loading?
+        end
+
         status_badge == PASSED_STATUS
       end
 
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index b22396fd67acf3912e162a5770e0b3c460a0d1c2..f192f1fc64b3edb5d34b3368e0f780db018658ed 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -11,7 +11,7 @@ module QA::Page
 
       view 'app/assets/javascripts/pipelines/components/graph/job_item.vue' do
         element :job_component, /class.*ci-job-component.*/ # rubocop:disable QA/ElementWithPattern
-        element :job_link, /class.*js-pipeline-graph-job-link.*/ # rubocop:disable QA/ElementWithPattern
+        element :job_link
       end
 
       view 'app/assets/javascripts/vue_shared/components/ci_icon.vue' do
@@ -32,6 +32,10 @@ module QA::Page
         end
       end
 
+      def go_to_job(job_name)
+        find_element(:job_link, job_name).click
+      end
+
       def go_to_first_job
         css = '.js-pipeline-graph-job-link'
 
diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
index e2320c9234331b2ca0a8e9bb2d69c7d75e138ece..11a9653db817d27e5643ec4135c286923196126d 100644
--- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
+++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb
@@ -95,11 +95,7 @@ module QA
           Page::Project::Pipeline::Show.act { go_to_first_job }
 
           Page::Project::Job::Show.perform do |job|
-            job.wait(reload: false) do
-              job.completed? && !job.trace_loading?
-            end
-
-            expect(job.passed?).to be_truthy, "Job status did not become \"passed\"."
+            expect(job).to be_successful, "Job status did not become \"passed\"."
             expect(job.output).to include(sha1sum)
           end
         end
diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
index 553550eef8b2934c0184413cb12755bcc46777db..b0ff83db86bfad748faf1088457ac015aa229d7e 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
@@ -75,9 +75,30 @@ module QA
             Page::Project::Pipeline::Index.act { go_to_latest_pipeline }
 
             Page::Project::Pipeline::Show.perform do |pipeline|
-              expect(pipeline).to have_build('build', status: :success, wait: 600)
-              expect(pipeline).to have_build('test', status: :success, wait: 600)
-              expect(pipeline).to have_build('production', status: :success, wait: 1200)
+              pipeline.go_to_job('build')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 600), "Job did not pass"
+
+              job.click_element(:pipeline_path)
+            end
+
+            Page::Project::Pipeline::Show.perform do |pipeline|
+              pipeline.go_to_job('test')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 600), "Job did not pass"
+
+              job.click_element(:pipeline_path)
+            end
+
+            Page::Project::Pipeline::Show.perform do |pipeline|
+              pipeline.go_to_job('production')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 1200), "Job did not pass"
+
+              job.click_element(:pipeline_path)
             end
 
             Page::Project::Menu.act { click_operations_environments }
@@ -115,9 +136,30 @@ module QA
             Page::Project::Pipeline::Index.act { go_to_latest_pipeline }
 
             Page::Project::Pipeline::Show.perform do |pipeline|
-              expect(pipeline).to have_build('build', status: :success, wait: 600)
-              expect(pipeline).to have_build('test', status: :success, wait: 600)
-              expect(pipeline).to have_build('production', status: :success, wait: 1200)
+              pipeline.go_to_job('build')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 600), "Job did not pass"
+
+              job.click_element(:pipeline_path)
+            end
+
+            Page::Project::Pipeline::Show.perform do |pipeline|
+              pipeline.go_to_job('test')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 600), "Job did not pass"
+
+              job.click_element(:pipeline_path)
+            end
+
+            Page::Project::Pipeline::Show.perform do |pipeline|
+              pipeline.go_to_job('production')
+            end
+            Page::Project::Job::Show.perform do |job|
+              expect(job).to be_sucessful(timeout: 1200), "Job did not pass"
+
+              job.click_element(:pipeline_path)
             end
 
             Page::Project::Menu.act { click_operations_environments }