qat-web 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/capybara/core_ext.rb +7 -0
- data/lib/capybara/core_ext/capybara_error.rb +14 -0
- data/lib/capybara/core_ext/node/element.rb +35 -0
- data/lib/capybara/core_ext/selenium/node.rb +75 -0
- data/lib/headless/core_ext/random_display.rb +15 -0
- data/lib/qat/cli/plugins/web.rb +7 -0
- data/lib/qat/web.rb +12 -0
- data/lib/qat/web/browser.rb +21 -0
- data/lib/qat/web/browser/autoload.rb +22 -0
- data/lib/qat/web/browser/factory.rb +39 -0
- data/lib/qat/web/browser/firefox/harexporttrigger-0.5.0-beta.10.xpi +0 -0
- data/lib/qat/web/browser/firefox/loader/helper.rb +49 -0
- data/lib/qat/web/browser/html_dump.rb +46 -0
- data/lib/qat/web/browser/loader.rb +75 -0
- data/lib/qat/web/browser/profile.rb +92 -0
- data/lib/qat/web/browser/screenshot.rb +46 -0
- data/lib/qat/web/configuration.rb +46 -0
- data/lib/qat/web/cucumber.rb +19 -0
- data/lib/qat/web/drivers.rb +3 -0
- data/lib/qat/web/drivers/chrome.rb +5 -0
- data/lib/qat/web/drivers/default.rb +25 -0
- data/lib/qat/web/drivers/firefox.rb +6 -0
- data/lib/qat/web/drivers/firefox/har_exporter.rb +16 -0
- data/lib/qat/web/elements.rb +78 -0
- data/lib/qat/web/elements/base.rb +50 -0
- data/lib/qat/web/elements/collection.rb +16 -0
- data/lib/qat/web/elements/config.rb +19 -0
- data/lib/qat/web/elements/element.rb +16 -0
- data/lib/qat/web/elements/selector.rb +108 -0
- data/lib/qat/web/elements/waiters.rb +103 -0
- data/lib/qat/web/error.rb +14 -0
- data/lib/qat/web/error/enrichment.rb +14 -0
- data/lib/qat/web/exceptions.rb +15 -0
- data/lib/qat/web/finders.rb +49 -0
- data/lib/qat/web/hooks/common.rb +17 -0
- data/lib/qat/web/hooks/har_exporter.rb +32 -0
- data/lib/qat/web/hooks/html_dump.rb +21 -0
- data/lib/qat/web/hooks/screenshot.rb +20 -0
- data/lib/qat/web/page.rb +158 -0
- data/lib/qat/web/page/validators.rb +37 -0
- data/lib/qat/web/page_manager.rb +71 -0
- data/lib/qat/web/screen.rb +2 -0
- data/lib/qat/web/screen/autoload.rb +22 -0
- data/lib/qat/web/screen/factory.rb +68 -0
- data/lib/qat/web/screen/loader.rb +93 -0
- data/lib/qat/web/screen/wrapper.rb +96 -0
- data/lib/qat/web/version.rb +9 -0
- metadata +278 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
module QAT::Web
|
2
|
+
class Page
|
3
|
+
# Module with helper methods to validate Page return types
|
4
|
+
# @since 2.0.1
|
5
|
+
module Validators
|
6
|
+
private
|
7
|
+
# Validates the return value for the action based on the return options
|
8
|
+
# @param return_opts [Hash] return options
|
9
|
+
# @return [Array|Class]
|
10
|
+
def validate_return_value(return_opts)
|
11
|
+
raise TypeError.new "Did not find return information, the ':returns' option must be defined!" unless return_opts
|
12
|
+
|
13
|
+
case return_opts
|
14
|
+
when Array
|
15
|
+
return_opts = validate_return_type_array(return_opts)
|
16
|
+
when Class
|
17
|
+
raise TypeError.new "Invalid return value, #{return_opts} be subclasses of QAT::Web::Page." unless return_opts.ancestors.include? QAT::Web::Page
|
18
|
+
else
|
19
|
+
raise TypeError.new "Invalid return value, must be either an Array or a subclass of QAT::Web::Page, but was #{return_opts}"
|
20
|
+
end
|
21
|
+
|
22
|
+
return_opts
|
23
|
+
end
|
24
|
+
|
25
|
+
# Validate an array of return options
|
26
|
+
# @param return_opts [Array] return options
|
27
|
+
# @return [Array|Class]
|
28
|
+
def validate_return_type_array(return_opts)
|
29
|
+
raise TypeError.new "Invalid return value, must be either an Array or a subclass of QAT::Web::Page, but was an empty array" if return_opts.empty?
|
30
|
+
invalid = return_opts.reject { |klass| klass.is_a? Class and klass.ancestors.include? QAT::Web::Page }
|
31
|
+
raise TypeError.new "Invalid return values, must all be subclasses of QAT::Web::Page. Invalid options: #{invalid.join ', '}" unless invalid.empty?
|
32
|
+
|
33
|
+
return_opts
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative 'version'
|
2
|
+
|
3
|
+
require_relative 'page'
|
4
|
+
|
5
|
+
module QAT::Web
|
6
|
+
|
7
|
+
#Class to represent a Web Site as a collection of {QAT::Web::Page}. These webpages should be all subclasses of a common
|
8
|
+
#{QAT::Web::Page} abstract subclass, representing a website's generic webpage. This abstract class should be used in the
|
9
|
+
##manages class definition. Also the initial website's page should be declared and should be a subclass of the managed
|
10
|
+
#domain.
|
11
|
+
#To navigate in the website, just call the methods of the current page of the website.
|
12
|
+
# @example Sample Website implementation.
|
13
|
+
# class ExampleWebsite < QAT::Web::PageManager
|
14
|
+
#
|
15
|
+
# manages ExampleWebsitePage #Inherits from QAT::Web::Page
|
16
|
+
#
|
17
|
+
# initial_page ExampleLoginPage #Inherits from ExampleWebsitePage
|
18
|
+
#
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# site_controller = ExampleWebsite.new
|
22
|
+
# site_controller.current_page # ExampleLoginPage instance
|
23
|
+
# site_controller.login
|
24
|
+
# site_controller.current_page # ExampleAuthenticatedPage instance
|
25
|
+
#
|
26
|
+
#@abstract
|
27
|
+
#@since 1.0.0
|
28
|
+
class PageManager
|
29
|
+
|
30
|
+
#Define the initial page of the chosen managed domain.
|
31
|
+
#@param page [Class] Initial page class. Must be subclass of the class defined in #manages
|
32
|
+
#@raise [TypeError] Invalid class type defined
|
33
|
+
def self.initial_page page
|
34
|
+
raise TypeError.new "Initial page class #{page} is not a QAT::Web::Page subclass" unless page.is_a? Class and page.ancestors.include? QAT::Web::Page
|
35
|
+
raise TypeError.new "Initial page class #{page} is not a #{@@manages} subclass" if @@manages and not page.ancestors.include? @@manages
|
36
|
+
|
37
|
+
@@initial_page = page
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
#Define the domain's main class to manage.
|
42
|
+
#@param page_type [Class] Domain's abstract page class. Must be subclass of QAT::Web::Page
|
43
|
+
#@raise [TypeError] Invalid class type defined
|
44
|
+
def self.manages page_type
|
45
|
+
raise TypeError.new "Manage domain class #{page_type} is not an QAT::Web::Page subclass" unless page_type.is_a? Class and page_type.ancestors.include? QAT::Web::Page
|
46
|
+
|
47
|
+
@@manages = page_type
|
48
|
+
end
|
49
|
+
|
50
|
+
#Initialize the page manager. Will start at the defined initial page.
|
51
|
+
#@raise [TypeError] Invalid definition of #manages or #initial_page
|
52
|
+
def initialize
|
53
|
+
raise TypeError.new "No page type defined, use class definition 'manages' to define a QAT:Web::Page type to manage" unless @@manages
|
54
|
+
raise TypeError.new "No initial page type defined, use class definition 'initial_page' to define a #{@@manages} type page as initial" unless @@initial_page
|
55
|
+
|
56
|
+
@current_page = @@initial_page.new
|
57
|
+
end
|
58
|
+
|
59
|
+
#@return [QAT::Web::Page] current page object instance.
|
60
|
+
attr_reader :current_page
|
61
|
+
|
62
|
+
|
63
|
+
#Forwards all methods to current page.
|
64
|
+
def method_missing method, *args, &block
|
65
|
+
result = @current_page.send method, *args, &block
|
66
|
+
@current_page = result if @current_page.class.actions.include? method
|
67
|
+
return result
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'loader'
|
2
|
+
|
3
|
+
module QAT
|
4
|
+
module Web
|
5
|
+
module Screen
|
6
|
+
# Helper methods for configuration auto-loading
|
7
|
+
module AutoLoad
|
8
|
+
include QAT::Logger
|
9
|
+
|
10
|
+
# Loads all screens from QAT cconfiguration cache
|
11
|
+
def self.load_screens!
|
12
|
+
if QAT.respond_to?(:configuration) && QAT.configuration[:screens]
|
13
|
+
QAT::Web::Screen::Loader.load_config(QAT.configuration[:screens])
|
14
|
+
log.debug { "Screens loaded in cache: [#{QAT::Web::Screen::Loader.screens.keys.join(', ')}]" }
|
15
|
+
else
|
16
|
+
log.debug { "Screens aren't loaded in cache, load screens manually from file using QAT::Web::Screen::Loader#load" }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative '../version'
|
2
|
+
require_relative 'loader'
|
3
|
+
require_relative 'wrapper'
|
4
|
+
require 'headless/core_ext/random_display'
|
5
|
+
require 'qat/logger'
|
6
|
+
|
7
|
+
module QAT::Web
|
8
|
+
module Screen
|
9
|
+
#Module to provide virtual screens for web control.
|
10
|
+
#@since 1.0.0
|
11
|
+
module Factory
|
12
|
+
include QAT::Logger
|
13
|
+
|
14
|
+
class << self
|
15
|
+
#Method to ask for a virtual screen. It will be provided if {QAT::Web::Screen::Loader} knows the screen definition.
|
16
|
+
#Will do nothing if +ENV ['QAT_DISPLAY'] + is set to +'none'+
|
17
|
+
#@param name [String/Symbol] Name of the virtual screen to use
|
18
|
+
#@return [QAT::Screen::Wrapper] current screen
|
19
|
+
#@raise [ArgumentError] When a given screen definition does not exist.
|
20
|
+
#@since 1.0.0
|
21
|
+
def for name=:default, load=true
|
22
|
+
|
23
|
+
name ||= :default
|
24
|
+
|
25
|
+
name = name.to_sym
|
26
|
+
|
27
|
+
unless QAT::Web::Screen::Loader.screens.has_key? name
|
28
|
+
log.error { "No screen with name #{name} available" }
|
29
|
+
log.debug { 'Available screens are:' }
|
30
|
+
log.debug { QAT::Web::Screen::Loader.screens.keys }
|
31
|
+
raise ArgumentError.new "No screen with name #{name} available"
|
32
|
+
end
|
33
|
+
|
34
|
+
current_screen.destroy if current_screen
|
35
|
+
screen_definitions = QAT::Web::Screen::Loader.screens[name]
|
36
|
+
if screen_definitions.empty?
|
37
|
+
log.debug {'Using the default configuration definitions'}
|
38
|
+
screen_definitions[:reuse] = false
|
39
|
+
end
|
40
|
+
self.current_screen = QAT::Web::Screen::Wrapper.new name, screen_definitions
|
41
|
+
|
42
|
+
if ENV['QAT_DISPLAY'] == 'none'
|
43
|
+
log.info 'Virtual screens disabled'
|
44
|
+
elsif not load
|
45
|
+
log.info 'Virtual screen will not be loaded'
|
46
|
+
else
|
47
|
+
current_screen.start
|
48
|
+
end
|
49
|
+
|
50
|
+
current_screen
|
51
|
+
end
|
52
|
+
|
53
|
+
#Current screen in use
|
54
|
+
#@return [QAT::Screen::Wrapper] current screen
|
55
|
+
#@since 1.0.0
|
56
|
+
def current_screen
|
57
|
+
@current_screen ||= nil
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def current_screen= screen
|
62
|
+
@current_screen = screen
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative '../version'
|
2
|
+
require 'qat/logger'
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/hash_with_indifferent_access'
|
5
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
6
|
+
|
7
|
+
module QAT::Web
|
8
|
+
#Namespace for virtual screen management
|
9
|
+
#@since 1.0.0
|
10
|
+
module Screen
|
11
|
+
#Utility methods to load screen definitions from configuration files
|
12
|
+
#@since 1.0.0
|
13
|
+
module Loader
|
14
|
+
include QAT::Logger
|
15
|
+
|
16
|
+
class << self
|
17
|
+
# include QAT::Logger
|
18
|
+
# Registers screen definitions from a YAML file
|
19
|
+
#@param filepath [String] file containing screen definitions
|
20
|
+
#@raise [QAT::Web::Screen::Loader::InvalidConfigurationError] When an incorrect configuration is found
|
21
|
+
#@since 1.0.0
|
22
|
+
def load(filepath)
|
23
|
+
log.info { "Opening #{filepath}" }
|
24
|
+
|
25
|
+
screens = HashWithIndifferentAccess.new(YAML::load(ERB.new(File.read(filepath)).result)) || {}
|
26
|
+
|
27
|
+
load_config(screens)
|
28
|
+
|
29
|
+
log.info { "File #{filepath} parsed" }
|
30
|
+
end
|
31
|
+
|
32
|
+
# include QAT::Logger
|
33
|
+
# Registers screen definitions from a configuration hash
|
34
|
+
#@param config [Hash] configuration hash containing screen definitions
|
35
|
+
#@raise [QAT::Web::Screen::Loader::InvalidConfigurationError] When an incorrect configuration is found
|
36
|
+
#@since 2.1.0
|
37
|
+
def load_config(config)
|
38
|
+
config.each(&method(:load_screen))
|
39
|
+
end
|
40
|
+
|
41
|
+
# include QAT::Logger
|
42
|
+
# Registers a screen definition
|
43
|
+
#@param name [String] screen name
|
44
|
+
#@param options [String] screen definitions
|
45
|
+
#@raise [QAT::Web::Screen::Loader::InvalidConfigurationError] When an incorrect configuration is found
|
46
|
+
#@since 2.1.0
|
47
|
+
def load_screen(name, options)
|
48
|
+
log.debug { "Parsing #{name}" }
|
49
|
+
parsed_opts = options.dup rescue {}
|
50
|
+
|
51
|
+
raise InvalidConfigurationError.new "Configuration for screen #{name} is empty!" unless parsed_opts&.any?
|
52
|
+
|
53
|
+
parse_resolution name, parsed_opts
|
54
|
+
|
55
|
+
self.screens[name.to_sym] = parsed_opts
|
56
|
+
log.debug { "Parsed #{name}" }
|
57
|
+
end
|
58
|
+
|
59
|
+
#List of known virtual screen definitions
|
60
|
+
#@return [Hash] list of screen definitions
|
61
|
+
#@since 1.0.0
|
62
|
+
def screens
|
63
|
+
@screens ||= { default: {} }
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def parse_resolution(name, options)
|
69
|
+
raise InvalidConfigurationError.new "No resolution defined for screen #{name}" unless options['resolution']
|
70
|
+
|
71
|
+
res = options.delete 'resolution'
|
72
|
+
|
73
|
+
mandatory_param_check = proc { |key| raise InvalidConfigurationError.new "No mandatory key #{key} in resolution of screen #{name}" }
|
74
|
+
|
75
|
+
height = res.fetch 'height', &mandatory_param_check
|
76
|
+
width = res.fetch 'width', &mandatory_param_check
|
77
|
+
depth = res.fetch 'depth', 24
|
78
|
+
|
79
|
+
dim = [width, height, depth].join('x')
|
80
|
+
|
81
|
+
log.debug { "Using #{dim} resolution for screen #{name}" }
|
82
|
+
|
83
|
+
options[:dimensions] = dim
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
#Configuration load error class.
|
88
|
+
class InvalidConfigurationError < StandardError
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require_relative '../version'
|
2
|
+
require_relative 'loader'
|
3
|
+
require 'headless/core_ext/random_display'
|
4
|
+
require 'qat/logger'
|
5
|
+
|
6
|
+
module QAT::Web
|
7
|
+
module Screen
|
8
|
+
|
9
|
+
#Screen wrapper to represent an abstract display. Can have a Headless instance associated.
|
10
|
+
#@since 1.0.0
|
11
|
+
class Wrapper
|
12
|
+
include QAT::Logger
|
13
|
+
|
14
|
+
#@return [String] Screen name
|
15
|
+
#@since 1.0.0
|
16
|
+
attr_reader :name
|
17
|
+
|
18
|
+
#@return [Hash] Initialization options
|
19
|
+
#@since 1.0.0
|
20
|
+
attr_reader :options
|
21
|
+
|
22
|
+
#@return [String] Screen width
|
23
|
+
#@since 1.0.0
|
24
|
+
attr_reader :width
|
25
|
+
|
26
|
+
#@return [String] Screen height
|
27
|
+
#@since 1.0.0
|
28
|
+
attr_reader :height
|
29
|
+
|
30
|
+
#@return [String] Screen depth
|
31
|
+
#@since 1.0.0
|
32
|
+
attr_reader :depth
|
33
|
+
|
34
|
+
#@return [Headless] Xvfb instance representing the screen
|
35
|
+
#@since 1.0.0
|
36
|
+
attr_reader :xvfb
|
37
|
+
|
38
|
+
# Video recording configurations exception
|
39
|
+
# @since 2.0.1
|
40
|
+
class VideoRecordingConfigError < StandardError
|
41
|
+
end
|
42
|
+
|
43
|
+
#Create a new screen.
|
44
|
+
#@param name [String] screen name
|
45
|
+
#@param options [Hash] start options
|
46
|
+
#@option options [String] :dimensions Screen dimensions ('800x600x24')
|
47
|
+
#@since 1.0.0
|
48
|
+
def initialize name, options
|
49
|
+
@name = name
|
50
|
+
@options = options
|
51
|
+
parse_resolution options
|
52
|
+
log.info "Created screen with #{width}x#{height}x#{depth}"
|
53
|
+
@xvfb = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
#Start a new Xvfb instance
|
57
|
+
#@return [Headless] Xvfb instance
|
58
|
+
#@since 1.0.0
|
59
|
+
def start
|
60
|
+
if %w(always success failure).include?(ENV['QAT_WEB_VIDEO_MODE']) and (@options[:video].nil? or @options[:video].empty?)
|
61
|
+
raise(VideoRecordingConfigError, "Video recording configuration is missing!")
|
62
|
+
end
|
63
|
+
|
64
|
+
@xvfb = Headless.new @options
|
65
|
+
@xvfb.start
|
66
|
+
log.info "Xvfb #{name} screen started"
|
67
|
+
@xvfb
|
68
|
+
end
|
69
|
+
|
70
|
+
#Destroy the Xvfb instance
|
71
|
+
#@since 1.0.0
|
72
|
+
def destroy
|
73
|
+
return unless @xvfb
|
74
|
+
@xvfb.destroy
|
75
|
+
log.info "Xvfb #{name} screen destroyed"
|
76
|
+
@xvfb = nil
|
77
|
+
end
|
78
|
+
|
79
|
+
#Redirect all unknown methods to the Xvfb instance
|
80
|
+
#@since 1.0.0
|
81
|
+
def method_missing method, *args, &block
|
82
|
+
@xvfb.method(method).call *args, &block
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def parse_resolution options
|
88
|
+
options[:dimensions] ||= '800x600x24'
|
89
|
+
|
90
|
+
@width, @height, @depth = options[:dimensions].split 'x'
|
91
|
+
@depth ||= 24
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
metadata
ADDED
@@ -0,0 +1,278 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qat-web
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 6.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- QAT
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-07-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: qat-cucumber
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: qat-devel
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '6.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '6.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: headless
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.3'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.3.1
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '2.3'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 2.3.1
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: sinatra
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.4'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.4.6
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '1.4'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.4.6
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: syntax
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '1.2'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '1.2'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: httparty
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.14.0
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.14.0
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: selenium-webdriver
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: qat-logger
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '6.0'
|
130
|
+
type: :runtime
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '6.0'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: little-plugger
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '1.1'
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 1.1.4
|
147
|
+
type: :runtime
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '1.1'
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: 1.1.4
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
name: capybara
|
159
|
+
requirement: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
type: :runtime
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0'
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: retriable
|
173
|
+
requirement: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
type: :runtime
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: activesupport
|
187
|
+
requirement: !ruby/object:Gem::Requirement
|
188
|
+
requirements:
|
189
|
+
- - ">="
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '0'
|
192
|
+
type: :runtime
|
193
|
+
prerelease: false
|
194
|
+
version_requirements: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - ">="
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: '0'
|
199
|
+
description: |2
|
200
|
+
QAT-Web is a browser controller for Web testing, with support for various browsers and webdrivers.
|
201
|
+
Includes various classes for easier planning and implementation of web interactions, using the Page Objects Pattern.
|
202
|
+
email: qatoolkit@readinessit.com
|
203
|
+
executables: []
|
204
|
+
extensions: []
|
205
|
+
extra_rdoc_files: []
|
206
|
+
files:
|
207
|
+
- lib/capybara/core_ext.rb
|
208
|
+
- lib/capybara/core_ext/capybara_error.rb
|
209
|
+
- lib/capybara/core_ext/node/element.rb
|
210
|
+
- lib/capybara/core_ext/selenium/node.rb
|
211
|
+
- lib/headless/core_ext/random_display.rb
|
212
|
+
- lib/qat/cli/plugins/web.rb
|
213
|
+
- lib/qat/web.rb
|
214
|
+
- lib/qat/web/browser.rb
|
215
|
+
- lib/qat/web/browser/autoload.rb
|
216
|
+
- lib/qat/web/browser/factory.rb
|
217
|
+
- lib/qat/web/browser/firefox/harexporttrigger-0.5.0-beta.10.xpi
|
218
|
+
- lib/qat/web/browser/firefox/loader/helper.rb
|
219
|
+
- lib/qat/web/browser/html_dump.rb
|
220
|
+
- lib/qat/web/browser/loader.rb
|
221
|
+
- lib/qat/web/browser/profile.rb
|
222
|
+
- lib/qat/web/browser/screenshot.rb
|
223
|
+
- lib/qat/web/configuration.rb
|
224
|
+
- lib/qat/web/cucumber.rb
|
225
|
+
- lib/qat/web/drivers.rb
|
226
|
+
- lib/qat/web/drivers/chrome.rb
|
227
|
+
- lib/qat/web/drivers/default.rb
|
228
|
+
- lib/qat/web/drivers/firefox.rb
|
229
|
+
- lib/qat/web/drivers/firefox/har_exporter.rb
|
230
|
+
- lib/qat/web/elements.rb
|
231
|
+
- lib/qat/web/elements/base.rb
|
232
|
+
- lib/qat/web/elements/collection.rb
|
233
|
+
- lib/qat/web/elements/config.rb
|
234
|
+
- lib/qat/web/elements/element.rb
|
235
|
+
- lib/qat/web/elements/selector.rb
|
236
|
+
- lib/qat/web/elements/waiters.rb
|
237
|
+
- lib/qat/web/error.rb
|
238
|
+
- lib/qat/web/error/enrichment.rb
|
239
|
+
- lib/qat/web/exceptions.rb
|
240
|
+
- lib/qat/web/finders.rb
|
241
|
+
- lib/qat/web/hooks/common.rb
|
242
|
+
- lib/qat/web/hooks/har_exporter.rb
|
243
|
+
- lib/qat/web/hooks/html_dump.rb
|
244
|
+
- lib/qat/web/hooks/screenshot.rb
|
245
|
+
- lib/qat/web/page.rb
|
246
|
+
- lib/qat/web/page/validators.rb
|
247
|
+
- lib/qat/web/page_manager.rb
|
248
|
+
- lib/qat/web/screen.rb
|
249
|
+
- lib/qat/web/screen/autoload.rb
|
250
|
+
- lib/qat/web/screen/factory.rb
|
251
|
+
- lib/qat/web/screen/loader.rb
|
252
|
+
- lib/qat/web/screen/wrapper.rb
|
253
|
+
- lib/qat/web/version.rb
|
254
|
+
homepage: https://gitlab.readinessit.com/qa-toolkit/qat-web
|
255
|
+
licenses:
|
256
|
+
- GPL-3.0
|
257
|
+
metadata: {}
|
258
|
+
post_install_message:
|
259
|
+
rdoc_options: []
|
260
|
+
require_paths:
|
261
|
+
- lib
|
262
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
263
|
+
requirements:
|
264
|
+
- - "~>"
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: '2.4'
|
267
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
requirements: []
|
273
|
+
rubyforge_project:
|
274
|
+
rubygems_version: 2.7.7
|
275
|
+
signing_key:
|
276
|
+
specification_version: 4
|
277
|
+
summary: QAT-Web is a browser controller for Web testing
|
278
|
+
test_files: []
|