Очистить текст из текстового поля с помощью селена


150

У меня есть несколько тестов, в которых я проверяю, появляется ли правильное сообщение об ошибке, когда текст в определенных полях недействителен. Одной из проверок действительности является то, что определенный элемент textarea не пуст.

Если в этом текстовом поле уже есть текст, как я могу сказать селену, чтобы он очистил поле?

что-то типа:

driver.get_element_by_id('foo').clear_field()

3
Я нашел его driver.get_element_by_id ('foo'). Clear ()
Исаак

Ответы:


228
driver.find_element_by_id('foo').clear()

5
У меня это не работает в последней версии Selenium.
Статистика обучения на примере

3
youp chromedriver тоже ломается на этом. Ответ Fenix ​​работает везде
norbertas.gaulia

1
Это может быть проблема с конфликтующими версиями селена и хромодрайвера. Кажется маловероятным, что разработчики намеренно удалили эту функцию из chromedriver.
Исаак

7
На данный момент этот ответ не работает правильно в приложениях React, поскольку clear не приведет к срабатыванию функции React onChange. Таким образом, ваш ввод будет очищен, и тесты продолжатся, а состояние вашего компонента останется таким, как было раньше. реагируют вопрос , селен вопрос
ncrmro

1
@ncrmro 3 года спустя похоже, что это все еще не работает
Стивен

88

Ты можешь использовать

 webElement.clear();

Если этот элемент является элементом ввода текста, это очистит значение.

Обратите внимание, что события, запускаемые этим событием, могут быть не такими, как вы ожидали. В частности, мы не запускаем никаких событий клавиатуры или мыши. Если вы хотите, чтобы события клавиатуры запускались, подумайте об использовании чего-то вроде sendKeys(CharSequence). Например:

 webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop

или:

 webElement.sendKeys(Keys.CONTROL + "a");
 webElement.sendKeys(Keys.DELETE);

4
При использовании CTRL + 'a' учитывайте ситуацию, когда тест будет запущен на MacOS (другие сочетания клавиш). Кстати - хорошее предложение, решил мою проблему.
Outside_Box

1
Моя проблема решена с помощью "Keys.BACK_SPACE". Я просто захватываю поле теста поиска, запускаю .click (), а затем внутри цикла for запускаю код. он удаляет всех фрахтователей, ранее имевшихся в поле поиска. затем отправьте новое значение в поле поиска. Просто функция .clear () у меня не работала.
Noman_ibrahim

Помогло только webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopв моем странном случае
Chaki_Black

1
from selenium.webdriver.common.keys import Keysпросто чтобы облегчить жизнь новичкам.
Андре Юхай,

22

Я наткнулся на поле, где .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);

Для чего ;опять?
Стивен

1
@ surfer190 ;не требуется в python. Я добавил случайно. Хороший улов.
Jortega,


6

для Java

driver.findelement(By.id('foo').clear();

или

webElement.clear();

Если этот элемент является элементом ввода текста, это очистит значение.


5

Это общий синтаксис

driver.find_element_by_id('Locator value').clear();
driver.find_element_by_name('Locator value').clear();

3

По моему опыту, это оказалось наиболее эффективным

driver.find_element_by_css_selector('foo').send_keys(u'\ue009' + u'\ue003')

Мы отправляем Ctrl + Backspace, чтобы удалить все символы из ввода, вы также можете заменить backspace на delete.

РЕДАКТИРОВАТЬ: удалена зависимость ключей


1

С помощью простого вызова clear () в DOM появляется, что соответствующий компонент input / textarea все еще имеет свое старое значение, поэтому любые последующие изменения в этом компоненте (например, заполнение компонента новым значением) не будут обработаны вовремя.

Если вы посмотрите исходный код селена, вы обнаружите, что метод clear () задокументирован со следующим комментарием:

/ ** Если этот элемент является элементом ввода текста, это очистит значение. Не влияет на другие элементы. Элементы ввода текста - это элементы 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 (), который делал бы этот пост слишком длинным.

Надеюсь, это поможет вам в вашем путешествии с Selenium!


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') отлично работал с FireFox

  • u '\ ue003' - это BACK_SPACE для таких, как я - никогда не вспомню об этом)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.