Commit 57c037de authored by Grzegorz Bizon's avatar Grzegorz Bizon

Make QA runtime browser an actable object

[ci skip]
parent e11886f4
......@@ -39,24 +39,9 @@ module QA
yield if block_given?
end
##
# If you want to use specific page class as an entrypoint
# for Runtime::Browser.session, you need to implement this
# method in a subclass.
#
def self.address
raise NotImplementedError
end
## TODO
# When we navigate through pages, we want to check if we are on a
# valid page everytime we instantiate a new Page object.
#
# See gitlab-org/gitlab-qa#111
#
# def self.pattern
# raise NotImplementedError
# end
end
end
end
......@@ -2,10 +2,6 @@ module QA
module Page
module Main
class Login < Page::Base
def self.address
Runtime::Scenario.gitlab_address + '/users/sign_in'
end
def initialize
wait('.application', time: 500)
end
......@@ -21,6 +17,10 @@ module QA
fill_in :user_password, with: Runtime::User.password
click_button 'Sign in'
end
def self.address
Runtime::Scenario.gitlab_address + '/users/sign_in'
end
end
end
end
......
......@@ -2,10 +2,6 @@ module QA
module Page
module Mattermost
class Login < Page::Base
def self.address
Runtime::Scenario.mattermost_address + '/login'
end
def sign_in_using_oauth
click_link class: 'btn btn-custom-login gitlab'
......@@ -13,6 +9,10 @@ module QA
click_button 'Authorize'
end
end
def self.address
Runtime::Scenario.gitlab_address + '/login'
end
end
end
end
......
......@@ -5,49 +5,24 @@ require 'selenium-webdriver'
module QA
module Runtime
module Browser
extend self
class Browser
include Scenario::Actable
def visit(entry, &block)
address = entry.is_a?(String) ? entry : entry.address
configure!
page.visit(address)
if block_given?
block.call(page)
page.visit(address)
reset_domain_session!
end
rescue
# RSpec examples will take care of screenshots on their own
#
unless block.binding.receiver.class < RSpec::Core::ExampleGroup
Capybara::Screenshot.screenshot_and_save_page
def initialize
self.class.configure!
end
raise
def visit(page, &block)
Browser::Session.new(page).tap do |session|
session.perform(&block)
end
##
# Current session, when Capybara::DSL is included `page` method is
# mixed in as well.
#
def page
Capybara.current_session
end
def reset_domain_session(address)
##
# Selenium allows to reset session cookies for current domain only.
#
# See gitlab-org/gitlab-qa#102
#
Capybar.reset_session!
def self.visit(page, &block)
new.visit(page, &block)
end
def configure!
def self.configure!
return if Capybara.drivers.include?(:chrome)
Capybara.register_driver :chrome do |app|
......@@ -73,6 +48,42 @@ module QA
config.save_path = 'tmp'
end
end
class Session
include Capybara::DSL
attr_reader :address
def initialize(page)
@address = page.is_a?(String) ? page : page.address
end
def perform(&block)
visit(@address)
block.call if block_given?
rescue
# RSpec examples will take care of screenshots on their own
#
unless block.binding.receiver.class < RSpec::Core::ExampleGroup
Capybara::Screenshot.screenshot_and_save_page
end
raise
ensure
clear! if block_given?
end
##
# Selenium allows to reset session cookies for current domain only.
#
# See gitlab-org/gitlab-qa#102
#
def clear!
visit(@address)
Capybara.reset_session!
end
end
end
end
end
module QA
feature 'logging in to Mattermost', :mattermost do
scenario 'can use gitlab oauth' do
Runtime::Browser.visit(Page::Gitlab::Login) do
Runtime::Browser.visit(Page::Main::Login) do
Page::Main::Login.act { sign_in_using_credentials }
Runtime::Browser.visit(Page::Mattermost::Login) do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment