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 +7 -0
- data/lib/core/CommonSteps.rb +138 -0
- data/lib/core/PageObject.rb +383 -0
- data/lib/core/TestEngine.rb +59 -0
- data/lib/core/TestLogger.rb +15 -0
- data/lib/rybellion.rb +2 -0
- metadata +49 -0
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
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: []
|