Selenyum ile metin alanından metni temizle


142

Bazı alanlardaki metin geçersiz olduğunda doğru hata mesajının göründüğünü kontrol ettiğim bazı testler var. Geçerlilik kontrolü, belirli bir metin alanı öğesinin boş olmamasıdır.

Bu metin alanında zaten metin varsa, selenyumdan alanı temizlemesini nasıl söyleyebilirim?

gibi bir şey:

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

1
Ben buldum driver.get_element_by_id ('foo'). Temizle ()
Isaac

Yanıtlar:


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

4
En son Selenyum sürümünde bu benim için çalışmıyor.
öğrenme istatistikleri

3
youp chromedriver da bunu kırıyor. Fenix ​​cevap her yerde çalışıyor
norbertas.gaulia

1
Çakışan selenyum ve krom sürücü sürümleriyle ilgili bir sorun olabilir. Geliştiricilerin bu işlevselliği kasıtlı olarak chromedriver'dan kaldırması olası görünmüyor.
Isaac

7
Şu anda, React onChange işlevinin başlatılmasına neden olmayacağından, React uygulamalarında bu yanıt düzgün çalışmıyor. Böylece girdileriniz silinecek ve testler devam edecek ve bileşeninizin durumu eskisi gibi kalacaktır. tepki sorunu , selenyum sorunu
ncrmro

1
@ncrmro 3 yıl sonra hala çalışmıyor gibi görünüyor
stephen

81

Kullanabilirsiniz

 webElement.clear();

Bu öğe bir metin giriş öğesiyse, bu değer silinir.

Bu etkinlik tarafından tetiklenen etkinliklerin beklediğiniz gibi olmayabileceğini unutmayın. Özellikle, herhangi bir klavye veya fare olayını tetiklemiyoruz. Klavye olaylarının tetiklendiğinden emin olmak istiyorsanız, benzer bir şey kullanmayı düşünün sendKeys(CharSequence). Örneğin:

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

veya:

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

4
CTRL + 'a' kullanırken, MacOS'ta (diğer klavye kısayolları) testin çalışacağı durumu göz önünde bulundurun. Btw -iyi bir öneri, sorunumu çözdü.
Outside_Box

1
Sorunum "Keys.BACK_SPACE" ile çözüldü. Ben sadece arama test alanını yakalamak. Run .click () sonra bir for döngüsü içinde kodu çalıştırın. arama alanının önceden sahip olduğu tüm kiralama şirketlerini kaldırır. ardından arama alanına yeni bir değer gönderin. Sadece .clear () işlevi benim için çalışmıyor.
Noman_ibrahim

Sadece webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopgarip durumumda yardımcı oldu
Chaki_Black

18

.Clear () işlevinin çalışmadığı bir alana rastladım. İlk iki cevabın bir kombinasyonunu kullanarak bu alanda çalıştı.

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

;Yine ne için?
stephen

1
Python'da @ surfer190 ;gerekli değildir. Kazara ekledim. İyi yakalama.
Jortega


4

java için

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

veya

webElement.clear();

Bu öğe bir metin giriş öğesiyse, bu değer silinir.


3

Genel sözdizimidir

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

1

Basit bir clear () çağrısıyla DOM'da karşılık gelen giriş / textarea bileşeninin hala eski değeri vardır, bu nedenle bu bileşen üzerinde aşağıdaki değişiklikler (örn. Bileşeni yeni bir değerle doldurmak) zaman içinde işlenmeyecektir.

Selenyum kaynak koduna bakarsanız, clear () - yönteminin aşağıdaki yorumla belgelendiğini göreceksiniz:

/ ** Bu öğe bir metin giriş öğesiyse, bu değer silinir. Diğer elementler üzerinde etkisi yoktur. Metin giriş öğeleri INPUT ve TEXTAREA öğeleridir. Bu etkinlik tarafından tetiklenen etkinliklerin beklediğiniz gibi olmayabileceğini unutmayın. Özellikle, herhangi bir klavye veya fare olayını tetiklemiyoruz. Klavye olaylarının tetiklendiğinden emin olmak için geri tuşu ile {@link #sendKeys (CharSequence ...)} gibi bir şey kullanmayı düşünün. Bir değişiklik etkinliği aldığınızdan emin olmak için, sekme tuşuyla {@link #sendKeys (CharSequence ...)} çağrısıyla takip etmeyi düşünün. * /

Bu nedenle, bir girdi / metin alanını (zaten bir değeri olan bileşen) temizlemek ve bu değere yeni bir değer atamak için bu yararlı ipucunu kullanarak, aşağıdaki gibi bir kod alırsınız:

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

Bu kodun Python değil Java olduğu için üzgünüm. Ayrıca, bu yazı yol çok uzun yapacak ek bir "waitUntilPageIsReady () - yöntemi atlamak zorunda kaldı.

Bu Selenium ile yolculuğunuzda size yardımcı olacağını umuyoruz!


1

Deneyimlerime göre, bu en verimli olduğu ortaya çıktı

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

Girişteki tüm karakterleri silmek için Ctrl + Backspace gönderiyoruz, backspace öğesini delete ile de değiştirebilirsiniz.

EDIT: Anahtar bağımlılığı kaldırıldı


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') FireFox ile harika çalıştı

  • u '\ ue003' benim gibi olanlar için bir BACK_SPACE - asla hatırlamıyor)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.