Ответ 1
driver.find_element_by_id('foo').clear()
У меня есть некоторые тесты, где я проверяю, что появляется правильное сообщение об ошибке, когда текст в определенных полях недействителен. Одна проверка на достоверность состоит в том, что определенный элемент textarea не пуст.
Если в этом текстовом поле уже есть текст, как я могу сказать селену, чтобы очистить поле?
что-то вроде:
driver.get_element_by_id('foo').clear_field()
driver.find_element_by_id('foo').clear()
Ты можешь использовать
webElement.clear();
Если этот элемент является элементом ввода текста, это очистит значение.
Обратите внимание, что события, вызванные этим событием, могут быть не такими, как вы ожидаете. В частности, мы не запускаем события клавиатуры или мыши. Если вы хотите, чтобы события клавиатуры sendKeys(CharSequence)
, рассмотрите возможность использования чего-то вроде sendKeys(CharSequence)
. Например:
webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop
или же:
webElement.sendKeys(Keys.CONTROL + "a");
webElement.sendKeys(Keys.DELETE);
В самой последней версии Selenium используйте:
driver.find_element_by_id('foo').clear()
Это общий синтаксис
driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();
для Java
driver.findelement(By.id('foo').clear();
или же
webElement.clear();
Если этот элемент является элементом ввода текста, это очистит значение.
С помощью простого вызова clear() в DOM появляется, что соответствующий компонент input/textarea по-прежнему имеет старое значение, поэтому любые последующие изменения в этом компоненте (например, заполнение компонента новым значением) не будут обработаны во времени.
Если вы посмотрите на исходный код селена, то обнаружите, что clear() -method задокументирована следующим комментарием:
/** Если этот элемент является элементом ввода текста, это очистит значение. Не влияет на другие элементы. Элементами ввода текста являются элементы INPUT и TEXTAREA. Обратите внимание, что события, вызванные этим событием, могут быть не такими, как вы ожидаете. В частности, мы не запускаем события клавиатуры или мыши. Если вы хотите, чтобы события клавиатуры запускались, попробуйте использовать что-то вроде {@link #sendKeys (CharSequence...)} с клавишей возврата. Чтобы убедиться, что вы получили событие изменения, рассмотрите возможность вызова {@link #sendKeys (CharSequence...)} с помощью клавиши табуляции. */
Поэтому, используя этот полезный совет для очистки ввода/текстовой области (компонента, который уже имеет значение) И присвоения ему нового значения, вы получите некоторый код, подобный следующему:
public void waitAndClearFollowedByKeys(By by, CharSequence keys) {
LOG.debug("clearing element");
wait(by, true).clear();
sendKeys(by, Keys.BACK_SPACE.toString() + keys);
}
public void sendKeys(By by, CharSequence keysToSend) {
WebElement webElement = wait(by, true);
LOG.info("sending keys '{}' to {}", escapeProperly(keysToSend), by);
webElement.sendKeys(keysToSend);
LOG.info("keys sent");
}
private String escapeProperly(CharSequence keysToSend) {
String result = "" + keysToSend;
result = result.replace(Keys.TAB, "\\t");
result = result.replace(Keys.ENTER, "\\n");
result = result.replace(Keys.RETURN, "\\r");
return result;
}
Извините за этот код Java, а не Python. Кроме того, мне пришлось пропустить дополнительный метод waitUntilPageIsReady() -method, который сделал бы этот пост слишком длинным.
Надеюсь, это поможет вам в вашем путешествии с Selenium!
Я столкнулся с полем, где .clear() не работает. Использование комбинации первых двух ответов сработало для этой области.
from selenium.webdriver.common.keys import Keys
#...your code (I was using python 3)
driver.find_element_by_id('foo').send_keys(Keys.CONTROL + "a");
driver.find_element_by_id('foo').send_keys(Keys.DELETE);