Очистіть текст із текстової області із селеном


142

У мене є кілька тестів, де я перевіряю, чи з’являється відповідне повідомлення про помилку, коли текст у певних полях недійсний. Однією з перевірок на достовірність є те, що певний елемент textarea не порожній.

Якщо в цій текстовій області вже є текст, як я можу сказати селену, щоб очистити поле?

щось на зразок:

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

1
Я знайшов це driver.get_element_by_id ('foo'). Clear ()
Ісаак

Відповіді:


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

4
Це не працює для мене в останній версії Selenium.
Статистика навчання за прикладом

3
youp kromedriver також ламається на цьому. Відповідь Fenix ​​працює скрізь
norbertas.gaulia

1
Це може бути проблемою із суперечливими версіями селену та хромедрівера. Здається, малоймовірно, що розробники навмисно видалили б цю функціональність із хромодрука.
Ісаак

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

1
@ncrmro 3 роки потому виглядає, що це все ще не працює
Stephen

81

Можна використовувати

 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 (інші комбінації клавіш). Btw - добра пропозиція, вирішила мою проблему.
Outside_Box

1
Мою проблему вирішив "Ключі.BACK_SPACE". Я просто захоплюю тестове поле пошуку, запускаю .click (), потім всередині циклу for для запуску коду. він видаляє всі фрахтувальники, які раніше шукали в полі пошуку. потім надішліть нове значення в поле пошуку. Просто функція .clear () не працювала для мене.
Номан_ібрагім

Допомагав лише webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopв моєму дивному випадку
Chaki_Black

17

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


4

для java

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

або

webElement.clear();

Якщо цей елемент є елементом введення тексту, це очистить значення.


3

Це загальний синтаксис

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

1

При простому виклику clear () в DOM виявляється, що відповідний компонент вводу / textarea все ще має своє старе значення, тому будь-які наступні зміни цього компонента (наприклад, заповнення компонента новим значенням) не будуть оброблені в часі.

Якщо ви подивитесь на вихідний код селену, ви побачите, що метод clear () задокументований таким коментарем:

/ ** Якщо цей елемент є елементом введення тексту, це очистить значення. Не впливає на інші елементи. Елементами введення тексту є елементи INPUT та TEXTAREA. Зауважте, що події, розпочаті цією подією, можуть бути не такими, як ви очікували. Зокрема, ми не запускаємо жодних подій на клавіатурі чи миші. Якщо ви хочете переконатись, що запускаються події на клавіатурі, спробуйте скористатися {@link #sendKeys (CharSequence ...)} клавішею із зворотним простором. Щоб переконатися, що ви отримаєте подію зміни, подумайте про наступний дзвінок на {@link #sendKeys (CharSequence ...)} клавішею вкладки. * /

Отож, використовуючи цей корисний підказку, щоб очистити введення / textarea (компонент, який вже має значення) І призначити йому нове значення, ви отримаєте такий код, як наступний:

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 ()", який зробить цей пост занадто довгим.

Сподіваємось, це допоможе вам у вашій подорожі із Селеном!


1

На мій досвід, це виявилося найбільш ефективним

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

Ми надсилаємо Ctrl + Backspace для видалення всіх символів з вводу, ви також можете замінити резервну область видаленням.

EDIT: видалено залежність ключів


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.