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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/lib/capybara/core_ext.rb +7 -0
  3. data/lib/capybara/core_ext/capybara_error.rb +14 -0
  4. data/lib/capybara/core_ext/node/element.rb +35 -0
  5. data/lib/capybara/core_ext/selenium/node.rb +75 -0
  6. data/lib/headless/core_ext/random_display.rb +15 -0
  7. data/lib/qat/cli/plugins/web.rb +7 -0
  8. data/lib/qat/web.rb +12 -0
  9. data/lib/qat/web/browser.rb +21 -0
  10. data/lib/qat/web/browser/autoload.rb +22 -0
  11. data/lib/qat/web/browser/factory.rb +39 -0
  12. data/lib/qat/web/browser/firefox/harexporttrigger-0.5.0-beta.10.xpi +0 -0
  13. data/lib/qat/web/browser/firefox/loader/helper.rb +49 -0
  14. data/lib/qat/web/browser/html_dump.rb +46 -0
  15. data/lib/qat/web/browser/loader.rb +75 -0
  16. data/lib/qat/web/browser/profile.rb +92 -0
  17. data/lib/qat/web/browser/screenshot.rb +46 -0
  18. data/lib/qat/web/configuration.rb +46 -0
  19. data/lib/qat/web/cucumber.rb +19 -0
  20. data/lib/qat/web/drivers.rb +3 -0
  21. data/lib/qat/web/drivers/chrome.rb +5 -0
  22. data/lib/qat/web/drivers/default.rb +25 -0
  23. data/lib/qat/web/drivers/firefox.rb +6 -0
  24. data/lib/qat/web/drivers/firefox/har_exporter.rb +16 -0
  25. data/lib/qat/web/elements.rb +78 -0
  26. data/lib/qat/web/elements/base.rb +50 -0
  27. data/lib/qat/web/elements/collection.rb +16 -0
  28. data/lib/qat/web/elements/config.rb +19 -0
  29. data/lib/qat/web/elements/element.rb +16 -0
  30. data/lib/qat/web/elements/selector.rb +108 -0
  31. data/lib/qat/web/elements/waiters.rb +103 -0
  32. data/lib/qat/web/error.rb +14 -0
  33. data/lib/qat/web/error/enrichment.rb +14 -0
  34. data/lib/qat/web/exceptions.rb +15 -0
  35. data/lib/qat/web/finders.rb +49 -0
  36. data/lib/qat/web/hooks/common.rb +17 -0
  37. data/lib/qat/web/hooks/har_exporter.rb +32 -0
  38. data/lib/qat/web/hooks/html_dump.rb +21 -0
  39. data/lib/qat/web/hooks/screenshot.rb +20 -0
  40. data/lib/qat/web/page.rb +158 -0
  41. data/lib/qat/web/page/validators.rb +37 -0
  42. data/lib/qat/web/page_manager.rb +71 -0
  43. data/lib/qat/web/screen.rb +2 -0
  44. data/lib/qat/web/screen/autoload.rb +22 -0
  45. data/lib/qat/web/screen/factory.rb +68 -0
  46. data/lib/qat/web/screen/loader.rb +93 -0
  47. data/lib/qat/web/screen/wrapper.rb +96 -0
  48. data/lib/qat/web/version.rb +9 -0
  49. 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,2 @@
1
+ require_relative 'screen/loader'
2
+ require_relative 'screen/factory'
@@ -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
@@ -0,0 +1,9 @@
1
+ #QAT global namespace
2
+ module QAT
3
+ #Web Module namespace for browser interaction API
4
+ #@since 1.0.0
5
+ module Web
6
+ # Represents QAT-Web's version
7
+ VERSION = '6.0.0'
8
+ end
9
+ 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: []