rybellion 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 55c62f827e200417ea0463a7f8be0b842d3e1ce4
4
+ data.tar.gz: c69364f87d705a465b2ae8be5bf981b9b2aba2fc
5
+ SHA512:
6
+ metadata.gz: abb9c208a4739fdbd11d47f5efa84cf51f682f4bb971239db8967324b768cbd1dbaa6345bb0d7145c0ab0f0d038ee8b94a1aaea2a2cdeac1ce123f6d763ab86c
7
+ data.tar.gz: 1425dbfd1d3e077a9fe349ac371c034e6851df94fdd8ac3d71007f7a5e4ef77668c1675245b38a5656cb486952807552535a91b05c5de99b860551f909423810
@@ -0,0 +1,138 @@
1
+ require_relative './TestEngine'
2
+
3
+ ## ------------------------------------------------------
4
+ ## Given steps definition
5
+ ## ------------------------------------------------------
6
+
7
+ Given "User has [$page_name] page open" do |page_name|
8
+ page = TestEngine.FindPage(page_name)
9
+ page.Go()
10
+ end
11
+
12
+ ## ------------------------------------------------------
13
+ ## When steps definition
14
+ ## ------------------------------------------------------
15
+
16
+ When "User enters '$value' to the [$element_name]" do |value, element_name|
17
+ element = TestEngine.CurrentPage.FindElement(element_name)
18
+ element.SendKeys(value)
19
+ end
20
+
21
+ When "User clicks the [$element_name]" do |element_name|
22
+ element = TestEngine.CurrentPage.FindElement(element_name)
23
+ element.Click
24
+ end
25
+
26
+ When "User selects the [$element_name]" do |element_name|
27
+ element = TestEngine.CurrentPage.FindElement(element_name)
28
+ element.Click
29
+ end
30
+
31
+ When "User selects '$value' on the [$element_name]" do |value, element_name|
32
+ element = TestEngine.CurrentPage.FindElement(element_name)
33
+ element.SelectItem(value)
34
+ end
35
+
36
+ When "User checks the [$element_name]" do |element_name|
37
+ element = TestEngine.CurrentPage.FindElement(element_name)
38
+ element.Check
39
+ end
40
+
41
+ When "User unchecks the [$element_name]" do |element_name|
42
+ element = TestEngine.CurrentPage.FindElement(element_name)
43
+ element.Uncheck
44
+ end
45
+
46
+ ## ------------------------------------------------------
47
+ ## Then steps definition
48
+ ## ------------------------------------------------------
49
+
50
+ Then "The browser shows [$page_name] page" do |page_name|
51
+ page = TestEngine.FindPage(page_name)
52
+ page.VerifyURL
53
+ end
54
+
55
+ Then "The [$element_name] exists" do |element_name|
56
+ element = TestEngine.CurrentPage.FindElement(element_name)
57
+ element.Exists
58
+ end
59
+
60
+ Then "The [$element_name] does not exist" do |element_name|
61
+ element = TestEngine.CurrentPage.FindElement(element_name)
62
+ element.NotExists
63
+ end
64
+
65
+ Then "The [$element_name] value is empty" do |element_name|
66
+ element = TestEngine.CurrentPage.FindElement(element_name)
67
+ element.ValueIsEmpty
68
+ end
69
+
70
+ Then "The [$element_name] value is not empty" do |element_name|
71
+ element = TestEngine.CurrentPage.FindElement(element_name)
72
+ element.ValueIsNotEmpty
73
+ end
74
+
75
+ Then "The [$element_name] value is '$value'" do |element_name, value|
76
+ element = TestEngine.CurrentPage.FindElement(element_name)
77
+ element.ValueIs(value)
78
+ end
79
+
80
+ Then "The [$element_name] value is not '$value'" do |element_name, value|
81
+ element = TestEngine.CurrentPage.FindElement(element_name)
82
+ element.ValueIsNot(value)
83
+ end
84
+
85
+ Then "The [$element_name] value contains '$value'" do |element_name, value|
86
+ element = TestEngine.CurrentPage.FindElement(element_name)
87
+ element.ValueContains(value)
88
+ end
89
+
90
+ Then "The [$element_name] value is more than '$value'" do |element_name, value|
91
+ element = TestEngine.CurrentPage.FindElement(element_name)
92
+ element.ValueIsMoreThan(value)
93
+ end
94
+
95
+ Then "The [$element_name] value is more than or equal '$value'" do |element_name, value|
96
+ element = TestEngine.CurrentPage.FindElement(element_name)
97
+ element.ValueIsMoreThanOrEqual(value)
98
+ end
99
+
100
+ Then "The [$element_name] value is less than '$value'" do |element_name, value|
101
+ element = TestEngine.CurrentPage.FindElement(element_name)
102
+ element.ValueIsLessThan(value)
103
+ end
104
+
105
+ Then "The [$element_name] value is less than or equal '$value'" do |element_name, value|
106
+ element = TestEngine.CurrentPage.FindElement(element_name)
107
+ element.ValueIsLessThanOrEqual(value)
108
+ end
109
+
110
+ Then "The [$element_name] value is between '$value1' and '$value2'" do |element_name, value1, value2|
111
+ element = TestEngine.CurrentPage.FindElement(element_name)
112
+ element.ValueIsBetween(value1, value2)
113
+ end
114
+
115
+ Then "The [$element_name] has item '$value'" do |element_name, value|
116
+ element = TestEngine.CurrentPage.FindElement(element_name)
117
+ element.HasItem(value)
118
+ end
119
+
120
+ Then "The [$element_name] is selected" do |element_name|
121
+ element = TestEngine.CurrentPage.FindElement(element_name)
122
+ element.IsSelected
123
+ end
124
+
125
+ Then "The [$element_name] is not selected" do |element_name|
126
+ element = TestEngine.CurrentPage.FindElement(element_name)
127
+ element.IsNotSelected
128
+ end
129
+
130
+ Then "The [$element_name] is checked" do |element_name|
131
+ element = TestEngine.CurrentPage.FindElement(element_name)
132
+ element.IsChecked
133
+ end
134
+
135
+ Then "The [$element_name] is unchecked" do |element_name|
136
+ element = TestEngine.CurrentPage.FindElement(element_name)
137
+ element.IsUnchecked
138
+ end
@@ -0,0 +1,383 @@
1
+ require 'uri'
2
+ require 'yaml'
3
+ require 'watir-webdriver'
4
+
5
+ require 'timeout'
6
+
7
+ require_relative './TestLogger'
8
+
9
+ class Element
10
+ attr_accessor :name, :xpath
11
+
12
+ def initialize(page, object)
13
+ @page = page
14
+ @name = object['name']
15
+ @xpath = object['xpath']
16
+ end
17
+
18
+ ##
19
+ ## Basic element properties
20
+ ##
21
+
22
+ def get
23
+ return @page.browser.element(:xpath => @xpath)
24
+ end
25
+
26
+ def value
27
+ element = self.get
28
+
29
+ if element.tag_name == 'select'
30
+ select = self.get_select
31
+
32
+ text = []
33
+ for option in select.selected_options
34
+ text << option.text
35
+ end
36
+
37
+ return text.join('\n')
38
+ elsif ['input', 'button'].include? element.tag_name
39
+ return element.value
40
+ else
41
+ return element.text
42
+ end
43
+ end
44
+
45
+ def exists
46
+ element = self.get
47
+
48
+ if element.exists?
49
+ return true
50
+ else
51
+ return false
52
+ end
53
+ end
54
+
55
+ def enabled
56
+ return false
57
+ end
58
+
59
+ def get_checkbox
60
+ element = self.get
61
+
62
+ if element.tag_name == 'input' and element.attribute_value('type') == 'checkbox'
63
+ checkbox = @page.browser.checkbox(:xpath => @xpath)
64
+ return checkbox
65
+ end
66
+
67
+ Log.Failed("The element '#{@name}' is not type 'checkbox'\n")
68
+ return nil
69
+ end
70
+
71
+ def get_radio
72
+ element = self.get
73
+
74
+ if element.tag_name == 'input' and element.attribute_value('type') == 'radio'
75
+ radio = @page.browser.radio(:xpath => @xpath)
76
+ return radio
77
+ end
78
+
79
+ Log.Failed("The element '#{@name}' is not type 'radio'\n")
80
+ return nil
81
+ end
82
+
83
+ def get_select
84
+ element = self.get
85
+
86
+ if element.tag_name == 'select'
87
+ select = @page.browser.select_list(:xpath => @xpath)
88
+ return select
89
+ end
90
+
91
+ Log.Failed("The element '#{@name}' is not type 'select'\n")
92
+ return nil
93
+ end
94
+
95
+ ##
96
+ ## Action methods
97
+ ##
98
+
99
+ def SendKeys(value)
100
+ element = self.get
101
+ element.send_keys(value)
102
+ return true
103
+ end
104
+
105
+ def Click()
106
+ element = self.get
107
+ element.click
108
+ return true
109
+ end
110
+
111
+ #def Select() ## for radio button
112
+ # radio = self.get_radio
113
+ # radio.set
114
+ # return true
115
+ #end
116
+
117
+ def SelectItem(value) ## for select list
118
+ select = self.get_select
119
+ select.select(value)
120
+ return true
121
+ end
122
+
123
+ def Check()
124
+ checkbox = self.get_checkbox
125
+ checkbox.set
126
+ return true
127
+ end
128
+
129
+ def Uncheck()
130
+ checkbox = self.get_checkbox
131
+ checkbox.clear
132
+ return true
133
+ end
134
+
135
+ ##
136
+ ## Verification methods will raise error if failed, don't use for check condition logic
137
+ ##
138
+
139
+ def Exists()
140
+ if self.exists
141
+ return true
142
+ end
143
+
144
+ Log.Failed("Value not matched", '<not exists>', '<exists>')
145
+ return false
146
+ end
147
+
148
+ def NotExists()
149
+ if not self.exists
150
+ return true
151
+ end
152
+
153
+ Log.Failed("Value not matched", '<exists>', '<not exists>')
154
+ return false
155
+ end
156
+
157
+ def ValueIsEmpty()
158
+ if self.value == ''
159
+ return true
160
+ end
161
+
162
+ Log.Failed("Value not matched", self.value, '<empty>')
163
+ return false
164
+ end
165
+
166
+ def ValueIsNotEmpty()
167
+ if self.value != ''
168
+ return true
169
+ end
170
+
171
+ Log.Failed("Value not matched", '<empty>', '<not empty>')
172
+ return false
173
+ end
174
+
175
+ def ValueIs(value)
176
+ if self.value == value
177
+ return true
178
+ end
179
+
180
+ Log.Failed("Value not matched", self.value, value)
181
+ return false
182
+ end
183
+
184
+ def ValueIsNot(value)
185
+ if self.value != value
186
+ return true
187
+ end
188
+
189
+ Log.Failed("Value not matched", self.value, value)
190
+ return false
191
+ end
192
+
193
+ def ValueContains(value)
194
+ if self.value.include? value
195
+ return true
196
+ end
197
+
198
+ Log.Failed("Value not matched", self.value, value)
199
+ return false
200
+ end
201
+
202
+ def ValueIsMoreThan(value)
203
+ if self.value > value
204
+ return true
205
+ end
206
+
207
+ Log.Failed("Value not matched", self.value, "( x > #{value} )")
208
+ return false
209
+ end
210
+
211
+ def ValueIsMoreThanOrEqual(value)
212
+ if self.value >= value
213
+ return true
214
+ end
215
+
216
+ Log.Failed("Value not matched", self.value, "( x >= #{value} )")
217
+ return false
218
+ end
219
+
220
+ def ValueIsLessThan(value)
221
+ if self.value < value
222
+ return true
223
+ end
224
+
225
+ Log.Failed("Value not matched", self.value, "( x < #{value} )")
226
+ return false
227
+ end
228
+
229
+ def ValueIsLessThanOrEqual(value)
230
+ if self.value <= value
231
+ return true
232
+ end
233
+
234
+ Log.Failed("Value not matched", self.value, "( x <= #{value} )")
235
+ return false
236
+ end
237
+
238
+ def ValueIsBetween(value1, value2)
239
+ if value1 < value2
240
+ if self.value >= value1 and self.value <= value2
241
+ return true
242
+ end
243
+ else
244
+ if self.value <= value1 and self.value >= value2
245
+ return true
246
+ end
247
+ end
248
+
249
+ Log.Failed("Value not matched", self.value, " x in (#{value1} - #{value2})")
250
+ return false
251
+ end
252
+
253
+ def HasItem(value)
254
+ select = self.get_select
255
+
256
+ options = []
257
+ for option in select.options
258
+ options << option.text
259
+ end
260
+
261
+ if options.include? value
262
+ return true
263
+ end
264
+
265
+ Log.Failed("Item not found in list", "\n\t" + options.join("\n\t"), value)
266
+ return false
267
+ end
268
+
269
+ def IsSelected()
270
+ radio = self.get_radio
271
+
272
+ if radio.set?
273
+ return true
274
+ end
275
+
276
+ Log.Failed("Value not matched", '<not selected>', '<selected>')
277
+ return false
278
+ end
279
+
280
+ def IsNotSelected()
281
+ radio = self.get_radio
282
+
283
+ if not radio.set?
284
+ return true
285
+ end
286
+
287
+ Log.Failed("Value not matched", '<selected>', '<not selected>')
288
+ return false
289
+ end
290
+
291
+ def IsChecked()
292
+ checkbox = self.get_checkbox
293
+
294
+ if checkbox.set?
295
+ return true
296
+ end
297
+
298
+ Log.Failed("Value not matched", '<not checked>', '<checked>')
299
+ return false
300
+ end
301
+
302
+ def IsUnchecked()
303
+ checkbox = self.get_checkbox
304
+
305
+ if not checkbox.set?
306
+ return true
307
+ end
308
+
309
+ Log.Failed("Value not matched", 'checked>', '<unchecked>')
310
+ return false
311
+ end
312
+ end
313
+
314
+
315
+ class Page
316
+ attr_accessor :name, :url, :title, :elements, :browser
317
+
318
+ def initialize(browser, pageobject)
319
+ @browser = browser
320
+ @name = pageobject['page']['name']
321
+ @url = pageobject['page']['url']
322
+ @title = pageobject['page']['title']
323
+
324
+ @elements = Hash.new
325
+
326
+ if pageobject.key? 'elements'
327
+ for object in pageobject['elements']
328
+ element = Element.new(self, object)
329
+
330
+ if @elements.key? element.name
331
+ Log.Info "#{@name}\nDuplicate element name: '#{element.name}'"
332
+ else
333
+ @elements[element.name] = element
334
+ end
335
+ end
336
+ end
337
+ end
338
+
339
+ def Go()
340
+ begin
341
+ @browser.goto @url
342
+ rescue Timeout::Error
343
+ raise "Page load timeout\nURL: #{@url} (15 sec)\n"
344
+ end
345
+
346
+ return true
347
+ end
348
+
349
+ def FindElement(name)
350
+ if @elements.key? name
351
+ return @elements[name]
352
+ end
353
+
354
+ raise "Element not found in list: '#{name}'\n"
355
+ return nil
356
+ end
357
+
358
+ def VerifyTitle()
359
+ @browser.windows.last.use
360
+
361
+ if @title == @browser.title
362
+ return true
363
+ end
364
+
365
+ Log.Failed("Title not matched", @browser.title, @title)
366
+ return false
367
+ end
368
+
369
+ def VerifyURL()
370
+ @browser.windows.last.use
371
+
372
+ uri = URI(@url)
373
+ url = "#{uri.scheme}://#{uri.host}#{uri.path}"
374
+
375
+ begin
376
+ Watir::Wait.until(15) { browser.url.include? url }
377
+ return true
378
+ rescue
379
+ Log.Failed("URL not matched", @browser.url, url)
380
+ return false
381
+ end
382
+ end
383
+ end
@@ -0,0 +1,59 @@
1
+ require 'yaml'
2
+ require 'watir-webdriver'
3
+
4
+ require_relative './PageObject'
5
+
6
+
7
+ module TestEngine
8
+
9
+ @@browser = nil
10
+ @@current_page = nil
11
+
12
+ @@pages = Hash.new
13
+
14
+ def self.OpenBrowser(browser="default")
15
+ if browser.downcase == 'chrome'
16
+ @@browser = Watir::Browser.new :chrome
17
+ elsif browser.downcase == 'firefox'
18
+ @@browser = Watir::Browser.new :firefox
19
+ else
20
+ @@browser = Watir::Browser.new
21
+ end
22
+ end
23
+
24
+ def self.CloseBrowser()
25
+ @@browser.close
26
+ end
27
+
28
+ def self.LoadPageDefinitions(path)
29
+ if not @@pages.empty?
30
+ return true
31
+ end
32
+
33
+ for filename in Dir.glob(path)
34
+ pageobject = YAML.load_file(filename)
35
+ page = Page.new(@@browser, pageobject)
36
+
37
+ if @@pages.key? page.name
38
+ raise "Duplicate page name: '#{page.name}'\n"
39
+ else
40
+ @@pages[page.name] = page
41
+ end
42
+ end
43
+ end
44
+
45
+ def self.FindPage(name)
46
+ if @@pages.key? name
47
+ @@current_page = @@pages[name]
48
+ return @@current_page
49
+ end
50
+
51
+ raise "Page not found in list: '#{name}'\n"
52
+ return nil
53
+ end
54
+
55
+ def self.CurrentPage
56
+ return @@current_page
57
+ end
58
+
59
+ end
@@ -0,0 +1,15 @@
1
+ module Log
2
+ def self.Info(message)
3
+ puts message
4
+ end
5
+
6
+ def self.Failed(message, actual="---", expect="---")
7
+ details = message
8
+
9
+ if actual != "---" and expect != "---"
10
+ details = "#{message}\nactual: '#{actual}'\nexpect: '#{expect}'\n"
11
+ end
12
+
13
+ raise details
14
+ end
15
+ end
data/lib/rybellion.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "core/TestEngine"
2
+ require "core/CommonSteps"
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rybellion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Peerapat Sungkasem
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A tester-friendly web automated testing framework.
14
+ email:
15
+ - gigapixel7@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/core/CommonSteps.rb
21
+ - lib/core/PageObject.rb
22
+ - lib/core/TestEngine.rb
23
+ - lib/core/TestLogger.rb
24
+ - lib/rybellion.rb
25
+ homepage: https://github.com/gigapixel/rybellion
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.2.2
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Initial version
49
+ test_files: []