Hapus teks dari textarea dengan selenium


142

Saya mendapat beberapa tes di mana saya memeriksa bahwa pesan kesalahan yang tepat muncul ketika teks di bidang tertentu tidak valid. Satu pemeriksaan untuk validitas adalah bahwa elemen textarea tertentu tidak kosong.

Jika teks ini sudah memiliki teks di dalamnya, bagaimana saya bisa memberitahu selenium untuk menghapus bidang?

sesuatu seperti:

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

1
Saya menemukannya driver.get_element_by_id ('foo'). Clear ()
Isaac

Jawaban:


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

4
Ini tidak berfungsi untuk saya dalam versi Selenium terbaru.
Belajar statistik dengan contoh

3
youp chromedriver juga rusak yang satu ini. Jawaban Fenix ​​bekerja di mana
norbertas.gaulia

1
Mungkin ada masalah dengan versi selenium dan kromedriver yang saling bertentangan. Tampaknya tidak mungkin para devs akan menghapus fungsi ini dari chromedriver dengan sengaja.
Isaac

7
Saat ini jawaban ini tidak berfungsi dengan benar di Bereaksi aplikasi karena yang jelas tidak akan menyebabkan fungsi Bereaksi onChange menyala. Dengan demikian input Anda akan dihapus dan tes akan terus berjalan dan status komponen Anda akan tetap seperti sebelumnya. masalah reaksi , masalah selenium
ncrmro

1
@ncrmro 3 tahun kemudian sepertinya ini masih tidak berfungsi
stephen

81

Kamu bisa memakai

 webElement.clear();

Jika elemen ini adalah elemen entri teks, ini akan menghapus nilainya.

Perhatikan bahwa acara yang dipecat oleh acara ini mungkin tidak seperti yang Anda harapkan. Secara khusus, kami tidak memecat acara keyboard atau mouse. Jika Anda ingin memastikan acara keyboard diaktifkan, pertimbangkan untuk menggunakan sesuatu seperti sendKeys(CharSequence). Misalnya:

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

atau:

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

4
Saat menggunakan CTRL + 'a' pertimbangkan situasi saat pengujian akan berjalan pada MacOS (pintasan keyboard lainnya). Btw-saran bagus, memecahkan masalah saya.
Outside_Box

1
Masalah saya terpecahkan oleh "Keys.BACK_SPACE". Saya hanya menangkap bidang uji pencarian, jalankan .click () kemudian di dalam untuk loop jalankan kode. itu menghapus semua penyewa bidang pencarian sebelumnya. lalu kirim nilai baru ke bidang pencarian. Hanya fungsi .clear () tidak berfungsi untuk saya.
Noman_ibrahim

Hanya membantu webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopdalam kasus aneh saya
Chaki_Black

17

Saya berlari ke bidang di mana .clear () tidak berfungsi. Menggunakan kombinasi dari dua jawaban pertama berhasil untuk bidang ini.

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);

Untuk apa ;lagi?
stephen

1
@ surfer190 ;tidak diperlukan dalam python. Saya menambahkannya secara tidak sengaja. Tangkapan yang bagus.
Jortega


4

untuk java

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

atau

webElement.clear();

Jika elemen ini adalah elemen entri teks, ini akan menghapus nilainya.


3

Ini adalah sintaksis umum

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

1

Dengan panggilan jelas (), muncul di DOM bahwa komponen input / textarea yang sesuai masih memiliki nilai yang lama, sehingga setiap perubahan berikut pada komponen itu (misalnya mengisi komponen dengan nilai baru) tidak akan diproses dalam waktu.

Jika Anda melihat kode sumber selenium, Anda akan menemukan bahwa metode clear () - didokumentasikan dengan komentar berikut:

/ ** Jika elemen ini adalah elemen entri teks, ini akan menghapus nilainya. Tidak berpengaruh pada elemen lain. Elemen entri teks adalah elemen INPUT dan TEXTAREA. Perhatikan bahwa acara yang dipecat oleh acara ini mungkin tidak seperti yang Anda harapkan. Secara khusus, kami tidak memecat acara keyboard atau mouse. Jika Anda ingin memastikan acara keyboard diaktifkan, pertimbangkan untuk menggunakan sesuatu seperti {@link #sendKeys (CharSequence ...)} dengan tombol backspace. Untuk memastikan Anda mendapatkan acara perubahan, pertimbangkan untuk mengikuti dengan panggilan ke {@link #sendKeys (CharSequence ...)} dengan tombol tab. * /

Jadi menggunakan petunjuk bermanfaat ini untuk menghapus input / textarea (komponen yang sudah memiliki nilai) DAN menetapkan nilai baru untuk itu, Anda akan mendapatkan beberapa kode seperti berikut:

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;
}

Maaf untuk kode ini adalah Java dan bukan Python. Juga, saya harus melewatkan tambahan "waitUntilPageIsReady () - metode yang akan membuat posting ini terlalu panjang.

Semoga ini bisa membantu Anda dalam perjalanan Anda dengan Selenium!


1

Dalam pengalaman saya, ini ternyata yang paling efisien

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

Kami mengirim Ctrl + Backspace untuk menghapus semua karakter dari input, Anda juga dapat mengganti backspace dengan delete.

EDIT: menghapus ketergantungan Tombol


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') bekerja sangat baik dengan FireFox

  • u '\ ue003' adalah BACK_SPACE untuk orang-orang seperti saya - jangan pernah mengingatnya)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.