Как очистить значение атрибута элемента с помощью селена webdriver

У меня есть элемент, который является кендо числовое текстовое поле. Он также имеет значения, я могу получить значение с помощью этого фрагмента кода driver.findElement(By.xpath("xpathlocator_value")).getAttribute("value"); но я хочу очистить значение и обновить этот элемент другим значением. Я пробовал оба способа, как с помощью clear() а такжеsendkeys(keys.control +"a",keys.delete)но это не работает.

HTML-код

    <form id="cashbookForm" class="form">
<div class="widget">
<table class="sTable taskWidget" width="100%" cellspacing="0" cellpadding="0">
<thead>
<tbody>
<tr data-bind="css:ExpenseID()==0?'non-printable':'',click:$root.CloseEditable">
<tr data-bind="css:ExpenseID()==0?'non-printable':''">
<td data-bind="text:Order">2</td>
<td>
<td>
<td>
<td>
<td>
<div style="float: right;">
<span class="k-widget k-numerictextbox noform required" style="text-align: right;">
<span class="k-numeric-wrap k-state-default">
<input class="k-formatted-value noform required k-input" type="text" style="text-align: right; display: inline;" tabindex="0" readonly="readonly">
<input class="noform required k-input" type="text" data-bind="kendoNumericTextBox: { value: Ca_TotalAmount, min: 0,format: '#.00'},uniqueName:true" style="text-align: right; display: none;" data-role="numerictextbox" role="spinbutton" tabindex="0" aria-valuemin="0" aria-valuenow="251.44" name="ko_unique_4">
<span class="k-select">
</span>
</span>
</div>
</td>
<td> </td>
<td class="removeOnPrint">
</tr>
<tr class="removeOnPrint">

Здесь числовое текстовое поле присутствует на

<input class="k-formatted-value noform required k-input" type="text" style="text-align: right; display: inline;" tabindex="0" readonly="readonly">

1 ответ

Вы можете использовать JavascriptExecutor для достижения цели.

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("window.document.getElementById("elementID").setAttribute('value', ' ')");

или же

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("window.document.getElementById("elementID").value = ' '");

Если вы хотите использовать xPath:

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.evaluate('xpath_locator', document, null, 9, null).singleNodeValue.value = ' '"); 

Это довольно старый вопрос, но я публикую здесь ответ на случай, если кто-то сочтет его полезным. Если вы используете селен и хотите удалить атрибут, но не очистить его, то вот что сработает:

public static void javascriptRemoveAttribute(WebElement element, WebDriver driver) {
    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].removeAttribute('required');", element);
}

Он похож на первый ответ, но ключевой является removeAttribute. ExecuteScript в основном ожидает массив элементов. Таким образом, вы передаете элемент, когда его нужно изменить, а затем удаляете его атрибут.

Используя эту функцию, вы можете изменить значение элемента:

public void clearElementValueByJS(WebElement element, WebDriver driver, Stringvalue) {
    try {
        JavascriptExecutor jse = (JavascriptExecutor) driver;
        jse.executeScript("arguments[0].value='" + value + "'", element);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

ИЛИ вы можете изменить внутреннее значение html элемента:

public void setInnerHTMLValue(WebElement element, String value) {
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    jse.executeScript("return arguments[0].innerText ='" + value + "'", element);
}
Другие вопросы по тегам