chemlab 0.7.2 → 0.9.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 +4 -4
- data/lib/chemlab/attributable.rb +2 -0
- data/lib/chemlab/component.rb +55 -8
- data/lib/chemlab/configuration.rb +8 -6
- data/lib/chemlab/core_ext/string/root_module.rb +13 -0
- data/lib/chemlab/library.rb +36 -0
- data/lib/chemlab/runtime/browser.rb +47 -3
- data/lib/chemlab/version.rb +1 -1
- data/lib/chemlab.rb +1 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c09a8e6e3c407893b4df27fadd71ffff047f3ea3df27b34a1ad7f1c0b8119de9
|
4
|
+
data.tar.gz: c79979483ff6d8dc48716c3d6be27e683117bba9c346b925e6b7013e0d616238
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96fc1f354f2b5568362c01688d265be896ca238f24819f075f1d16aa6b4f43c7b9cacf72662cd110d46dda4ee2bf6448b6a870927f9f1c9d2847fafa53949130
|
7
|
+
data.tar.gz: f1aa2b1677db2f65e134db511b4741fc4a8977c1d0098c1f5eb1f246a6107ab45576df778b93117b93b617e94234a481a4ebd58d5c4fa7417b505e4002cbbecd
|
data/lib/chemlab/attributable.rb
CHANGED
data/lib/chemlab/component.rb
CHANGED
@@ -46,18 +46,18 @@ module Chemlab
|
|
46
46
|
public_elements << { type: watir_method, name: name, args: args }
|
47
47
|
|
48
48
|
# @return [Watir::Element] the raw Watir element
|
49
|
-
define_method("#{name}_element") do
|
50
|
-
find_element(watir_method, name, args.first, &block)
|
49
|
+
define_method("#{name}_element") do |**find_args|
|
50
|
+
find_element(watir_method, name, args.first, **find_args, &block)
|
51
51
|
end
|
52
52
|
|
53
53
|
# @return [Boolean] true if the element is present
|
54
|
-
define_method("#{name}?") do
|
55
|
-
public_send("#{name}_element").present?
|
54
|
+
define_method("#{name}?") do |wait: nil, wait_until: nil|
|
55
|
+
public_send("#{name}_element", wait: wait, wait_until: wait_until).present?
|
56
56
|
end
|
57
57
|
|
58
58
|
# === GETTER / CLICKER === #
|
59
|
-
define_method(name) do
|
60
|
-
element = public_send("#{name}_element")
|
59
|
+
define_method(name) do |wait: nil, wait_until: :exists?|
|
60
|
+
element = public_send("#{name}_element", wait: wait, wait_until: wait_until)
|
61
61
|
if Element::CLICKABLES.include? watir_method
|
62
62
|
element.wait_until(&:present?).click
|
63
63
|
elsif Element::INPUTS.include? watir_method
|
@@ -132,12 +132,59 @@ module Chemlab
|
|
132
132
|
# @api private
|
133
133
|
# @example
|
134
134
|
# #find_element(:text_field, :username) #=>
|
135
|
-
def find_element(watir_method, name, locator = nil, &block)
|
135
|
+
def find_element(watir_method, name, locator = nil, **args, &block)
|
136
136
|
locator = { css: %([data-qa-selector="#{name}"]) } if locator.nil?
|
137
137
|
|
138
|
+
# extract extraneous arguments from the locator and insert them into args
|
139
|
+
chemlab_options, locator = extract_chemlab_options(locator)
|
140
|
+
args.merge!(chemlab_options)
|
141
|
+
|
142
|
+
old_timeout = Chemlab.configuration.default_timeout
|
143
|
+
args[:wait] ||= old_timeout
|
144
|
+
|
138
145
|
return instance_exec(&block) if block_given?
|
139
146
|
|
140
|
-
Chemlab.configuration.browser.session.engine.public_send(watir_method, locator)
|
147
|
+
element = Chemlab.configuration.browser.session.engine.public_send(watir_method, locator)
|
148
|
+
|
149
|
+
return element if args[:wait_until].nil?
|
150
|
+
|
151
|
+
begin
|
152
|
+
# change timeout temporarily to the wait specified
|
153
|
+
change_timeout(args[:wait])
|
154
|
+
|
155
|
+
# perform wait(s) on the element
|
156
|
+
element.wait_until do |conditions|
|
157
|
+
break conditions.public_send(args[:wait_until]) unless args[:wait_until].respond_to?(:each)
|
158
|
+
|
159
|
+
args[:wait_until].each { |condition| conditions.public_send(condition) }
|
160
|
+
end
|
161
|
+
|
162
|
+
element
|
163
|
+
ensure
|
164
|
+
# reset timeout
|
165
|
+
change_timeout(old_timeout)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Extract Chemlab specific options from an array
|
170
|
+
# @param [Array<Hash>] args given arguments
|
171
|
+
# @return [Array<Array<Hash>>] first array returned are the chemlab options, second is the resulting array
|
172
|
+
# @example
|
173
|
+
# arr = { id: 'test', foo: 'bar', wait: 10 }
|
174
|
+
# a, b = extract_chemlab_options!(**arr)
|
175
|
+
# a #=> { wait: 10 }
|
176
|
+
# b #=> { id: 'test', foo: 'bar' }
|
177
|
+
def extract_chemlab_options(**args)
|
178
|
+
[args.keys.each_with_object({}) do |arg, chemlab_opts|
|
179
|
+
chemlab_opts[arg] = args.delete(arg) if %i[wait wait_until].include?(arg)
|
180
|
+
end, args]
|
181
|
+
end
|
182
|
+
|
183
|
+
# Set / Reset default Chemlab timeout
|
184
|
+
# @param [Integer] timeout the timeout to set (defaults to +Chemlab.configuration.default_timeout)
|
185
|
+
# @return [Integer] the new timeout
|
186
|
+
def change_timeout(timeout = Chemlab.configuration.default_timeout)
|
187
|
+
Chemlab.configuration.default_timeout = timeout
|
141
188
|
end
|
142
189
|
|
143
190
|
protected
|
@@ -4,6 +4,8 @@ module Chemlab
|
|
4
4
|
# Chemlab Configuration
|
5
5
|
class Configuration
|
6
6
|
include Runtime::Logger
|
7
|
+
include Attributable
|
8
|
+
extend Forwardable
|
7
9
|
|
8
10
|
# Chemlab Terminal Banner
|
9
11
|
BANNER = <<~'BANNER'
|
@@ -59,13 +61,13 @@ module Chemlab
|
|
59
61
|
CONF
|
60
62
|
end
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
attr_accessor name
|
65
|
-
end
|
64
|
+
attribute :base_url
|
65
|
+
attribute :hide_banner
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
# Delegate `default_timeout` to Watir.default_timeout
|
68
|
+
# Chemlab.configuration.default_timeout #=> Watir.default_timeout
|
69
|
+
# Chemlab.configuration.default_timeout = Watir.default_timeout = 30
|
70
|
+
def_delegators Watir, :default_timeout, :default_timeout=
|
69
71
|
|
70
72
|
attr_reader :browser, :libraries
|
71
73
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Start monkey patch of String
|
4
|
+
class String
|
5
|
+
# Find the root module (parent module) of a class or module
|
6
|
+
# @example
|
7
|
+
# 'A::B::C'.root_module #=> A
|
8
|
+
# 'A::B'.root_module => A
|
9
|
+
# @return [Module] the root module
|
10
|
+
def root_module
|
11
|
+
Object.const_get(split('::').first)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Chemlab
|
4
|
+
# Application Library Definition
|
5
|
+
# Provides accessors for +:base_url+, +:base_url=+
|
6
|
+
# +base_url+ will default to Chemlab's configured base_url
|
7
|
+
module Library
|
8
|
+
def self.included(base)
|
9
|
+
base.module_eval do
|
10
|
+
class << self
|
11
|
+
# The Base URL where this library / application exists
|
12
|
+
# If you have multiple applications that Chemlab will target,
|
13
|
+
# this is useful for having separate base_urls.
|
14
|
+
#
|
15
|
+
# @return [String] the base_url. +Chemlab.configuration.base_url+ by default if not set
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# Chemlab.configure do |chemlab|
|
19
|
+
# A.base_url = 'https://first_app'
|
20
|
+
# B.base_url = 'https://second_app'
|
21
|
+
# chemlab.base_url = 'https://main_app'
|
22
|
+
#
|
23
|
+
# chemlab.libraries = [A, B, C]
|
24
|
+
#
|
25
|
+
# C.base_url #=> https://main_app
|
26
|
+
# end
|
27
|
+
attr_writer :base_url
|
28
|
+
|
29
|
+
def base_url
|
30
|
+
@base_url ||= Chemlab.configuration.base_url
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'forwardable'
|
4
|
+
require 'chemlab/core_ext/string/root_module'
|
4
5
|
|
5
6
|
module Chemlab
|
6
7
|
module Runtime
|
@@ -17,13 +18,56 @@ module Chemlab
|
|
17
18
|
@session = Session.new(browser_options)
|
18
19
|
end
|
19
20
|
|
21
|
+
# Navigate to a given Page library
|
22
|
+
# @param [Class<Chemlab::Page>] page_class the class of the Page to navigate to
|
23
|
+
# @example
|
24
|
+
# Given:
|
25
|
+
# module TheLibrary
|
26
|
+
# def self.base_url
|
27
|
+
# 'https://example.com'
|
28
|
+
# end
|
29
|
+
# class ThePage < Chemlab::Page
|
30
|
+
# path '/path'
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Chemlab::Runtime::Browser.navigate_to(TheLibrary::ThePage) #=> Navigates to https://example.com/path
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# Given:
|
38
|
+
# Chemlab.configure do |chemlab|
|
39
|
+
# chemlab.base_url = 'https://example.com'
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# class ThePage < Chemlab::Page
|
43
|
+
# path '/'
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# Chemlab::Runtime::Browser.navigate_to(ThePage) #=> Navigates to https://example.com/path
|
20
47
|
def self.navigate_to(page_class)
|
21
|
-
|
48
|
+
unless page_class&.name.respond_to?(:root_module) && page_class.name.root_module.respond_to?(:base_url)
|
49
|
+
return Chemlab.configuration.browser.navigate_to(Chemlab.configuration.base_url + page_class.path)
|
50
|
+
end
|
51
|
+
|
52
|
+
# workaround for file:// protocol. URI.join() does not work with URI.join('file:///Users', '/user')
|
53
|
+
uri = if URI(page_class.name.root_module.base_url).scheme == 'file'
|
54
|
+
URI(File.join(page_class.name.root_module.base_url, page_class.path))
|
55
|
+
else
|
56
|
+
URI.join(page_class.name.root_module.base_url, page_class.path)
|
57
|
+
end
|
58
|
+
|
59
|
+
Chemlab.configuration.browser.navigate_to(uri)
|
22
60
|
end
|
23
61
|
|
24
|
-
|
62
|
+
# Navigate to a URI or Path
|
63
|
+
# @param [URI,String] uri_or_path the URI or path
|
64
|
+
# @return [URI,String] the URI or Path that was navigated to
|
65
|
+
# @example
|
66
|
+
# Chemlab.configuration.browser.navigate_to('/path') #=> /path
|
67
|
+
# Chemlab.configuration.browser.navigate_to(URI('https://example.com/path')) #=> URI('https://example.com/path')
|
68
|
+
def navigate_to(uri_or_path)
|
25
69
|
@session ||= Chemlab.configuration.browser.session
|
26
|
-
@session.engine.goto(
|
70
|
+
@session.engine.goto(uri_or_path.to_s)
|
27
71
|
end
|
28
72
|
|
29
73
|
# The options used to create the browser session
|
data/lib/chemlab/version.rb
CHANGED
data/lib/chemlab.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chemlab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab Quality
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -240,7 +240,9 @@ files:
|
|
240
240
|
- lib/chemlab/component.rb
|
241
241
|
- lib/chemlab/configuration.rb
|
242
242
|
- lib/chemlab/core_ext/string/inflections.rb
|
243
|
+
- lib/chemlab/core_ext/string/root_module.rb
|
243
244
|
- lib/chemlab/element.rb
|
245
|
+
- lib/chemlab/library.rb
|
244
246
|
- lib/chemlab/page.rb
|
245
247
|
- lib/chemlab/runtime/browser.rb
|
246
248
|
- lib/chemlab/runtime/env.rb
|
@@ -263,7 +265,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
263
265
|
requirements:
|
264
266
|
- - ">="
|
265
267
|
- !ruby/object:Gem::Version
|
266
|
-
version: 2.
|
268
|
+
version: '2.5'
|
267
269
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
268
270
|
requirements:
|
269
271
|
- - ">="
|