summaryrefslogtreecommitdiff
path: root/qa/qa/support/page_error_checker.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/support/page_error_checker.rb')
-rw-r--r--qa/qa/support/page_error_checker.rb62
1 files changed, 62 insertions, 0 deletions
diff --git a/qa/qa/support/page_error_checker.rb b/qa/qa/support/page_error_checker.rb
new file mode 100644
index 00000000000..5d16245b4cd
--- /dev/null
+++ b/qa/qa/support/page_error_checker.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+module QA
+ module Support
+ class PageErrorChecker
+ class << self
+ def report!(page, error_code)
+ report = if QA::Runtime::Env.browser == :chrome
+ return_chrome_errors(page, error_code)
+ else
+ status_code_report(error_code)
+ end
+
+ raise "#{report}\n\n"\
+ "Path: #{page.current_path}"
+ end
+
+ def return_chrome_errors(page, error_code)
+ severe_errors = logs(page).select { |log| log.level == 'SEVERE' }
+ if severe_errors.none?
+ status_code_report(error_code)
+ else
+ "There #{severe_errors.count == 1 ? 'was' : 'were'} #{severe_errors.count} "\
+ "SEVERE level error#{severe_errors.count == 1 ? '' : 's'}:\n\n#{error_report_for(severe_errors)}"
+ end
+ end
+
+ def status_code_report(error_code)
+ "Status code #{error_code} found"
+ end
+
+ def check_page_for_error_code(page)
+ error_code = 0
+ # Test for 404 img alt
+ error_code = 404 if Nokogiri::HTML.parse(page.html).xpath("//img").map { |t| t[:alt] }.first.eql?('404')
+
+ # 500 error page in header surrounded by newlines, try to match
+ five_hundred_test = Nokogiri::HTML.parse(page.html).xpath("//h1").map.first
+ unless five_hundred_test.nil?
+ error_code = 500 if five_hundred_test.text.include?('500')
+ end
+ # GDK shows backtrace rather than error page
+ error_code = 500 if Nokogiri::HTML.parse(page.html).xpath("//body//section").map { |t| t[:class] }.first.eql?('backtrace')
+
+ unless error_code == 0
+ report!(page, error_code)
+ end
+ end
+
+ def error_report_for(logs)
+ logs
+ .map(&:message)
+ .map { |message| message.gsub('\\n', "\n") }
+ end
+
+ def logs(page)
+ page.driver.browser.manage.logs.get(:browser)
+ end
+ end
+ end
+ end
+end