// Released under the Canoo Webtest license. package com.canoo.webtest.steps.form; import com.canoo.webtest.engine.StepExecutionException; import com.canoo.webtest.engine.StepFailedException; import com.canoo.webtest.util.FormUtil; import com.canoo.webtest.util.HtmlConstants; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlFileInput; import com.gargoylesoftware.htmlunit.html.HtmlForm; import java.io.File; import java.io.IOException; /** * Supports the <input type=\"file\" \.\.\. />form field.<p> * * @author Marc Guillemot * @author Paul King * @webtest.step * category="Core" * name="setFileField" * alias="setfilefield" * description="Provides the ability to set an <input type=\"file\" ...> form field." */ public class SetFileField extends AbstractSetFieldStep { private File fFileName; private boolean fCheckFileExists = true; /** * Sets the name of the file to be uploaded. * * @param filename * @webtest.parameter * required="true" * description="The name of the file to upload." */ public void setFileName(final File filename) { fFileName = filename; } public File getFileName() { return fFileName; } /** * Indicates if WebTest should verify that the file to upload exists. * @param b the new value * @webtest.parameter * required="false" * default="true" * description="Indicates if the step should verify that the file to upload exists. * It is useful to deactivate this check, when you want to test how the application react * when a file input field is filled with a wrong value." */ public void setCheckFileExists(final boolean b) { fCheckFileExists = b; } public boolean isCheckFileExists() { return fCheckFileExists; } protected HtmlForm findForm() { return FormUtil.findFormForField(getContext(), getFormName(), HtmlConstants.INPUT, HtmlConstants.FILE, getName(), this); } protected boolean keepField(HtmlElement elt) { return HtmlConstants.FILE.equals(elt.getAttribute(HtmlConstants.TYPE)); } protected void setField(HtmlElement element) throws IOException { // useful only if element was searched by id or xpath String attributeValue = element.getAttribute(HtmlConstants.TYPE); if (!HtmlConstants.FILE.equals(attributeValue)) { throw new StepFailedException("HTML input with id='" + getHtmlId() + "' is of type '" + attributeValue + "' but should be '" + HtmlConstants.FILE + "'", this); } final HtmlFileInput fileInput = (HtmlFileInput) element; fileInput.setValueAttribute(getFileName().getAbsolutePath()); } protected void verifyParameters() { super.verifyParameters(); nullParamCheck(getFileName(), "fileName"); if (isCheckFileExists() && !getFileName().exists()) { throw new StepExecutionException("File doesn't exist: " + getFileName().getAbsolutePath(), this); } } }