** (HTML Element) Gives a consistent means to get and set the value of *any* form field. constclass FormInput : Element { @NoDocnew makeFromFinder (ElemFinder elemFinder) : super(elemFinder){}new makeFromCss (Str cssSelector) : super(cssSelector){}** Returns the 'name' attribute. Str? name(){ getAttr("name")}** Gets and sets the 'value' attribute.** Returns 'null' if the value has not been set. Str? value { get {// special handling for radio buttons which have multiple elements with the same name attr elem := findElems.firstif(elem.name == "input" && elem.get("type", false) == "radio")return toRadioButton.checkedButton?.valueswitch(elementName){case"input":switch(getAttr("type")){case"checkbox":return toCheckBox.checked.toStrdefault:return getAttr("value")}case"textarea":return toTextBox.valuecase"select":return toSelectBox.selected?.value ?: nullcase"option":return toOption.valuedefault:return fail("Element is NOT a form input: ", false)}} set {// special handling for radio buttons which have multiple elements with the same name attr elem := findElems.firstif(elem?.name == "input" && elem?.get("type", false) == "radio")return toRadioButton.findByValue(it).checked = trueswitch(elementName){case"input":switch(getAttr("type")){case"checkbox": toCheckBox.checked = it.toBooldefault: setAttr("value", it)}case"textarea": toTextBox.value = itcase"select":if(toSelectBox.optionByValue(it) == null) fail("There is no <option> with the value: $it\n", false) toSelectBox.optionByValue(it).selected = truecase"option": toOption.value = itdefault: fail("Element is NOT a form input: ", false)}}}** Verify that the form field has the given value. Void verifyValueEq(Obj expected){ verifyEq(value, expected)}}