rwebunit 0.2.0 → 0.7.2
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.
- data/CHANGELOG +110 -35
- data/Rakefile +6 -5
- data/lib/rwebunit/assert.rb +249 -0
- data/lib/rwebunit/driver.rb +296 -0
- data/lib/rwebunit/rspec_helper.rb +108 -0
- data/lib/rwebunit/test_context.rb +15 -10
- data/lib/rwebunit/test_utils.rb +81 -72
- data/lib/rwebunit/web_page.rb +58 -66
- data/lib/rwebunit/web_testcase.rb +20 -201
- data/lib/rwebunit/web_tester.rb +365 -399
- data/lib/rwebunit.rb +5 -0
- data/test/test_test_utils.rb +76 -73
- metadata +45 -43
data/lib/rwebunit/web_page.rb
CHANGED
@@ -2,85 +2,77 @@
|
|
2
2
|
#* Copyright (c) 2006, Zhimin Zhan.
|
3
3
|
#* Distributed open-source, see full license in MIT-LICENSE
|
4
4
|
#***********************************************************
|
5
|
+
require File.join(File.dirname(__FILE__), 'assert')
|
6
|
+
require File.join(File.dirname(__FILE__), 'driver')
|
5
7
|
|
6
8
|
module RWebUnit
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
# WebPage (children of AbstractWebPage) encapsulates a real web page.
|
11
|
+
# For example,
|
12
|
+
# beginAt("/home")
|
13
|
+
# @browser.clickLinkWithText("/login")
|
14
|
+
# @browser.setFormElement("username", "sa")
|
15
|
+
# Can be rewritten to
|
16
|
+
# begin_at("/home")
|
17
|
+
# home_page = HomePage.new
|
18
|
+
# login_page = home_page.clickLoginLink
|
19
|
+
# login_page.enterUserName("sa")
|
20
|
+
#
|
21
|
+
# So you only need change in LoingPage class if UI changes, which happen quite often.
|
22
|
+
class AbstractWebPage
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
include RWebUnit::Assert
|
25
|
+
include RWebUnit::Driver
|
26
|
+
|
27
|
+
# browser: passed to do assertion within the page
|
28
|
+
# page_text: text used to identify the page, title will be the first candidate
|
29
|
+
attr_accessor :browser, :page_text
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
+
def initialize(web_tester, page_text=nil)
|
32
|
+
@web_tester = web_tester
|
33
|
+
@page_text = page_text
|
34
|
+
assert_on_page
|
35
|
+
end
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
37
|
+
def browser
|
38
|
+
@web_tester
|
39
|
+
end
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
41
|
+
def assert_on_page()
|
42
|
+
assert_text_present(@page_text) if @page_text
|
43
|
+
end
|
39
44
|
|
40
|
-
|
41
|
-
|
42
|
-
|
45
|
+
def assert_not_on_page()
|
46
|
+
assert_text_not_present(@page_text) if @page_text
|
47
|
+
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
49
|
+
def dump(stream = nil)
|
50
|
+
@web_tester.dump_response(stream)
|
51
|
+
end
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
def source
|
54
|
+
@web_tester.page_source
|
55
|
+
end
|
51
56
|
|
52
|
-
|
53
|
-
|
54
|
-
|
57
|
+
def title
|
58
|
+
@web_tester.page_title
|
59
|
+
end
|
60
|
+
|
61
|
+
def expect_page(page_clazz)
|
62
|
+
page_clazz.new(@web_tester)
|
63
|
+
end
|
55
64
|
|
56
|
-
|
57
|
-
|
65
|
+
# TO validate
|
66
|
+
def contains?(ary)
|
67
|
+
page_source = source
|
68
|
+
found = false
|
69
|
+
ary.each do |str|
|
70
|
+
found ||= page_source.include?(str)
|
58
71
|
end
|
72
|
+
return found
|
73
|
+
end
|
74
|
+
alias include contains?
|
59
75
|
|
60
|
-
|
61
|
-
# Trick: In your Rails application,
|
62
|
-
# :loading => "Element.show('search_indicator');
|
63
|
-
# :complete => "Element.hide('search_indicator');
|
64
|
-
#
|
65
|
-
# <%= image_tag("indicator.gif", :id => 'search_indicator', :style => 'display:none') %>
|
66
|
-
#
|
67
|
-
# In your test case:
|
68
|
-
# wait_ajax_update("search_indicator", "30)
|
69
|
-
#
|
70
|
-
# Warning: this method has not been fully tested, if you are not using Rails, change your parameter accordingly.
|
71
|
-
#
|
72
|
-
def wait_ajax_update(element_id, seconds)
|
73
|
-
count = 0
|
74
|
-
while count < (seconds / 2) do
|
75
|
-
search_indicator = @browser.getElementById(element_id)
|
76
|
-
search_indicator_outer_html = search_indicator.outerHtml if search_indicator
|
77
|
-
return true if search_indicator_outer_html && search_indicator_outer_html.include?('style="DISPLAY: none"')
|
78
|
-
sleep 2;
|
79
|
-
count = count + 1
|
80
|
-
end
|
81
|
-
return false
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
76
|
+
end
|
85
77
|
|
86
78
|
end
|
@@ -4,214 +4,33 @@
|
|
4
4
|
#***********************************************************
|
5
5
|
|
6
6
|
require 'test/unit'
|
7
|
+
require File.join(File.dirname(__FILE__), 'assert')
|
8
|
+
require File.join(File.dirname(__FILE__), 'driver')
|
7
9
|
|
8
10
|
module RWebUnit
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
class WebTestCase < Test::Unit::TestCase
|
13
|
+
include RWebUnit::Driver
|
14
|
+
include RWebUnit::Assert
|
15
|
+
include RWebUnit::Utils
|
12
16
|
|
13
|
-
|
17
|
+
attr_reader :web_tester
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
def initialize(name=nil)
|
20
|
+
super(name) if name
|
21
|
+
@web_tester = WebTester.new
|
22
|
+
end
|
19
23
|
|
20
|
-
|
21
|
-
|
22
|
-
|
24
|
+
def default_test
|
25
|
+
super unless (self.class == WebTestCase)
|
26
|
+
end
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
def open_browser(baseUrl, relativeUrl)
|
29
|
+
test_context.base_url = baseUrl
|
30
|
+
begin_at(relativeUrl)
|
31
|
+
end
|
32
|
+
alias open_ie open_browser
|
27
33
|
|
28
|
-
|
29
|
-
@web_tester.beginAt(url)
|
30
|
-
end
|
31
|
-
|
32
|
-
def openBrowser(baseUrl, relativeUrl)
|
33
|
-
getTestContext().base_url = baseUrl
|
34
|
-
beginAt(relativeUrl)
|
35
|
-
end
|
36
|
-
|
37
|
-
def closeBrowser
|
38
|
-
@web_tester.closeBrowser
|
39
|
-
end
|
40
|
-
|
41
|
-
def goBack()
|
42
|
-
@web_tester.goBack
|
43
|
-
end
|
44
|
-
|
45
|
-
def goForward()
|
46
|
-
@web_tester.goForward
|
47
|
-
end
|
48
|
-
|
49
|
-
def gotoPage(page)
|
50
|
-
@web_tester.gotoPage(page)
|
51
|
-
end
|
52
|
-
|
53
|
-
# assertions
|
54
|
-
def assertTitleEquals(title)
|
55
|
-
@web_tester.assertTitleEquals(title)
|
56
|
-
end
|
57
|
-
|
58
|
-
def assertTextPresent(text)
|
59
|
-
@web_tester.assertTextPresent(text)
|
60
|
-
end
|
61
|
-
|
62
|
-
def assertTextNotPresent(text)
|
63
|
-
@web_tester.assertTextNotPresent(text)
|
64
|
-
end
|
65
|
-
|
66
|
-
def assertTextInTable(tableId, text)
|
67
|
-
@web_tester.assertTextInTable(tableId, text)
|
68
|
-
end
|
69
|
-
|
70
|
-
def assertTextNotInTable(tableId, text)
|
71
|
-
@web_tester.assertTextNotInTable(tableId, text)
|
72
|
-
end
|
73
|
-
|
74
|
-
# textfields
|
75
|
-
def setFormElement(elementName, elementValue)
|
76
|
-
@web_tester.setFormElement(elementName, elementValue)
|
77
|
-
end
|
78
|
-
|
79
|
-
def assertTextPresentInTextField(textfieldName, text, msg = nil)
|
80
|
-
@web_tester.assertTextPresentInTextField(textfieldName, text, msg)
|
81
|
-
end
|
82
|
-
|
83
|
-
#links
|
84
|
-
def clickLinkWithText(linkText)
|
85
|
-
@web_tester.clickLinkWithText(linkText)
|
86
|
-
end
|
87
|
-
|
88
|
-
def assertLinkPresentWithText(linkText)
|
89
|
-
@web_tester.assertLinkPresentWithText(linkText)
|
90
|
-
end
|
91
|
-
|
92
|
-
def assertLinkNotPresentWithText(linkText)
|
93
|
-
@web_tester.assertLinkNotPresentWithText(linkText)
|
94
|
-
end
|
95
|
-
|
96
|
-
##
|
97
|
-
# buttons
|
98
|
-
|
99
|
-
# submit the form using the first (index) submit button
|
100
|
-
def submit()
|
101
|
-
@web_tester.submit()
|
102
|
-
end
|
103
|
-
|
104
|
-
def submit(buttonId)
|
105
|
-
@web_tester.submit(buttonId)
|
106
|
-
end
|
107
|
-
|
108
|
-
def clickButton(buttonId)
|
109
|
-
@web_tester.clickButton(buttonId)
|
110
|
-
end
|
111
|
-
|
112
|
-
def clickButtonWithCaption(caption)
|
113
|
-
@web_tester.clickButtonWithCaption(caption)
|
114
|
-
end
|
115
|
-
|
116
|
-
def clickButtonWithValue(value)
|
117
|
-
@web_tester.clickButtonWithValue(value)
|
118
|
-
end
|
119
|
-
|
120
|
-
def assertButtonNotPresent(buttonID)
|
121
|
-
@web_tester.assertButtonNotPresent(buttonID)
|
122
|
-
end
|
123
|
-
|
124
|
-
def assertButtonNotPresentWithText(text)
|
125
|
-
@web_tester.assertButtonNotPresentWithText(text)
|
126
|
-
end
|
127
|
-
|
128
|
-
def assertButtonPresent(buttonID)
|
129
|
-
@web_tester.assertButtonPresent(buttonID)
|
130
|
-
end
|
131
|
-
|
132
|
-
def assertButtonPresentWithText(buttonID)
|
133
|
-
@web_tester.assertButtonPresentWithText(buttonID)
|
134
|
-
end
|
135
|
-
|
136
|
-
# checkbox
|
137
|
-
def checkCheckbox(checkBoxName)
|
138
|
-
@web_tester.checkCheckbox(checkBoxName)
|
139
|
-
end
|
140
|
-
|
141
|
-
def uncheckCheckbox(checkBoxName)
|
142
|
-
@web_tester.uncheckCheckbox(checkBoxName)
|
143
|
-
end
|
144
|
-
|
145
|
-
def assertCheckboxNotSelected(checkBoxName)
|
146
|
-
@web_tester.assertCheckboxNotSelected(checkBoxName)
|
147
|
-
end
|
148
|
-
|
149
|
-
def assertCheckboxSelected(checkBoxName)
|
150
|
-
@web_tester.assertCheckboxSelected(checkBoxName)
|
151
|
-
end
|
152
|
-
|
153
|
-
# radio button
|
154
|
-
def assertRadioOptionNotPresent(radioGroup, radioOption)
|
155
|
-
@web_tester.assertRadioOptionNotPresent(radioGroup, radioOption)
|
156
|
-
end
|
157
|
-
|
158
|
-
def assertRadioOptionPresent(radioGroup, radioOption)
|
159
|
-
@web_tester.assertRadioOptionPresent(radioGroup, radioOption)
|
160
|
-
end
|
161
|
-
|
162
|
-
def assertRadioOptionSelected(radioGroup, radioOption)
|
163
|
-
@web_tester.assertRadioOptionSelected(radioGroup, radioOption)
|
164
|
-
end
|
165
|
-
|
166
|
-
def assertRadioOptionNotSelected(radioGroup, radioOption)
|
167
|
-
@web_tester.assertRadioOptionNotSelected(radioGroup, radioOption)
|
168
|
-
end
|
169
|
-
|
170
|
-
# combo box
|
171
|
-
def selectOption(selectName, option)
|
172
|
-
@web_tester.selectOption(selectName, option)
|
173
|
-
end
|
174
|
-
|
175
|
-
# dhtml related
|
176
|
-
def assertElementPresent(elementID)
|
177
|
-
@web_tester.assertElementPresent(elementID)
|
178
|
-
end
|
179
|
-
|
180
|
-
def assertElementNotPresent(elementID)
|
181
|
-
@web_tester.assertElementNotPresent(elementID)
|
182
|
-
end
|
183
|
-
|
184
|
-
# Wait for specific seconds for an Ajax update finish.
|
185
|
-
# Trick: In your Rails application,
|
186
|
-
# :loading => "Element.show('search_indicator');
|
187
|
-
# :complete => "Element.hide('search_indicator');
|
188
|
-
#
|
189
|
-
# <%= image_tag("indicator.gif", :id => 'search_indicator', :style => 'display:none') %>
|
190
|
-
#
|
191
|
-
# In your test case:
|
192
|
-
# wait_ajax_update("search_indicator", "30)
|
193
|
-
#
|
194
|
-
# Warning: this method has not been fully tested, if you are not using Rails, change your parameter accordingly.
|
195
|
-
#
|
196
|
-
def wait_ajax_update(element_id, seconds)
|
197
|
-
count = 0
|
198
|
-
while count < (seconds / 2) do
|
199
|
-
search_indicator = @web_tester.getElementById(element_id)
|
200
|
-
search_indicator_outer_html = search_indicator.outerHtml if search_indicator
|
201
|
-
return true if search_indicator_outer_html && search_indicator_outer_html.include?('style="DISPLAY: none"')
|
202
|
-
sleep 2;
|
203
|
-
count = count + 1
|
204
|
-
end
|
205
|
-
return false
|
206
|
-
end
|
207
|
-
|
208
|
-
# ---
|
209
|
-
# For deubgging
|
210
|
-
# ---
|
211
|
-
def dumpResponse(stream = nil)
|
212
|
-
@web_tester.dumpResponse(stream)
|
213
|
-
end
|
214
|
-
|
215
|
-
end
|
34
|
+
end
|
216
35
|
|
217
36
|
end
|