package com.codeborne.selenide.commands;
import com.codeborne.selenide.Command;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.ex.InvalidStateException;
import com.codeborne.selenide.impl.WebElementSource;
import org.openqa.selenium.WebElement;
import static com.codeborne.selenide.Configuration.fastSetValue;
import static com.codeborne.selenide.Selenide.executeJavaScript;
import static com.codeborne.selenide.impl.Events.events;
public class SetValue implements Command<WebElement> {
SelectOptionByValue selectOptionByValue = new SelectOptionByValue();
SelectRadio selectRadio = new SelectRadio();
@Override
public WebElement execute(SelenideElement proxy, WebElementSource locator, Object[] args) {
String text = (String) args[0];
WebElement element = locator.findAndAssertElementIsVisible();
if (Configuration.versatileSetValue
&& "select".equalsIgnoreCase(element.getTagName())) {
selectOptionByValue.execute(proxy, locator, args);
return proxy;
}
if (Configuration.versatileSetValue
&& "input".equalsIgnoreCase(element.getTagName()) && "radio".equals(element.getAttribute("type"))) {
selectRadio.execute(proxy, locator, args);
return proxy;
}
setValueForTextInput(element, text);
return proxy;
}
private void setValueForTextInput(WebElement element, String text) {
if (text == null || text.isEmpty()) {
element.clear();
} else if (fastSetValue) {
String error = setValueByJs(element, text);
if (error != null) throw new InvalidStateException(error);
events.fireEvent(element, "focus", "keydown", "keypress", "input", "keyup", "change");
} else {
element.clear();
element.sendKeys(text);
events.fireChangeEvent(element);
}
}
private String setValueByJs(WebElement element, String text) {
return executeJavaScript(
"return (function(webelement, text) {" +
"if (webelement.getAttribute('readonly') != undefined) return 'Cannot change value of readonly element';" +
"var maxlength = webelement.getAttribute('maxlength') == null ? -1 : parseInt(webelement.getAttribute('maxlength'));" +
"webelement.value = " +
"maxlength == -1 ? text " +
": text.length <= maxlength ? text " +
": text.substring(0, maxlength);" +
"return null;" +
"})(arguments[0], arguments[1]);"
, element, text);
}
}