package com.algocrafts.forms; import com.algocrafts.locators.Locators; import com.algocrafts.selenium.Element; import com.algocrafts.selenium.Locator; import com.algocrafts.selenium.SearchScope; import org.openqa.selenium.By; import java.io.File; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; public interface FormControl<T extends SearchScope<T>> extends SearchScope<T> { /** * Check if the checkbox is checked by the given selector. * * @param selector selector * @return true if it is checked. */ @SuppressWarnings("unchecked") default boolean isChecked(Supplier<By> selector) { return new Checkbox<>((T) this, selector).isChecked(); } /** * Set checkbox to the given value. * * @param selector selector * @param value value */ @SuppressWarnings("unchecked") default void setCheckbox(Supplier<By> selector, boolean value) { new Checkbox<>((T) this, selector).setValue(value); } /** * Read the value of the radio by given option. * * @param selector selector * @return the value of selected radio. */ @SuppressWarnings("unchecked") default String getRadio(Supplier<By> selector) { return new RadioButton<>((T) this, selector).getValue(); } /** * Read the value of the radio by given option. * * @param selector selector * @return the value of selected radio. */ @SuppressWarnings("unchecked") default <T extends Enum> T getRadio(Supplier<By> selector, Function<String, T> converter) { return converter.apply(getRadio(selector)); } /** * Choose the radio by given option. * * @param selector selector * @param option option */ @SuppressWarnings("unchecked") default void setRadioButton(Supplier<By> selector, Object option) { new RadioButton<>((T) this, selector).setValue(option); } /** * Select the dropdown by given value. * * @param selector selector * @param value value */ @SuppressWarnings("unchecked") default void select(Supplier<By> selector, Object value) { new ForwardingSelect<>((T) this, Locators.<T>select(selector)).selectByVisibleText(value); } /** * Read value from an input field, convert to other type by converter. * * @param selector selector * @param converter the converter convert the string to other types, usually enum. * @return its value. */ @SuppressWarnings("unchecked") default <T1> T1 get(Supplier<By> selector, Locator<String, T1> converter) { return converter.locate(new Input<>((T) this, selector).getValue()); } /** * Read value from an input field. * * @param selector selector * @return its value. */ @SuppressWarnings("unchecked") default String get(Supplier<By> selector) { return new Input<>((T) this, selector).getValue(); } /** * Enter text into an input field. * * @param selector selector * @param value value */ @SuppressWarnings("unchecked") default void put(Supplier<By> selector, Object value) { new Input<>((T) this, selector).put(value); } @SuppressWarnings("unchecked") default void upload(Supplier<By> selector, Supplier<By> submit, File filePath) { new FileInput<>((T) this, selector).put(filePath); button(submit).click(); } /** * Autocomplete for text field and return the first found suggestion match the whole word. * * @param selector selector * @param value value * @param locator locator */ @SuppressWarnings("unchecked") default void autocomplete(Supplier<By> selector, Object value, Locator<T, Stream<Element>> locator) { new Input<>((T) this, selector).autocomplete(value, locator); } }