001: // Copyright © 2002-2005 Canoo Engineering AG, Switzerland.
002: package com.canoo.webtest.steps.request;
003:
004: import java.net.URL;
005: import java.util.ArrayList;
006: import java.util.Collections;
007: import java.util.List;
008:
009: import com.canoo.webtest.engine.NameValuePair;
010: import com.canoo.webtest.engine.StepExecutionException;
011: import com.canoo.webtest.engine.StepFailedException;
012: import com.canoo.webtest.self.TestBlock;
013: import com.canoo.webtest.self.ThrowAssert;
014: import com.canoo.webtest.util.HtmlConstants;
015: import com.gargoylesoftware.htmlunit.AlertHandler;
016: import com.gargoylesoftware.htmlunit.CollectingAlertHandler;
017: import com.gargoylesoftware.htmlunit.WebClient;
018: import com.gargoylesoftware.htmlunit.html.HtmlForm;
019: import com.gargoylesoftware.htmlunit.html.HtmlInput;
020: import com.gargoylesoftware.htmlunit.html.HtmlPage;
021:
022: /**
023: * Unit tests for {@link ClickButton}.
024: * @author unknown
025: * @author Marc Guillemot
026: * @author Paul King
027: * @author Denis N. Antonioli
028: */
029: public class ClickButtonTest extends AbstractTargetActionTest {
030:
031: public void testValidEmptyParameters() {
032: final ClickButton step = new ClickButton();
033: step.setName("");
034: assertVerificationOk("empty name", step);
035: step.setName(null);
036:
037: step.setLabel("");
038: assertVerificationOk("empty label", step);
039: step.setLabel(null);
040:
041: step.setHtmlId("");
042: assertVerificationOk("empty htmlid", step);
043: }
044:
045: public void testVerifyParameterValid() {
046: ClickButton step = new ClickButton();
047: step.setX("1");
048: step.setY("2");
049: step.setLabel("myLabel");
050: assertVerificationOk("1) X and Y and label", step);
051:
052: step = new ClickButton();
053: step.setX("1");
054: step.setY("2");
055: step.setName("myName");
056: assertVerificationOk("2) X and Y and name", step);
057:
058: step = new ClickButton();
059: step.setX("-1");
060: step.setY("-2");
061: step.setName("myName");
062: assertVerificationOk("2) negative X and Y and name", step);
063:
064: step = new ClickButton();
065: step.setX("1");
066: step.setY("2");
067: step.setLabel("myLabel");
068: step.setName("myName");
069: assertVerificationOk("3) X and Y and name and label", step);
070:
071: step = new ClickButton();
072: step.setName("myName");
073: step.setLabel("myLabel");
074: assertVerificationOk("4) name and label", step);
075:
076: step = new ClickButton();
077: step.setHtmlId("myName");
078: assertVerificationOk("5) htmlId", step);
079: }
080:
081: public void testVerifyParameterInvalid() {
082: ClickButton step = new ClickButton();
083:
084: step.setX("1");
085: step.setY("2");
086: assertVerificationFails("1) either name or label must be set",
087: step);
088:
089: step = new ClickButton();
090: step.setName("myName");
091: step.setX("1");
092: assertVerificationFails("2) if X is set Y must be set as well",
093: step);
094:
095: step = new ClickButton();
096: step.setName("myName");
097: step.setY("2");
098: assertVerificationFails("3) if Y is set X must be set as well",
099: step);
100:
101: step = new ClickButton();
102: step.setName("myName");
103: step.setFieldIndex("-15");
104: assertVerificationFails("4) index should be >= 0", step);
105: }
106:
107: private void assertVerificationFails(final String message,
108: final ClickButton step) {
109: ThrowAssert.assertThrows(message, StepExecutionException.class,
110: new TestBlock() {
111: public void call() throws Exception {
112: step.verifyParameters();
113: }
114: });
115: }
116:
117: private void assertVerificationOk(final String message,
118: final ClickButton step) {
119: configureStep(step);
120: ThrowAssert.assertPasses(message, new TestBlock() {
121: public void call() throws Exception {
122: step.verifyParameters();
123: }
124: });
125: }
126:
127: public void testErrorWithXmlPage() throws Exception {
128: final ClickButton step = new ClickButton();
129: configureStep(step);
130: step.setName("foo");
131: assertErrorOnExecuteIfCurrentPageIsXml(step);
132: }
133:
134: public void testFindButton() throws Exception {
135: final String htmlContent = "<html><head><title>foo</title></head>"
136: + "<body>"
137: + "<form id='formId' name='testForm'>"
138: + "<input type='submit' name='inputSubmit'>"
139: + "<div><input type='submit' name='inputSubmit2'></div>"
140: + "<input type='SUBMIT' name='inputSubmitUpperCase'>"
141: + "<input type='image' name='inputImage'>"
142: + "<input type='image' name='inputImage2' src='myImage.png' alt='my small image'>"
143: + "<input type='button' name='inputButton'>"
144: + "<button type='submit' name='buttonSubmit'>"
145: + "<button type='submit' id='buttonBlabla'>bla bla</button>"
146: + "<button id='buttonBlablaBold'>bla <b>bla Bold</b></button>"
147: + "<div><button type='submit' name='buttonSubmit2'></div>"
148: + "<input type='button' name='toto' id='myButtonWithId'>"
149: + "<input type='button' name='toto2' value='toto2_1'>"
150: + "<input type='button' name='toto2' value='toto2_2'>"
151: + "<input type='reset' name='resetButton'>"
152: + "</form>"
153: + "No access</body></html>";
154:
155: getContext().setDefaultResponse(htmlContent);
156:
157: final HtmlPage page = (HtmlPage) getContext().getWebClient()
158: .getPage(new URL("http://myHost"));
159: final HtmlForm form = page.getFormByName("testForm");
160: final HtmlInput inputButtonToto2 = (HtmlInput) form
161: .getInputsByName("toto2").get(1);
162: final HtmlInput inputButtonReset = form
163: .getInputByName("resetButton");
164: final HtmlInput inputSubmitUpperCase = form
165: .getInputByName("inputSubmitUpperCase");
166:
167: final ClickButton step = new ClickButton();
168: configureStep(step);
169:
170: step.setName("notExisting");
171: assertNull(step.findButton(form));
172:
173: step.setName("inputSubmit");
174: assertEquals(HtmlConstants.SUBMIT, step.findButton(form)
175: .getAttributeValue(HtmlConstants.TYPE));
176:
177: step.setName("inputSubmit2");
178: assertEquals(HtmlConstants.SUBMIT, step.findButton(form)
179: .getAttributeValue(HtmlConstants.TYPE));
180:
181: step.setName("inputSubmitUpperCase");
182: assertSame(inputSubmitUpperCase, step.findButton(form));
183:
184: step.setName("inputImage");
185: assertEquals(HtmlConstants.IMAGE, step.findButton(form)
186: .getAttributeValue(HtmlConstants.TYPE));
187:
188: step.setName("inputButton");
189: assertEquals(HtmlConstants.BUTTON, step.findButton(form)
190: .getAttributeValue(HtmlConstants.TYPE));
191:
192: step.setName("buttonSubmit");
193: assertEquals(HtmlConstants.SUBMIT, step.findButton(form)
194: .getAttributeValue(HtmlConstants.TYPE));
195:
196: step.setName("buttonSubmit2");
197: assertEquals(HtmlConstants.SUBMIT, step.findButton(form)
198: .getAttributeValue(HtmlConstants.TYPE));
199:
200: step.setName("resetButton");
201: assertSame(inputButtonReset, step.findButton(form));
202: step.setName(null);
203:
204: // label
205: step.setLabel("bla bla");
206: assertSame(page.getHtmlElementById("buttonBlabla"), step
207: .findButton(form));
208:
209: step.setLabel("bla bla Bold");
210: assertSame(page.getHtmlElementById("buttonBlablaBold"), step
211: .findButton(form));
212:
213: step.setLabel("my small image");
214: assertSame(form.getInputByName("inputImage2"), step
215: .findButton(form));
216:
217: step.setLabel(null);
218:
219: // htmlid
220: step.setHtmlId("myButtonWithId");
221: assertEquals("toto", step.findClickableElementById(page)
222: .getAttributeValue(HtmlConstants.NAME));
223:
224: step.setName("toto2");
225: step.setHtmlId(null);
226: assertEquals("toto2_1", step.findButton(form)
227: .getAttributeValue(HtmlConstants.VALUE));
228: step.setFieldIndex("1");
229: assertSame(inputButtonToto2, step.findButton(form));
230:
231: step.setHtmlId("nonExistingId");
232: assertNull(step.findClickableElementById(page));
233:
234: step.setHtmlId("formId");
235: String msg = ThrowAssert.assertThrows(
236: StepFailedException.class, new TestBlock() {
237: public void call() throws Exception {
238: step.findClickableElementById(page);
239: }
240: });
241: assertTrue(msg.indexOf("not a button") != -1);
242:
243: step.setName("wrongname");
244: step.setHtmlId("myButtonWithId");
245: assertNull(step.findClickableElementById(page));
246:
247: step.setName(null);
248: step.setHtmlId(null);
249: step.setXpath("//input[@name='toto2'][2]");
250: assertSame(inputButtonToto2, step.findClickableElement(page));
251: }
252:
253: // <clickButton xpath="//input[@name='toto2'][2]" />
254: public void testExecuteXPath() throws Exception {
255: final String htmlContent = "<html><head><title>foo</title></head>"
256: + "<body>"
257: + "<form id='formId' name='testForm'>"
258: + "<input type='button' name='toto2' value='toto2_1'>"
259: + "<input type='button' name='toto2' value='toto2_2' onclick='alert(\"foo\")'>"
260: + "</form>" + "No access</body></html>";
261:
262: final ClickButton step = new ClickButton();
263: configureStep(step);
264: step.setXpath("//input[@name='toto2'][2]");
265: final HtmlPage page = getDummyPage(htmlContent);
266: final WebClient client = page.getWebClient();
267: final List collectedAlerts = new ArrayList();
268: final AlertHandler alertHandler = new CollectingAlertHandler(
269: collectedAlerts);
270: client.setAlertHandler(alertHandler);
271:
272: step.execute();
273:
274: final List expectedAlerts = Collections.singletonList("foo");
275: assertEquals(expectedAlerts, collectedAlerts);
276: }
277:
278: /**
279: * Test that the exception contains information on the available buttons
280: */
281: public void testExceptionDetails() throws Exception {
282: final String htmlContent = "<html><head><title>foo</title></head>"
283: + "<body>"
284: + "<form id='formId' name='testForm'>"
285: + "<input type='button' name='toto2' value='toto2_1'>"
286: + "<input type='submit' name='toto2' value='Submit me!'>"
287: + "</form>" + "No access</body></html>";
288:
289: final ClickButton step = new ClickButton();
290: configureStep(step);
291: step.setLabel("not existing");
292: getDummyPage(htmlContent);
293:
294: final StepFailedException e = (StepFailedException) ThrowAssert
295: .assertThrows("", StepFailedException.class,
296: getExecuteStepTestBlock(step));
297: final NameValuePair detail = (NameValuePair) e.getDetails()
298: .get(0);
299: assertEquals("available buttons", detail.getName());
300: assertTrue(detail.getValue().indexOf("Submit me!") != -1);
301: }
302:
303: public void testNestedText() throws Exception {
304: final ClickButton step = (ClickButton) configureStep(new ClickButton());
305: testNestedTextEquivalent(step, "label");
306: }
307: }
|