// Copyright � 2002-2005 Canoo Engineering AG, Switzerland. package com.canoo.webtest.steps.form; import java.io.IOException; import java.util.List; import org.apache.log4j.Logger; import com.canoo.webtest.engine.StepFailedException; import com.canoo.webtest.util.FormUtil; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput; import com.gargoylesoftware.htmlunit.html.HtmlTextArea; import com.gargoylesoftware.htmlunit.html.HtmlTextInput; /** * Sets the value of a text field (inputs of type 'text' and 'password' as well as textareas). * * @author Marc Guillemot * @author Paul King * @webtest.step * category="Core" * name="setInputField" * alias="new_setinputfield,setinputfield" * description="Provides the ability to update text-oriented input fields in <key>HTML</key> forms (supports input fields of type <em>text</em> and <em>password</em> as well as <em>textareas</em>)." */ public class SetInputField extends AbstractSetNamedFieldStep { private static final Logger LOG = Logger.getLogger(SetInputField.class); protected HtmlForm findForm() { return FormUtil.findFormForTextField(getContext(), getFormName(), getName(), this); } /** * Finds all text and password inputs or textareas with the given name in the form. * * @param form The form to search * @return The list of fields with the given name */ protected List findFields(final HtmlForm form) { final List fields = super.findFields(form); List textAreaFields = form.getTextAreasByName(getName()); LOG.debug("Found " + textAreaFields.size() + " textarea field(s)"); fields.addAll(textAreaFields); return fields; } protected boolean keepField(HtmlElement elt) { return (elt instanceof HtmlTextInput) || (elt instanceof HtmlPasswordInput) || (elt instanceof HtmlTextArea); } protected void setField(final HtmlElement elt) throws IOException { elt.focus(); // "stores" value at focus to know if onchange should be triggered when focus lost if (elt instanceof HtmlInput) { // HU doesn't write "on" previous text // first remove existing text ((HtmlInput) elt).setAttribute("value", ""); // and not setValueAttribute() to avoid triggering onchange elt.type(getValue()); } else if (elt instanceof HtmlTextArea) { // TODO: use type(...) once HU stops firing onchange after each typed letter ((HtmlTextArea) elt).setText(getValue()); } else { throw new StepFailedException("Found " + elt.getTagName() + " when looking for input", this); } ((HtmlPage) elt.getPage()).setFocusedElement(null); LOG.debug("Set text for " + elt + " to value " + getValue()); } protected void verifyParameters() { super.verifyParameters(); paramCheck(isValueNull(), DEFAULT_VALUE_NULL_MESSAGE); } }