rubinium 0.1.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.
- data/CHANGES +7 -0
- data/MIT-LICENSE +21 -0
- data/README +137 -0
- data/Rakefile +139 -0
- data/TODO +7 -0
- data/doc/examples/rtc_site_live.rb +12 -0
- data/doc/examples/rts_main.rb +9 -0
- data/doc/examples/rts_shared_code.rb +25 -0
- data/lib/rubinium.rb +9 -0
- data/lib/rubinium/string.rb +3 -0
- data/lib/rubinium/test_base.rb +80 -0
- data/lib/rubinium/test_suite.rb +53 -0
- data/lib/rubinium/validator.rb +16 -0
- data/test/selenium_tests/test_click.rb +22 -0
- data/test/selenium_tests/test_open.rb +11 -0
- data/test/tc_file_creation.rb +60 -0
- data/test/ts_rubinium.rb +1 -0
- data/vendor/selenium-0.6.0/install-readme.txt +9 -0
- data/vendor/selenium-0.6.0/selenium/SeleneseRunner.html +253 -0
- data/vendor/selenium-0.6.0/selenium/SeleniumLog.html +61 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner-splash.html +55 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner.hta +146 -0
- data/vendor/selenium-0.6.0/selenium/TestRunner.html +146 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestClickInFrame.html +58 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInFrame.html +48 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenInNewWindow.html +78 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestOpenMeta.html +43 -0
- data/vendor/selenium-0.6.0/selenium/devtests/TestSuite.html +39 -0
- data/vendor/selenium-0.6.0/selenium/devtests/meta/page.html +5 -0
- data/vendor/selenium-0.6.0/selenium/dom-images/butmin.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/dom-images/butplus.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/dom-styles/default.css +298 -0
- data/vendor/selenium-0.6.0/selenium/domviewer.html +16 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/carnation.jpg +0 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/example.html +75 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath-patched.js +657 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/html-xpath.js +610 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/license.txt +504 -0
- data/vendor/selenium-0.6.0/selenium/html-xpath/rainbow.jpg +0 -0
- data/vendor/selenium-0.6.0/selenium/htmlutils.js +283 -0
- data/vendor/selenium-0.6.0/selenium/index.html +60 -0
- data/vendor/selenium-0.6.0/selenium/jsmock/mock-tests.html +205 -0
- data/vendor/selenium-0.6.0/selenium/jsmock/mock.js +124 -0
- data/vendor/selenium-0.6.0/selenium/selenium-api.js +683 -0
- data/vendor/selenium-0.6.0/selenium/selenium-browserbot.js +930 -0
- data/vendor/selenium-0.6.0/selenium/selenium-commandhandlers.js +286 -0
- data/vendor/selenium-0.6.0/selenium/selenium-domviewer.js +188 -0
- data/vendor/selenium-0.6.0/selenium/selenium-executionloop.js +250 -0
- data/vendor/selenium-0.6.0/selenium/selenium-fitrunner.js +597 -0
- data/vendor/selenium-0.6.0/selenium/selenium-logging.js +88 -0
- data/vendor/selenium-0.6.0/selenium/selenium-logo.png +0 -0
- data/vendor/selenium-0.6.0/selenium/selenium-tableparser.js +50 -0
- data/vendor/selenium-0.6.0/selenium/selenium.css +211 -0
- data/vendor/selenium-0.6.0/selenium/tests/ErrorCheckingTestSuite.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSearch.html +69 -0
- data/vendor/selenium-0.6.0/selenium/tests/GoogleTestSuite.html +32 -0
- data/vendor/selenium-0.6.0/selenium/tests/JsUnitSuite.html +38 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestClick.html +128 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestClickJavascriptHref.html +115 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestCommandError.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestConfirmations.html +77 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestErrorChecking.html +71 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFailingAssert.html +59 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFailingVerifications.html +198 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestFocusOnBlur.html +53 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestGoBack.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestImplicitLocators.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestJavascriptParameters.html +91 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestLocators.html +161 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestModalDialog.html +58 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestModalDialogDialog.html +48 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestOpen.html +66 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPatternMatching.html +127 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPause.html +78 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestPrompting.html +82 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestProxy.html +62 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSelect.html +111 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSelectWindow.html +106 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestStore.html +165 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-InternetExplorer.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Konqueror.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite-Safari.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestSuite.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestType.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestUserExtensions.html +81 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifications.html +164 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlerts.html +80 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyAlertsFailures.html +108 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyConfirmationFailures.html +86 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditable.html +70 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVerifyEditableFailures.html +95 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVisibility.html +91 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestVisibilityFailures.html +131 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWait.html +112 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWaitFor.html +63 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestWaitInPopupWindow.html +94 -0
- data/vendor/selenium-0.6.0/selenium/tests/TestXPathLocators.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/alert-handling-tests.html +79 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/assert-tests.html +113 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/browserbot-tests.html +123 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-factory-tests.html +290 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/command-handler-tests.html +115 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/confirm-handling-tests.html +97 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/error-checking-command-tests.html +198 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/event-bubble-tests.html +106 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/optionlocator-tests.html +180 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-accessor-tests.html +65 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-action-tests.html +200 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-attribute-tests.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests-include.html +33 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-locator-tests.html +258 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pagebot-property-tests.html +49 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/pattern-matcher-tests.html +66 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-api-tests.html +412 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/selenium-parameter-tests.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/suite.html +52 -0
- data/vendor/selenium-0.6.0/selenium/tests/browserbot/testloop-handle-error-tests.html +74 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestButtonEvents.html +72 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestCheckboxEvents.html +107 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestFireEvents.html +75 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestLinkEvents.html +43 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestRadioEvents.html +149 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestSelectEvents.html +122 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/TestTextEvents.html +87 -0
- data/vendor/selenium-0.6.0/selenium/tests/events/readme.txt +26 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/banner.gif +0 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_async_event.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_javascript_page.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page1.html +31 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_click_page2.html +30 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_confirm.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_dummy_page.html +26 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_editable.html +36 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_focus_on_blur.html +33 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_form_events.html +98 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_framed_page.html +7 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_just_text.html +22 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_locators.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog.html +29 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_modal_dialog_dialog.html +35 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_open.html +23 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_prompt.html +34 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_reload_onchange_page.html +32 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select.html +35 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window.html +29 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_select_window_popup.html +28 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_slowloading_page.html +27 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_store_value.html +23 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page1.html +37 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_type_page2.html +61 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_verifications.html +42 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_verify_alert.html +46 -0
- data/vendor/selenium-0.6.0/selenium/tests/html/test_visibility.html +53 -0
- data/vendor/selenium-0.6.0/selenium/tests/readme.txt +1 -0
- data/vendor/selenium-0.6.0/selenium/tests/tableparser/tableparser-tests.html +122 -0
- data/vendor/selenium-0.6.0/selenium/tests/tinyWebServer.py +70 -0
- data/vendor/selenium-0.6.0/selenium/user-extensions.js.sample +62 -0
- data/vendor/selenium-0.6.0/selenium/version.txt +1 -0
- data/vendor/selenium-0.6.0/selenium/xmlextras.js +153 -0
- data/vendor/selenium-0.6.0/selenium/xpath.js +3910 -0
- metadata +216 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2004 ThoughtWorks, Inc
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
SELENIUM_PROCESS_WAIT = "wait";
|
|
18
|
+
|
|
19
|
+
starting_up = true;
|
|
20
|
+
TEST_FINISHED = true;
|
|
21
|
+
TEST_CONTINUE = false;
|
|
22
|
+
|
|
23
|
+
function TestLoop(commandFactory) {
|
|
24
|
+
this.commandFactory = commandFactory;
|
|
25
|
+
|
|
26
|
+
this.start = function() {
|
|
27
|
+
selenium.reset();
|
|
28
|
+
this.continueCurrentTest();
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
this.continueCurrentTest = function() {
|
|
32
|
+
var testStatus = this.kickoffNextCommandExecution();
|
|
33
|
+
|
|
34
|
+
if (testStatus == TEST_FINISHED) {
|
|
35
|
+
this.testComplete();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
this.kickoffNextCommandExecution = function() {
|
|
40
|
+
|
|
41
|
+
var command;
|
|
42
|
+
if (starting_up == true) {
|
|
43
|
+
command = this.firstCommand();
|
|
44
|
+
starting_up = false;
|
|
45
|
+
} else {
|
|
46
|
+
command = this.nextCommand();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!command) return TEST_FINISHED;
|
|
50
|
+
|
|
51
|
+
this.commandStarted(command);
|
|
52
|
+
|
|
53
|
+
LOG.info("Executing: |" + command.command + " | " + command.target + " | " + command.value + " |");
|
|
54
|
+
|
|
55
|
+
var result;
|
|
56
|
+
try {
|
|
57
|
+
var handler = this.commandFactory.getCommandHandler(command.command);
|
|
58
|
+
if(handler == null) {
|
|
59
|
+
throw new Error("Unknown command: '" + command.command + "'");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
command.target = selenium.preprocessParameter(command.target);
|
|
63
|
+
command.value = selenium.preprocessParameter(command.value);
|
|
64
|
+
|
|
65
|
+
result = handler.execute(selenium, command);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
this.handleCommandError(e);
|
|
68
|
+
return TEST_FINISHED;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Record the result so that we can continue the execution using
|
|
72
|
+
// window.setTimeout()
|
|
73
|
+
this.lastCommandResult = result;
|
|
74
|
+
if (result.processState == SELENIUM_PROCESS_WAIT) {
|
|
75
|
+
this.waitForCondition = function() {
|
|
76
|
+
return selenium.browserbot.isNewPageLoaded();
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (this.waitForCondition) {
|
|
81
|
+
this.pollUntilConditionIsTrue();
|
|
82
|
+
} else {
|
|
83
|
+
// Continue processing
|
|
84
|
+
this.continueCommandExecutionWithDelay();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Test is not finished.
|
|
88
|
+
return TEST_CONTINUE;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
this.handleCommandError = function(e) {
|
|
92
|
+
if (!e.isSeleniumError) {
|
|
93
|
+
LOG.exception(e);
|
|
94
|
+
var msg = "Selenium failure. Please report to selenium-devel@lists.public.thoughtworks.org, with details from the logs at the base of the page.";
|
|
95
|
+
if (e.message) {
|
|
96
|
+
msg += " The error message is: " + e.message;
|
|
97
|
+
}
|
|
98
|
+
this.commandError(msg);
|
|
99
|
+
} else {
|
|
100
|
+
LOG.error(e.message);
|
|
101
|
+
this.commandError(e.message);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Busy wait for waitForCondition() to become true, and then continue
|
|
107
|
+
* command execution.
|
|
108
|
+
*/
|
|
109
|
+
this.pollUntilConditionIsTrue = function () {
|
|
110
|
+
if (this.waitForCondition()) {
|
|
111
|
+
this.waitForCondition = null;
|
|
112
|
+
this.continueCommandExecutionWithDelay();
|
|
113
|
+
} else {
|
|
114
|
+
window.setTimeout("testLoop.pollUntilConditionIsTrue()", 10);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Continue the command execution, after waiting for the specified
|
|
121
|
+
* delay.
|
|
122
|
+
*/
|
|
123
|
+
this.continueCommandExecutionWithDelay = function() {
|
|
124
|
+
// Get the interval to use for this command execution, using the pauseInterval as
|
|
125
|
+
// specified. Reset the pause interval, since it's a one-off thing.
|
|
126
|
+
var interval = this.pauseInterval || this.getCommandInterval();
|
|
127
|
+
this.pauseInterval = undefined;
|
|
128
|
+
|
|
129
|
+
if (interval < 0) {
|
|
130
|
+
// Enable the "next/continue" button
|
|
131
|
+
this.pause();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Continue processing
|
|
135
|
+
window.setTimeout("testLoop.finishCommandExecution()", interval);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Finish the execution of the previous command, and continue the test.
|
|
141
|
+
*/
|
|
142
|
+
this.finishCommandExecution = function() {
|
|
143
|
+
this.commandComplete(this.lastCommandResult);
|
|
144
|
+
this.continueCurrentTest();
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** The default is not to have any interval between commands. */
|
|
149
|
+
TestLoop.prototype.getCommandInterval = function() {
|
|
150
|
+
return 0;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
TestLoop.prototype.firstCommand = noop;
|
|
154
|
+
|
|
155
|
+
TestLoop.prototype.nextCommand = noop;
|
|
156
|
+
|
|
157
|
+
TestLoop.prototype.commandStarted = noop;
|
|
158
|
+
|
|
159
|
+
TestLoop.prototype.commandError = noop;
|
|
160
|
+
|
|
161
|
+
TestLoop.prototype.commandComplete = noop;
|
|
162
|
+
|
|
163
|
+
TestLoop.prototype.testComplete = noop;
|
|
164
|
+
|
|
165
|
+
TestLoop.prototype.pause = noop;
|
|
166
|
+
|
|
167
|
+
function noop() {
|
|
168
|
+
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Tell Selenium to expect a failure on the next command execution. This
|
|
173
|
+
* command temporarily installs a CommandFactory that generates
|
|
174
|
+
* CommandHandlers that expect a failure.
|
|
175
|
+
*/
|
|
176
|
+
Selenium.prototype.assertFailureOnNext = function(message) {
|
|
177
|
+
if (!message) {
|
|
178
|
+
throw new Error("Message must be provided");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
var expectFailureCommandFactory =
|
|
182
|
+
new ExpectFailureCommandFactory(testLoop.commandFactory, message);
|
|
183
|
+
expectFailureCommandFactory.baseExecutor = executeCommandAndReturnFailureMessage;
|
|
184
|
+
testLoop.commandFactory = expectFailureCommandFactory;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Tell Selenium to expect an error on the next command execution. This
|
|
189
|
+
* command temporarily installs a CommandFactory that generates
|
|
190
|
+
* CommandHandlers that expect a failure.
|
|
191
|
+
*/
|
|
192
|
+
Selenium.prototype.assertErrorOnNext = function(message) {
|
|
193
|
+
if (!message) {
|
|
194
|
+
throw new Error("Message must be provided");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
var expectFailureCommandFactory =
|
|
198
|
+
new ExpectFailureCommandFactory(testLoop.commandFactory, message);
|
|
199
|
+
expectFailureCommandFactory.baseExecutor = executeCommandAndReturnErrorMessage;
|
|
200
|
+
testLoop.commandFactory = expectFailureCommandFactory;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
function ExpectFailureCommandFactory(originalCommandFactory, expectedErrorMessage) {
|
|
204
|
+
this.getCommandHandler = function(name) {
|
|
205
|
+
var baseHandler = originalCommandFactory.getCommandHandler(name);
|
|
206
|
+
var baseExecutor = this.baseExecutor;
|
|
207
|
+
var expectFailureCommand = {};
|
|
208
|
+
expectFailureCommand.execute = function() {
|
|
209
|
+
var baseFailureMessage = baseExecutor(baseHandler, arguments);
|
|
210
|
+
var result = new CommandResult();
|
|
211
|
+
if (!baseFailureMessage) {
|
|
212
|
+
result.failed = true;
|
|
213
|
+
result.failureMessage = "Command should have failed.";
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
if (! PatternMatcher.matches(expectedErrorMessage, baseFailureMessage)) {
|
|
217
|
+
result.failed = true;
|
|
218
|
+
result.failureMessage = "Expected failure message '" + expectedErrorMessage
|
|
219
|
+
+ "' but was '" + baseFailureMessage + "'";
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
result.passed = true;
|
|
223
|
+
result.result = baseFailureMessage;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
testLoop.commandFactory = originalCommandFactory;
|
|
227
|
+
return result;
|
|
228
|
+
};
|
|
229
|
+
return expectFailureCommand;
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
function executeCommandAndReturnFailureMessage(baseHandler, originalArguments) {
|
|
234
|
+
var baseResult = baseHandler.execute.apply(baseHandler, originalArguments);
|
|
235
|
+
if (baseResult.passed) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
return baseResult.failureMessage;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
function executeCommandAndReturnErrorMessage(baseHandler, originalArguments) {
|
|
242
|
+
try {
|
|
243
|
+
baseHandler.execute.apply(baseHandler, originalArguments);
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
catch (expected) {
|
|
247
|
+
return expected.message;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2004 ThoughtWorks, Inc
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
passColor = "#cfffcf";
|
|
19
|
+
failColor = "#ffcfcf";
|
|
20
|
+
workingColor = "#DEE7EC";
|
|
21
|
+
|
|
22
|
+
// The current row in the list of commands (test script)
|
|
23
|
+
currentCommandRow = 0;
|
|
24
|
+
inputTableRows = null;
|
|
25
|
+
|
|
26
|
+
// The current row in the list of tests (test suite)
|
|
27
|
+
currentTestRow = 0;
|
|
28
|
+
|
|
29
|
+
// Whether or not the jsFT should run all tests in the suite
|
|
30
|
+
runAllTests = false;
|
|
31
|
+
|
|
32
|
+
// Whether or not the current test has any errors;
|
|
33
|
+
testFailed = false;
|
|
34
|
+
suiteFailed = false;
|
|
35
|
+
|
|
36
|
+
// Holds the handlers for each command.
|
|
37
|
+
commandHandlers = null;
|
|
38
|
+
|
|
39
|
+
// The number of tests run
|
|
40
|
+
numTestPasses = 0;
|
|
41
|
+
|
|
42
|
+
// The number of tests that have failed
|
|
43
|
+
numTestFailures = 0;
|
|
44
|
+
|
|
45
|
+
// The number of commands which have passed
|
|
46
|
+
numCommandPasses = 0;
|
|
47
|
+
|
|
48
|
+
// The number of commands which have failed
|
|
49
|
+
numCommandFailures = 0;
|
|
50
|
+
|
|
51
|
+
// The number of commands which have caused errors (element not found)
|
|
52
|
+
numCommandErrors = 0;
|
|
53
|
+
|
|
54
|
+
// The time that the test was started.
|
|
55
|
+
startTime = null;
|
|
56
|
+
|
|
57
|
+
// The current time.
|
|
58
|
+
currentTime = null;
|
|
59
|
+
|
|
60
|
+
// An simple enum for failureType
|
|
61
|
+
ERROR = 0;
|
|
62
|
+
FAILURE = 1;
|
|
63
|
+
|
|
64
|
+
runInterval = 0;
|
|
65
|
+
|
|
66
|
+
function setRunInterval() {
|
|
67
|
+
// Get the value of the checked runMode option.
|
|
68
|
+
// There should be a way of getting the value of the "group", but I don't know how.
|
|
69
|
+
var runModeOptions = document.forms['controlPanel'].runMode;
|
|
70
|
+
for (var i = 0; i < runModeOptions.length; i++) {
|
|
71
|
+
if (runModeOptions[i].checked) {
|
|
72
|
+
runInterval = runModeOptions[i].value;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function continueCurrentTest() {
|
|
79
|
+
document.getElementById('continueTest').disabled = true;
|
|
80
|
+
testLoop.finishCommandExecution();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getApplicationFrame() {
|
|
84
|
+
return document.getElementById('myiframe');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function getSuiteFrame() {
|
|
88
|
+
return document.getElementById('testSuiteFrame');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function getTestFrame(){
|
|
92
|
+
return document.getElementById('testFrame');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function loadAndRunIfAuto() {
|
|
96
|
+
loadSuiteFrame();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function start() {
|
|
100
|
+
setRunInterval();
|
|
101
|
+
loadSuiteFrame();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function loadSuiteFrame() {
|
|
105
|
+
var testAppFrame = document.getElementById('myiframe');
|
|
106
|
+
selenium = Selenium.createForFrame(testAppFrame);
|
|
107
|
+
registerCommandHandlers();
|
|
108
|
+
|
|
109
|
+
//set the runInterval if there is a queryParameter for it
|
|
110
|
+
var tempRunInterval = getQueryParameter("runInterval");
|
|
111
|
+
if (tempRunInterval) {
|
|
112
|
+
runInterval = tempRunInterval;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
document.getElementById("modeRun").onclick = setRunInterval;
|
|
116
|
+
document.getElementById('modeWalk').onclick = setRunInterval;
|
|
117
|
+
document.getElementById('modeStep').onclick = setRunInterval;
|
|
118
|
+
document.getElementById('continueTest').onclick = continueCurrentTest;
|
|
119
|
+
|
|
120
|
+
var testSuiteName = getQueryParameter("test");
|
|
121
|
+
|
|
122
|
+
if (testSuiteName) {
|
|
123
|
+
addLoadListener(getSuiteFrame(), onloadTestSuite);
|
|
124
|
+
getSuiteFrame().src = testSuiteName;
|
|
125
|
+
} else {
|
|
126
|
+
onloadTestSuite();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function startSingleTest() {
|
|
131
|
+
removeLoadListener(getApplicationFrame(), startSingleTest);
|
|
132
|
+
var singleTestName = getQueryParameter("singletest");
|
|
133
|
+
addLoadListener(getTestFrame(), startTest);
|
|
134
|
+
getTestFrame().src = singleTestName;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function getIframeDocument(iframe)
|
|
138
|
+
{
|
|
139
|
+
if (iframe.contentDocument) {
|
|
140
|
+
return iframe.contentDocument;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
return iframe.contentWindow.document;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function onloadTestSuite() {
|
|
148
|
+
removeLoadListener(getSuiteFrame(), onloadTestSuite);
|
|
149
|
+
suiteTable = getIframeDocument(getSuiteFrame()).getElementsByTagName("table")[0];
|
|
150
|
+
|
|
151
|
+
// Add an onclick function to each link in the suite table
|
|
152
|
+
for(rowNum = 1;rowNum < suiteTable.rows.length; rowNum++) {
|
|
153
|
+
addOnclick(suiteTable, rowNum);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
if (isAutomatedRun()) {
|
|
158
|
+
startTestSuite();
|
|
159
|
+
} else if (getQueryParameter("autoURL")) {
|
|
160
|
+
|
|
161
|
+
addLoadListener(getApplicationFrame(), startSingleTest);
|
|
162
|
+
|
|
163
|
+
getApplicationFrame().src = getQueryParameter("autoURL");
|
|
164
|
+
|
|
165
|
+
} else {
|
|
166
|
+
testLink = suiteTable.rows[currentTestRow+1].cells[0].getElementsByTagName("a")[0];
|
|
167
|
+
getTestFrame().src = testLink.href;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Adds an onclick function to the link in the given row in suite table.
|
|
172
|
+
// This function checks whether the test has already been run and the data is
|
|
173
|
+
// stored. If the data is stored, it sets the test frame to be the stored data.
|
|
174
|
+
// Otherwise, it loads the fresh page.
|
|
175
|
+
function addOnclick(suiteTable, rowNum) {
|
|
176
|
+
aLink = suiteTable.rows[rowNum].cells[0].getElementsByTagName("a")[0];
|
|
177
|
+
aLink.onclick = function(eventObj) {
|
|
178
|
+
srcObj = null;
|
|
179
|
+
|
|
180
|
+
// For mozilla-like browsers
|
|
181
|
+
if(eventObj)
|
|
182
|
+
srcObj = eventObj.target;
|
|
183
|
+
|
|
184
|
+
// For IE-like browsers
|
|
185
|
+
else if (getSuiteFrame().contentWindow.event)
|
|
186
|
+
srcObj = getSuiteFrame().contentWindow.event.srcElement;
|
|
187
|
+
|
|
188
|
+
// The target row (the event source is not consistently reported by browsers)
|
|
189
|
+
row = srcObj.parentNode.parentNode.rowIndex || srcObj.parentNode.parentNode.parentNode.rowIndex;
|
|
190
|
+
|
|
191
|
+
// If the row has a stored results table, use that
|
|
192
|
+
if(suiteTable.rows[row].cells[1]) {
|
|
193
|
+
var bodyElement = getIframeDocument(getTestFrame()).body;
|
|
194
|
+
|
|
195
|
+
// Create a div element to hold the results table.
|
|
196
|
+
var tableNode = getIframeDocument(getTestFrame()).createElement("div");
|
|
197
|
+
var resultsCell = suiteTable.rows[row].cells[1];
|
|
198
|
+
tableNode.innerHTML = resultsCell.innerHTML;
|
|
199
|
+
|
|
200
|
+
// Append this text node, and remove all the preceding nodes.
|
|
201
|
+
bodyElement.appendChild(tableNode);
|
|
202
|
+
while (bodyElement.firstChild != bodyElement.lastChild) {
|
|
203
|
+
bodyElement.removeChild(bodyElement.firstChild);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Otherwise, just open up the fresh page.
|
|
207
|
+
else {
|
|
208
|
+
getTestFrame().src = suiteTable.rows[row].cells[0].getElementsByTagName("a")[0].href;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return false;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function isQueryParameterTrue(name) {
|
|
216
|
+
parameterValue = getQueryParameter(name);
|
|
217
|
+
return (parameterValue != null && parameterValue.toLowerCase() == "true");
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function getQueryParameter(searchKey) {
|
|
221
|
+
var clauses = location.search.substr(1).split('&');
|
|
222
|
+
for (var i = 0; i < clauses.length; i++) {
|
|
223
|
+
var keyValuePair = clauses[i].split('=',2);
|
|
224
|
+
var key = unescape(keyValuePair[0]);
|
|
225
|
+
if (key == searchKey) {
|
|
226
|
+
return unescape(keyValuePair[1]);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function isNewWindow() {
|
|
233
|
+
return isQueryParameterTrue("newWindow");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function isAutomatedRun() {
|
|
237
|
+
return isQueryParameterTrue("auto");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function resetMetrics() {
|
|
241
|
+
numTestPasses = 0;
|
|
242
|
+
numTestFailures = 0;
|
|
243
|
+
numCommandPasses = 0;
|
|
244
|
+
numCommandFailures = 0;
|
|
245
|
+
numCommandErrors = 0;
|
|
246
|
+
startTime = new Date().getTime();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function runSingleTest() {
|
|
250
|
+
runAllTests = false;
|
|
251
|
+
resetMetrics();
|
|
252
|
+
startTest();
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function startTest() {
|
|
256
|
+
removeLoadListener(getTestFrame(), startTest);
|
|
257
|
+
|
|
258
|
+
// Scroll to the top of the test frame
|
|
259
|
+
if (getTestFrame().contentWindow) {
|
|
260
|
+
getTestFrame().contentWindow.scrollTo(0,0);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
frames['testFrame'].scrollTo(0,0);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
inputTable = getIframeDocument(getTestFrame()).getElementsByTagName("table")[0];
|
|
267
|
+
inputTableRows = inputTable.rows;
|
|
268
|
+
currentCommandRow = 0;
|
|
269
|
+
testFailed = false;
|
|
270
|
+
storedVars = new Object();
|
|
271
|
+
|
|
272
|
+
clearRowColours();
|
|
273
|
+
|
|
274
|
+
testLoop = initialiseTestLoop();
|
|
275
|
+
testLoop.start();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function clearRowColours() {
|
|
279
|
+
for (var i = 0; i <= inputTableRows.length - 1; i++) {
|
|
280
|
+
inputTableRows[i].bgColor = "white";
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function startTestSuite() {
|
|
285
|
+
resetMetrics();
|
|
286
|
+
currentTestRow = 0;
|
|
287
|
+
runAllTests = true;
|
|
288
|
+
suiteFailed = false;
|
|
289
|
+
|
|
290
|
+
runNextTest();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function runNextTest() {
|
|
294
|
+
if (!runAllTests)
|
|
295
|
+
return;
|
|
296
|
+
|
|
297
|
+
suiteTable = getIframeDocument(getSuiteFrame()).getElementsByTagName("table")[0];
|
|
298
|
+
|
|
299
|
+
// Do not change the row color of the first row
|
|
300
|
+
if(currentTestRow > 0) {
|
|
301
|
+
// Make the previous row green or red depending if the test passed or failed
|
|
302
|
+
if(testFailed)
|
|
303
|
+
setCellColor(suiteTable.rows, currentTestRow, 0, failColor);
|
|
304
|
+
else
|
|
305
|
+
setCellColor(suiteTable.rows, currentTestRow, 0, passColor);
|
|
306
|
+
|
|
307
|
+
// Set the results from the previous test run
|
|
308
|
+
setResultsData(suiteTable, currentTestRow);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
currentTestRow++;
|
|
312
|
+
|
|
313
|
+
// If we are done with all of the tests, set the title bar as pass or fail
|
|
314
|
+
if(currentTestRow >= suiteTable.rows.length) {
|
|
315
|
+
if(suiteFailed)
|
|
316
|
+
setCellColor(suiteTable.rows, 0, 0, failColor);
|
|
317
|
+
else
|
|
318
|
+
setCellColor(suiteTable.rows, 0, 0, passColor);
|
|
319
|
+
|
|
320
|
+
// If this is an automated run (i.e., build script), then submit
|
|
321
|
+
// the test results by posting to a form
|
|
322
|
+
if (isAutomatedRun())
|
|
323
|
+
postTestResults(suiteFailed, suiteTable);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
else {
|
|
327
|
+
// Make the current row blue
|
|
328
|
+
setCellColor(suiteTable.rows, currentTestRow, 0, workingColor);
|
|
329
|
+
|
|
330
|
+
testLink = suiteTable.rows[currentTestRow].cells[0].getElementsByTagName("a")[0];
|
|
331
|
+
testLink.focus();
|
|
332
|
+
|
|
333
|
+
var testFrame = getTestFrame();
|
|
334
|
+
addLoadListener(testFrame, startTest);
|
|
335
|
+
|
|
336
|
+
selenium.browserbot.setIFrameLocation(testFrame, testLink.href);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function setCellColor(tableRows, row, col, colorStr) {
|
|
341
|
+
tableRows[row].cells[col].bgColor = colorStr;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Sets the results from a test into a hidden column on the suite table. So,
|
|
345
|
+
// for each tests, the second column is set to the HTML from the test table.
|
|
346
|
+
function setResultsData(suiteTable, row) {
|
|
347
|
+
// Create a text node of the test table
|
|
348
|
+
var resultTable = getIframeDocument(getTestFrame()).body.innerHTML;
|
|
349
|
+
if (!resultTable) return;
|
|
350
|
+
|
|
351
|
+
var tableNode = suiteTable.ownerDocument.createElement("div");
|
|
352
|
+
tableNode.innerHTML = resultTable;
|
|
353
|
+
|
|
354
|
+
var new_column = suiteTable.ownerDocument.createElement("td");
|
|
355
|
+
new_column.appendChild(tableNode);
|
|
356
|
+
|
|
357
|
+
// Set the column to be invisible
|
|
358
|
+
new_column.style.cssText = "display: none;";
|
|
359
|
+
|
|
360
|
+
// Add the invisible column
|
|
361
|
+
suiteTable.rows[row].appendChild(new_column);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Post the results to a servlet, CGI-script, etc. The URL of the
|
|
365
|
+
// results-handler defaults to "/postResults", but an alternative location
|
|
366
|
+
// can be specified by providing a "resultsUrl" query parameter.
|
|
367
|
+
//
|
|
368
|
+
// Parameters passed to the results-handler are:
|
|
369
|
+
// result: passed/failed depending on whether the suite passed or failed
|
|
370
|
+
// totalTime: the total running time in seconds for the suite.
|
|
371
|
+
//
|
|
372
|
+
// numTestPasses: the total number of tests which passed.
|
|
373
|
+
// numTestFailures: the total number of tests which failed.
|
|
374
|
+
//
|
|
375
|
+
// numCommandPasses: the total number of commands which passed.
|
|
376
|
+
// numCommandFailures: the total number of commands which failed.
|
|
377
|
+
// numCommandErrors: the total number of commands which errored.
|
|
378
|
+
//
|
|
379
|
+
// suite: the suite table, including the hidden column of test results
|
|
380
|
+
// testTable.1 to testTable.N: the individual test tables
|
|
381
|
+
//
|
|
382
|
+
function postTestResults(suiteFailed, suiteTable) {
|
|
383
|
+
|
|
384
|
+
form = document.createElement("form");
|
|
385
|
+
document.body.appendChild(form);
|
|
386
|
+
|
|
387
|
+
form.id = "resultsForm";
|
|
388
|
+
form.method="post";
|
|
389
|
+
form.target="myiframe";
|
|
390
|
+
|
|
391
|
+
var resultsUrl = getQueryParameter("resultsUrl");
|
|
392
|
+
if (!resultsUrl) {
|
|
393
|
+
resultsUrl = "./postResults";
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
var actionAndParameters = resultsUrl.split('?',2);
|
|
397
|
+
form.action = actionAndParameters[0];
|
|
398
|
+
var resultsUrlQueryString = actionAndParameters[1];
|
|
399
|
+
|
|
400
|
+
form.createHiddenField = function(name, value) {
|
|
401
|
+
input = document.createElement("input");
|
|
402
|
+
input.type = "hidden";
|
|
403
|
+
input.name = name;
|
|
404
|
+
input.value = value;
|
|
405
|
+
this.appendChild(input);
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
if (resultsUrlQueryString) {
|
|
409
|
+
var clauses = resultsUrlQueryString.split('&');
|
|
410
|
+
for (var i = 0; i < clauses.length; i++) {
|
|
411
|
+
var keyValuePair = clauses[i].split('=',2);
|
|
412
|
+
var key = unescape(keyValuePair[0]);
|
|
413
|
+
var value = unescape(keyValuePair[1]);
|
|
414
|
+
form.createHiddenField(key, value);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
form.createHiddenField("result", suiteFailed == true ? "failed" : "passed");
|
|
419
|
+
|
|
420
|
+
form.createHiddenField("totalTime", Math.floor((currentTime - startTime) / 1000));
|
|
421
|
+
form.createHiddenField("numTestPasses", numTestPasses);
|
|
422
|
+
form.createHiddenField("numTestFailures", numTestFailures);
|
|
423
|
+
form.createHiddenField("numCommandPasses", numCommandPasses);
|
|
424
|
+
form.createHiddenField("numCommandFailures", numCommandFailures);
|
|
425
|
+
form.createHiddenField("numCommandErrors", numCommandErrors);
|
|
426
|
+
|
|
427
|
+
// Create an input for each test table. The inputs are named
|
|
428
|
+
// testTable.1, testTable.2, etc.
|
|
429
|
+
for (rowNum = 1; rowNum < suiteTable.rows.length;rowNum++) {
|
|
430
|
+
// If there is a second column, then add a new input
|
|
431
|
+
if (suiteTable.rows[rowNum].cells.length > 1) {
|
|
432
|
+
var resultCell = suiteTable.rows[rowNum].cells[1];
|
|
433
|
+
form.createHiddenField("testTable." + rowNum, resultCell.innerHTML);
|
|
434
|
+
// remove the resultCell, so it's not included in the suite HTML
|
|
435
|
+
resultCell.parentNode.removeChild(resultCell);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Add HTML for the suite itself
|
|
440
|
+
form.createHiddenField("suite", suiteTable.parentNode.innerHTML);
|
|
441
|
+
|
|
442
|
+
form.submit();
|
|
443
|
+
document.body.removeChild(form);
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function printMetrics() {
|
|
448
|
+
setText(document.getElementById("commandPasses"), numCommandPasses);
|
|
449
|
+
setText(document.getElementById("commandFailures"), numCommandFailures);
|
|
450
|
+
setText(document.getElementById("commandErrors"), numCommandErrors);
|
|
451
|
+
setText(document.getElementById("testRuns"), numTestPasses + numTestFailures);
|
|
452
|
+
setText(document.getElementById("testFailures"), numTestFailures);
|
|
453
|
+
|
|
454
|
+
currentTime = new Date().getTime();
|
|
455
|
+
|
|
456
|
+
timeDiff = currentTime - startTime;
|
|
457
|
+
totalSecs = Math.floor(timeDiff / 1000);
|
|
458
|
+
|
|
459
|
+
minutes = Math.floor(totalSecs / 60);
|
|
460
|
+
seconds = totalSecs % 60;
|
|
461
|
+
|
|
462
|
+
setText(document.getElementById("elapsedTime"), pad(minutes)+":"+pad(seconds));
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Puts a leading 0 on num if it is less than 10
|
|
466
|
+
function pad (num) {
|
|
467
|
+
return (num > 9) ? num : "0" + num;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/*
|
|
471
|
+
* Register all of the built-in command handlers with the CommandHandlerFactory.
|
|
472
|
+
* TODO work out an easy way for people to register handlers without modifying the Selenium sources.
|
|
473
|
+
*/
|
|
474
|
+
function registerCommandHandlers() {
|
|
475
|
+
commandFactory = new CommandHandlerFactory();
|
|
476
|
+
commandFactory.registerAll(selenium);
|
|
477
|
+
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
function initialiseTestLoop() {
|
|
481
|
+
testLoop = new TestLoop(commandFactory);
|
|
482
|
+
|
|
483
|
+
testLoop.getCommandInterval = function() { return runInterval; };
|
|
484
|
+
testLoop.firstCommand = nextCommand;
|
|
485
|
+
testLoop.nextCommand = nextCommand;
|
|
486
|
+
testLoop.commandStarted = commandStarted;
|
|
487
|
+
testLoop.commandComplete = commandComplete;
|
|
488
|
+
testLoop.commandError = commandError;
|
|
489
|
+
testLoop.testComplete = testComplete;
|
|
490
|
+
testLoop.pause = function() {
|
|
491
|
+
document.getElementById('continueTest').disabled = false;
|
|
492
|
+
};
|
|
493
|
+
return testLoop;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function nextCommand() {
|
|
497
|
+
if (currentCommandRow >= inputTableRows.length - 1) {
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
currentCommandRow++;
|
|
502
|
+
|
|
503
|
+
var commandName = getCellText(currentCommandRow, 0);
|
|
504
|
+
var target = getCellText(currentCommandRow, 1);
|
|
505
|
+
var value = getCellText(currentCommandRow, 2);
|
|
506
|
+
|
|
507
|
+
var command = new SeleniumCommand(commandName, target, removeNbsp(value));
|
|
508
|
+
return command;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function removeNbsp(value)
|
|
512
|
+
{
|
|
513
|
+
return value.replace(/\240/g, "");
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function scrollIntoView(element) {
|
|
517
|
+
if (element.scrollIntoView) {
|
|
518
|
+
element.scrollIntoView(false);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
// TODO: work out how to scroll browsers that don't support
|
|
522
|
+
// scrollIntoView (like Konqueror)
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function commandStarted() {
|
|
526
|
+
inputTableRows[currentCommandRow].bgColor = workingColor;
|
|
527
|
+
scrollIntoView(inputTableRows[currentCommandRow].cells[0]);
|
|
528
|
+
printMetrics();
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
function commandComplete(result) {
|
|
532
|
+
if (result.failed) {
|
|
533
|
+
setRowFailed(result.failureMessage, FAILURE);
|
|
534
|
+
} else if (result.passed) {
|
|
535
|
+
setRowPassed();
|
|
536
|
+
} else {
|
|
537
|
+
setRowWhite();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
function commandError(errorMessage) {
|
|
542
|
+
setRowFailed(errorMessage, ERROR);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
function setRowWhite() {
|
|
546
|
+
inputTableRows[currentCommandRow].bgColor = "white";
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function setRowPassed() {
|
|
550
|
+
numCommandPasses += 1;
|
|
551
|
+
|
|
552
|
+
// Set cell background to green
|
|
553
|
+
inputTableRows[currentCommandRow].bgColor = passColor;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function setRowFailed(errorMsg, failureType) {
|
|
557
|
+
if (failureType == ERROR)
|
|
558
|
+
numCommandErrors += 1;
|
|
559
|
+
else if (failureType == FAILURE)
|
|
560
|
+
numCommandFailures += 1;
|
|
561
|
+
|
|
562
|
+
// Set cell background to red
|
|
563
|
+
inputTableRows[currentCommandRow].bgColor = failColor;
|
|
564
|
+
|
|
565
|
+
// Set error message
|
|
566
|
+
inputTableRows[currentCommandRow].cells[2].innerHTML = errorMsg;
|
|
567
|
+
inputTableRows[currentCommandRow].title = errorMsg;
|
|
568
|
+
testFailed = true;
|
|
569
|
+
suiteFailed = true;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
function testComplete() {
|
|
573
|
+
if(testFailed) {
|
|
574
|
+
inputTableRows[0].bgColor = failColor;
|
|
575
|
+
numTestFailures += 1;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
inputTableRows[0].bgColor = passColor;
|
|
579
|
+
numTestPasses += 1;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
printMetrics();
|
|
583
|
+
|
|
584
|
+
window.setTimeout("runNextTest()", 1);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
function getCellText(rowNumber, columnNumber) {
|
|
588
|
+
var cell = inputTableRows[rowNumber].cells[columnNumber];
|
|
589
|
+
if (! cell.cachedText) {
|
|
590
|
+
cell.cachedText = getText(cell);
|
|
591
|
+
}
|
|
592
|
+
return cell.cachedText;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
Selenium.prototype.doPause = function(waitTime) {
|
|
596
|
+
testLoop.pauseInterval = waitTime;
|
|
597
|
+
};
|