diff options
Diffstat (limited to 'qa')
-rw-r--r-- | qa/qa.rb | 1 | ||||
-rw-r--r-- | qa/qa/page/base.rb | 4 | ||||
-rw-r--r-- | qa/qa/page/element.rb | 19 | ||||
-rw-r--r-- | qa/qa/page/main/login.rb | 36 | ||||
-rw-r--r-- | qa/qa/page/menu/main.rb | 39 | ||||
-rw-r--r-- | qa/qa/page/validatable.rb | 19 | ||||
-rw-r--r-- | qa/qa/page/view.rb | 4 | ||||
-rw-r--r-- | qa/qa/runtime/browser.rb | 1 |
8 files changed, 80 insertions, 43 deletions
@@ -109,6 +109,7 @@ module QA autoload :View, 'qa/page/view' autoload :Element, 'qa/page/element' autoload :Validator, 'qa/page/validator' + autoload :Validatable, 'qa/page/validatable' module Main autoload :Login, 'qa/page/main/login' diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index 30e35bf7abb..10e790ff547 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -5,6 +5,7 @@ module QA class Base include Capybara::DSL include Scenario::Actable + extend Validatable extend SingleForwardable def_delegators :evaluator, :view, :views @@ -68,8 +69,9 @@ module QA all(element_selector_css(name)) end - def click_element(name) + def click_element(name, page = self) find_element(name).click + page.validate_elements_present! end def fill_element(name, content) diff --git a/qa/qa/page/element.rb b/qa/qa/page/element.rb index 9944a39ce07..cc81b8884ca 100644 --- a/qa/qa/page/element.rb +++ b/qa/qa/page/element.rb @@ -1,19 +1,28 @@ module QA module Page class Element - attr_reader :name + attr_reader :name, :required - def initialize(name, pattern = nil) + def initialize(name, required = true) @name = name - @pattern = pattern || selector + + unless !!required == required + warn "[QA] DEPRECATED TYPING: element #{name}, #{required} should be a boolean!" + end + + @required = required + end + + def required? + !!required end def selector - "qa-#{@name.to_s.tr('_', '-')}" + /['"]data-qa-selector['"]: ['"]#{@name}['"]/ end def selector_css - ".#{selector}" + %Q([data-qa-selector="#{@name}"]) end def expression diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb index 6cdfbd1c125..089bb49f5c9 100644 --- a/qa/qa/page/main/login.rb +++ b/qa/qa/page/main/login.rb @@ -3,31 +3,31 @@ module QA module Main class Login < Page::Base view 'app/views/devise/passwords/edit.html.haml' do - element :password_field, 'password_field :password' - element :password_confirmation, 'password_field :password_confirmation' - element :change_password_button, 'submit "Change your password"' + element :txt_password, false + element :txt_password, false + element :btn_change_password, false end view 'app/views/devise/sessions/_new_base.html.haml' do - element :login_field, 'text_field :login' - element :password_field, 'password_field :password' - element :sign_in_button, 'submit "Sign in"' + element :txt_username + element :txt_password + element :btn_signin end view 'app/views/devise/sessions/_new_ldap.html.haml' do - element :username_field, 'text_field_tag :username' - element :password_field, 'password_field_tag :password' - element :sign_in_button, 'submit_tag "Sign in"' + element :txt_username + element :txt_password + element :btn_signin end view 'app/views/devise/shared/_tabs_ldap.html.haml' do - element :ldap_tab, "link_to server['label']" - element :standard_tab, "link_to 'Standard'" + element :ldap_tab, false + element :standard_tab, false end view 'app/views/devise/shared/_tabs_normal.html.haml' do - element :sign_in_tab, /nav-link.*login-pane.*Sign in/ - element :register_tab, /nav-link.*register-pane.*Register/ + element :tab_standard + element :tab_register end def initialize @@ -62,11 +62,11 @@ module QA end def switch_to_sign_in_tab - click_on 'Sign in' + click_element :tab_standard end def switch_to_register_tab - click_on 'Register' + click_element :tab_register end private @@ -82,9 +82,9 @@ module QA def sign_in_using_gitlab_credentials click_link 'Standard' if page.has_content?('LDAP') - fill_in :user_login, with: Runtime::User.name - fill_in :user_password, with: Runtime::User.password - click_button 'Sign in' + fill_element :txt_username, Runtime::User.name + fill_element :txt_password, Runtime::User.password + click_element :btn_signin, Page::Menu::Main end def set_initial_password_if_present diff --git a/qa/qa/page/menu/main.rb b/qa/qa/page/menu/main.rb index 36e7285f7b7..00c6508cefa 100644 --- a/qa/qa/page/menu/main.rb +++ b/qa/qa/page/menu/main.rb @@ -3,49 +3,54 @@ module QA module Menu class Main < Page::Base view 'app/views/layouts/header/_current_user_dropdown.html.haml' do - element :user_sign_out_link, 'link_to _("Sign out")' - element :settings_link, 'link_to s_("CurrentUser|Settings")' + element :btn_signout + element :btn_settings end view 'app/views/layouts/header/_default.html.haml' do element :navbar element :user_avatar - element :user_menu, '.dropdown-menu' + element :drp_user end view 'app/views/layouts/nav/_dashboard.html.haml' do - element :admin_area_link - element :projects_dropdown - element :groups_dropdown + element :lnk_adminarea + element :drp_projects + element :drp_groups end view 'app/views/layouts/nav/projects_dropdown/_show.html.haml' do - element :projects_dropdown_sidebar - element :your_projects_link + element :drp_projects_sidebar + element :drp_projects_sidebar_lnk_yourprojects + end + + view 'app/views/layouts/nav/groups_dropdown/_show.html.haml' do + element :drp_groups_sidebar + element :drp_groups_sidebar_lnk_yourgroups end def go_to_groups within_top_menu do - click_element :groups_dropdown + click_element :drp_groups end - page.within('.qa-groups-dropdown-sidebar') do - click_element :your_groups_link + page.within_element(:drp_groups_sidebar) do + click_element :drp_groups_sidebar_lnk_yourgroups end end def go_to_projects within_top_menu do - click_element :projects_dropdown + click_element :drp_projects end - page.within('.qa-projects-dropdown-sidebar') do - click_element :your_projects_link + page.within_element(:drp_projects_sidebar) do + click_element :drp_projects_sidebar_lnk_yourprojects end end def go_to_admin_area - within_top_menu { click_element :admin_area_link } + within_top_menu { click_element :lnk_adminarea } end def sign_out @@ -68,7 +73,7 @@ module QA private def within_top_menu - page.within('.qa-navbar') do + page.within_element(:navbar) do yield end end @@ -77,7 +82,7 @@ module QA within_top_menu do click_element :user_avatar - page.within('.dropdown-menu') do + page.within_element(:drp_user) do yield end end diff --git a/qa/qa/page/validatable.rb b/qa/qa/page/validatable.rb new file mode 100644 index 00000000000..1d885915f74 --- /dev/null +++ b/qa/qa/page/validatable.rb @@ -0,0 +1,19 @@ +module QA + module Page + module Validatable + PageValidationError = Class.new(StandardError) + + def validate_elements_present! + # get elements from self + elements.each do |element| + if element.required? + base_page = self.new + unless base_page.using_wait_time(10) { base_page.page.has_selector?(element.selector_css) } + raise Validatable::PageValidationError, "#{element.name} expected on #{self.name} page" + end + end + end + end + end + end +end diff --git a/qa/qa/page/view.rb b/qa/qa/page/view.rb index b2a2da4dbf3..9ee17d54c22 100644 --- a/qa/qa/page/view.rb +++ b/qa/qa/page/view.rb @@ -46,8 +46,8 @@ module QA @elements = [] end - def element(name, pattern = nil) - @elements.push(Page::Element.new(name, pattern)) + def element(name, required = true) + @elements.push(Page::Element.new(name, required)) end end end diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb index 4c64270ce92..a1e19441123 100644 --- a/qa/qa/runtime/browser.rb +++ b/qa/qa/runtime/browser.rb @@ -29,6 +29,7 @@ module QA def self.visit(address, page = nil, &block) new.visit(address, page, &block) + page.validate_elements_present! end def self.configure! |