// Copyright � 2002-2005 Canoo Engineering AG, Switzerland. package com.canoo.webtest.extension; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.canoo.webtest.engine.Context; import com.canoo.webtest.steps.form.AbstractSetFieldStep; import com.canoo.webtest.steps.store.BaseStoreStep; import com.canoo.webtest.util.FormUtil; import com.canoo.webtest.util.HtmlConstants; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * StoreInputFieldAttribute * * @author Vikram Shitole * @author Paul King * @webtest.step * category="Extension" * name="storeInputFieldAttribute" * description="Retrieves the attribute value of a selected input field. Can be used to check whether an input field is enabled." */ public class StoreInputFieldAttribute extends BaseStoreStep { private String fFieldName; private String fFieldValue; private String fAttributeName; private String fFieldIndex; private String fFormName; /** * Locate all applicable html input components, check their number (size == 1) and * store the value of the attribute. * * @throws com.canoo.webtest.engine.StepFailedException * if no applicable button was found */ public void doExecute() throws Exception { final List htmlInputs = findHtmlElements(getContext()); final HtmlInput htmlInputElmt = (HtmlInput) AbstractSetFieldStep.selectField(htmlInputs, fFieldIndex, this); String retval = htmlInputElmt.getAttribute(fAttributeName); if (retval == HtmlElement.ATTRIBUTE_NOT_DEFINED) { retval = "false"; } else if (retval == HtmlElement.ATTRIBUTE_VALUE_EMPTY || retval.length() == 0) { retval = "true"; } storeProperty(retval); } /** * Locate all input fields matching fFieldName and optionally fFieldValue * if specified. * * @param context The current test context * @return A list with all applicable input fields */ private List findHtmlElements(final Context context) throws Exception { List fields; if (fFormName != null) { HtmlForm form = FormUtil.findFormForField(context, fFormName, HtmlConstants.INPUT, null, fFieldName, this); fields = new ArrayList(form.getInputsByName(fFieldName)); } else { fields = new ArrayList(((HtmlPage) context.getCurrentResponse()).getDocumentElement().getElementsByAttribute(HtmlConstants.INPUT, HtmlConstants.NAME, fFieldName)); } // remove those not having the right value if (fFieldValue != null) { for (Iterator iter = fields.iterator(); iter.hasNext();) { final HtmlInput input = (HtmlInput) iter.next(); if (!fFieldValue.equals(input.getValueAttribute())) { iter.remove(); } } } return fields; } /** * Sets the name of the input field of interest. * * @param name Sets the name value. * @webtest.parameter * required="yes" * description="The name of the input field of interest." */ public void setName(final String name) { fFieldName = name; } public String getName() { return fFieldName; } /** * Sets the input field value to match against if there are multiple input fields with the same name. * * @param value Sets the value of the input field of interest. * @webtest.parameter * required="no" * description="The value of the input field of interest." */ public void setValue(final String value) { fFieldValue = value; } public String getValue() { return fFieldValue; } /** * Sets the name of the attribute of interest.<p> * * @param name Sets the name of the attribute. * @webtest.parameter * required="yes" * description="The name of the attribute of interest, e.g. \"disabled\" or \"checked\"." */ public void setAttributeName(final String name) { fAttributeName = name; } public String getAttributeName() { return fAttributeName; } /** * Sets the index of the attribute of interest.<p> * * @param index Selects the attribute of interest if more than one match other criteria (first index is 0). * @webtest.parameter * required="no" * description="The index (starting at 0) of the attribute of interest." */ public void setFieldIndex(final String index) { fFieldIndex = index; } public String getFieldIndex() { return fFieldIndex; } /** * Sets the Name of the Property.<p> * @param name The Property Name * @webtest.parameter * required="no" * description="Deprecated. Same as property." */ public void setPropertyName(final String name) { setProperty(name); } /** * Set the form name.<p> * * @param formName * @webtest.parameter required="no" * default="the last form selected using 'selectForm', otherwise searches all forms" * description="The name of the form containing the field of interest." */ public void setFormName(String formName) { fFormName = formName; } public String getFormName() { return fFormName; } /** * Verifies the parameters.<p> */ protected void verifyParameters() { super.verifyParameters(); nullParamCheck(getProperty(), "property"); nullParamCheck(getName(), "name"); nullParamCheck(getAttributeName(), "attributeName"); optionalIntegerParamCheck(getFieldIndex(), "fieldIndex", false); nullResponseCheck(); } }