ferris_watir 0.1.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/CHANGES.md +3 -0
- data/README.md +6 -0
- data/lib/ferris.rb +2 -0
- data/lib/ferris/core.rb +153 -0
- metadata +91 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e3144b5948fc00256b3135d0d1c0f61f1497fa67
|
4
|
+
data.tar.gz: a63d82bc5af9f8377c1656590d8be5b24f27e189
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6800843dbcd76f05a19662550c01e534f6282ba884979db15adc191b4812c0c17756932495b09496c87a64fcc2515d11dd92e1b13462addc8f222e9ea2a9a4e2
|
7
|
+
data.tar.gz: 48297a6ceb0877bcdd5ff9cb7c8b918601b8d375b3b428d12770d507c6810ff97b0590e85f39b722134ef019e42b1f96739992745a31ed0b491ad4a4ce7d7c9e
|
data/CHANGES.md
ADDED
data/README.md
ADDED
data/lib/ferris.rb
ADDED
data/lib/ferris/core.rb
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
module Ferris
|
2
|
+
module Browser
|
3
|
+
class << self
|
4
|
+
attr_accessor :browser
|
5
|
+
end
|
6
|
+
|
7
|
+
def browser
|
8
|
+
Browser.browser
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Region
|
13
|
+
def base_url(url = nil)
|
14
|
+
@base_url ||= url
|
15
|
+
end
|
16
|
+
|
17
|
+
def region(name, class_name, &blk)
|
18
|
+
define_method("#{name}_region_object") do
|
19
|
+
class_name.base_url = self.class.base_url
|
20
|
+
class_name.new.tap do |region|
|
21
|
+
if block_given?
|
22
|
+
root = self.instance_exec(&blk)
|
23
|
+
return root.map {|root| class_name.new.tap {|region| region.root = root} } if root.respond_to?(:to_a)
|
24
|
+
region.root = root
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
self.instance_eval { private "#{name}_region_object" }
|
29
|
+
|
30
|
+
define_method("#{name}!") { self.class.region_list["@_#{name}"] ||= send("#{name}_region_object") }
|
31
|
+
define_method(name) { self.class.region_list["@_#{name}"] = send("#{name}_region_object") }
|
32
|
+
|
33
|
+
# TODO: Convert to .present? use
|
34
|
+
define_method("#{name}_present?") { [send(name)].flatten.map(&:root).map(&:present?).all? }
|
35
|
+
end
|
36
|
+
alias_method :page, :region
|
37
|
+
|
38
|
+
def region_list
|
39
|
+
@regions ||= {}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Core
|
44
|
+
extend Region
|
45
|
+
include Watir::Waitable
|
46
|
+
|
47
|
+
attr_reader :browser, :base_url
|
48
|
+
attr_accessor :root
|
49
|
+
|
50
|
+
def initialize(browser = Browser.browser)
|
51
|
+
@browser = browser
|
52
|
+
@base_url = self.class.base_url || ''
|
53
|
+
end
|
54
|
+
|
55
|
+
def inspect
|
56
|
+
'#<%s url=%s title=%s>' % [self.class, url.inspect, title.inspect]
|
57
|
+
end
|
58
|
+
alias selector_string inspect
|
59
|
+
|
60
|
+
def present?
|
61
|
+
raise 'No root element set.' unless root
|
62
|
+
root.present?
|
63
|
+
end
|
64
|
+
|
65
|
+
def visit(*args)
|
66
|
+
browser.goto page_url(*args)
|
67
|
+
exception = Selenium::WebDriver::Error::WebDriverError
|
68
|
+
message = "Expected to be on #{self.class}, but conditions not met"
|
69
|
+
raise exception, message if verifiable? && !loaded?
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
def verifiable?
|
74
|
+
self.class.require_url || self.respond_to?(:page_title) || self.class.required_element_list.any?
|
75
|
+
end
|
76
|
+
|
77
|
+
def loaded?
|
78
|
+
raise Selenium::WebDriver::Error::WebDriverError, 'Cannot verify a page/region without requirements' unless page_verifiable?
|
79
|
+
[!self.class.require_url || check_url, !respond_to?(:page_title) || check_title, !self.class.required_element_list.any? || check_required_elements].all?
|
80
|
+
end
|
81
|
+
|
82
|
+
def check_url
|
83
|
+
page_url[%r{^#{URI.parse(page_url).scheme}://(.*?)/?$}, 1] == browser.url[%r{^#{URI.parse(browser.url).scheme}://(.*?)/?$}, 1]
|
84
|
+
end
|
85
|
+
|
86
|
+
def check_title
|
87
|
+
browser.title == page_title
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_required_elements
|
91
|
+
browser.wait_until { |_b| self.class.required_element_list.all? { |e| send(e).present? } }
|
92
|
+
rescue Watir::Wait::TimeoutError
|
93
|
+
false
|
94
|
+
end
|
95
|
+
|
96
|
+
class << self
|
97
|
+
attr_writer :required_element_list
|
98
|
+
attr_reader :require_url
|
99
|
+
attr_accessor :base_url
|
100
|
+
|
101
|
+
def page_url(required: false)
|
102
|
+
@require_url = required
|
103
|
+
define_method('page_url') {|*args| base_url + yield(*args) }
|
104
|
+
end
|
105
|
+
alias_method :partial_url, :page_url
|
106
|
+
|
107
|
+
def page_title
|
108
|
+
define_method('page_title') {|*args| yield(*args) }
|
109
|
+
end
|
110
|
+
|
111
|
+
def required_element_list
|
112
|
+
@required_element_list ||= []
|
113
|
+
end
|
114
|
+
|
115
|
+
def inherited(subclass)
|
116
|
+
subclass.required_element_list = required_element_list.dup
|
117
|
+
end
|
118
|
+
|
119
|
+
def element(name, required: false, &block)
|
120
|
+
define_method(name) {|*args| self.instance_exec(*args, &block) }
|
121
|
+
required_element_list << name.to_sym if required
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
module SiteObject
|
127
|
+
def self.configure(&blk)
|
128
|
+
raise 'Must provide block with defined regions' unless block_given?
|
129
|
+
last_defined_class = defined_classes.last
|
130
|
+
last_defined_class.include Browser
|
131
|
+
last_defined_class.extend Region
|
132
|
+
last_defined_class.instance_exec(&blk)
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.defined_classes
|
136
|
+
self.constants.select {|k| self.const_get(k).is_a? Class }.map {|class_name| Object.const_get("#{self.to_s}::#{class_name.to_s}") }
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.included(_kls)
|
140
|
+
@@defined_classes = defined_classes
|
141
|
+
end
|
142
|
+
|
143
|
+
def method_missing(name, *arg, &blk)
|
144
|
+
@@defined_classes.each {|class_name| return class_name.new.send(name, *arg, &blk) if class_name.new.respond_to?(name) }
|
145
|
+
super
|
146
|
+
end
|
147
|
+
|
148
|
+
def respond_to_missing?(method_name, _include_private = false)
|
149
|
+
@@defined_classes.each {|class_name| return true if class_name.new.respond_to?(method_name)}
|
150
|
+
super
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ferris_watir
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Automation Wizards
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: watir
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.0.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: watir_model
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.2
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.5.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.5.0
|
55
|
+
description: 'An un-opinionated testing framework built on top of WATIR which provides
|
56
|
+
massive power with minimal DSL. '
|
57
|
+
email:
|
58
|
+
- Justin.Commu@loblaw.ca
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- CHANGES.md
|
64
|
+
- README.md
|
65
|
+
- lib/ferris.rb
|
66
|
+
- lib/ferris/core.rb
|
67
|
+
homepage: https://loblawdigital.ca
|
68
|
+
licenses:
|
69
|
+
- MIT
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.6.7
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: Next level web testing framework
|
91
|
+
test_files: []
|