rybellion 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []