01: // Released under the Canoo Webtest license.
02: package com.canoo.webtest.steps.form;
03:
04: import com.canoo.webtest.engine.StepExecutionException;
05: import com.canoo.webtest.engine.StepFailedException;
06: import com.canoo.webtest.util.FormUtil;
07: import com.canoo.webtest.util.HtmlConstants;
08: import com.gargoylesoftware.htmlunit.html.HtmlElement;
09: import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
10: import com.gargoylesoftware.htmlunit.html.HtmlForm;
11:
12: import java.io.File;
13: import java.io.IOException;
14:
15: /**
16: * Supports the <input type=\"file\" \.\.\. />form field.<p>
17: *
18: * @author Marc Guillemot
19: * @author Paul King
20: * @webtest.step
21: * category="Core"
22: * name="setFileField"
23: * alias="setfilefield"
24: * description="Provides the ability to set an <input type=\"file\" ...> form field."
25: */
26: public class SetFileField extends AbstractSetFieldStep {
27: private File fFileName;
28: private boolean fCheckFileExists = true;
29:
30: /**
31: * Sets the name of the file to be uploaded.
32: *
33: * @param filename
34: * @webtest.parameter
35: * required="true"
36: * description="The name of the file to upload."
37: */
38: public void setFileName(final File filename) {
39: fFileName = filename;
40: }
41:
42: public File getFileName() {
43: return fFileName;
44: }
45:
46: /**
47: * Indicates if WebTest should verify that the file to upload exists.
48: * @param b the new value
49: * @webtest.parameter
50: * required="false"
51: * default="true"
52: * description="Indicates if the step should verify that the file to upload exists.
53: * It is useful to deactivate this check, when you want to test how the application react
54: * when a file input field is filled with a wrong value."
55: */
56: public void setCheckFileExists(final boolean b) {
57: fCheckFileExists = b;
58: }
59:
60: public boolean isCheckFileExists() {
61: return fCheckFileExists;
62: }
63:
64: protected HtmlForm findForm() {
65: return FormUtil.findFormForField(getContext(), getFormName(),
66: HtmlConstants.INPUT, HtmlConstants.FILE, getName(),
67: this );
68: }
69:
70: protected boolean keepField(HtmlElement elt) {
71: return HtmlConstants.FILE.equals(elt
72: .getAttributeValue(HtmlConstants.TYPE));
73: }
74:
75: protected void setField(HtmlElement element) throws IOException {
76: // useful only if element was searched by id or xpath
77: String attributeValue = element
78: .getAttributeValue(HtmlConstants.TYPE);
79: if (!HtmlConstants.FILE.equals(attributeValue)) {
80: throw new StepFailedException("HTML input with id='"
81: + getHtmlId() + "' is of type '" + attributeValue
82: + "' but should be '" + HtmlConstants.FILE + "'",
83: this );
84: }
85: final HtmlFileInput fileInput = (HtmlFileInput) element;
86: fileInput.setValueAttribute(getFileName().getAbsolutePath());
87: }
88:
89: protected void verifyParameters() {
90: super .verifyParameters();
91: nullParamCheck(getFileName(), "fileName");
92: if (isCheckFileExists() && !getFileName().exists()) {
93: throw new StepExecutionException("File doesn't exist: "
94: + getFileName().getAbsolutePath(), this);
95: }
96: }
97: }
|