ferris_watir 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,3 @@
1
+ ### 0.1.0 (2017-01-17)
2
+
3
+ * initial commit
@@ -0,0 +1,6 @@
1
+ # Ferris
2
+
3
+ ## Synopsis
4
+
5
+ An un-opinionated testing framework built on top of WATIR which provides massive power with minimal DSL.
6
+
@@ -0,0 +1,2 @@
1
+ require 'watir'
2
+ require 'ferris/core'
@@ -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: []