Как очистить значение атрибута элемента с помощью селена 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);
}