ข้อความที่ชัดเจนจาก textarea ด้วยซีลีเนียม


142

ฉันได้รับการทดสอบบางอย่างที่ฉันกำลังตรวจสอบว่าข้อความแสดงข้อผิดพลาดที่เหมาะสมปรากฏขึ้นเมื่อข้อความในบางฟิลด์ไม่ถูกต้อง หนึ่งการตรวจสอบความถูกต้องคือองค์ประกอบ textarea บางอย่างไม่ว่างเปล่า

หากข้อความนี้มีข้อความอยู่แล้วฉันจะบอกซีลีเนียมให้ล้างฟิลด์ได้อย่างไร

สิ่งที่ต้องการ:

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

1
ฉันพบว่า driver.get_element_by_id ('foo'). clear ()
Isaac

คำตอบ:


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

4
สิ่งนี้ไม่ได้ผลสำหรับฉันในซีลีเนียมเวอร์ชันล่าสุด
สถิติการเรียนรู้ตามตัวอย่าง

3
youp Chromedriver ยังแบ่งในอันนี้ คำตอบของ Fenix ​​ใช้ได้ทุกที่
norbertas.gaulia

1
อาจมีปัญหากับรุ่นซีลีเนียมและ Chromedriver ที่ขัดแย้งกัน ดูเหมือนว่าไม่น่าเป็นไปได้ว่า devs จะลบฟังก์ชั่นนี้ออกจาก deliberatly Chromed
ไอแซค

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
ปัญหาของฉันแก้ไขโดย "Keys.BACK_SPACE" ฉันเพิ่งจับเขตข้อมูลทดสอบการค้นหาเรียกใช้คลิก () จากนั้นในการวนรอบเรียกใช้รหัส มันจะลบผู้เช่าเหมาทั้งหมดที่มีช่องค้นหาก่อนหน้านี้ จากนั้นส่งค่าใหม่ไปยังช่องค้นหา ฟังก์ชั่น. clear () ไม่ทำงานสำหรับฉัน
Noman_ibrahim

ช่วยwebElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loopในกรณีแปลก ๆ ของฉันเท่านั้น
Chaki_Black

18

ฉันวิ่งเข้าไปในทุ่งที่. ชัดเจน () ไม่ทำงาน การใช้การรวมกันของคำตอบสองข้อแรกนั้นใช้ได้กับฟิลด์นี้

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

มีไว้;เพื่ออะไรอีก
stephen

1
@ surfer190 ;ไม่จำเป็นต้องใช้กับ python ฉันเพิ่มโดยไม่ได้ตั้งใจ จับดี.
Jortega


4

สำหรับจาวา

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 ... )} ด้วยปุ่ม backspace เพื่อให้แน่ใจว่าคุณได้รับเหตุการณ์การเปลี่ยนแปลงให้พิจารณาติดตามด้วยการโทรไปที่ {@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 () - เพิ่มเติมที่จะทำให้โพสต์นี้ยาวเกินไป

หวังว่านี่จะช่วยคุณในการเดินทางกับซีลีเนียม!


1

จากประสบการณ์ของฉันสิ่งนี้กลายเป็นสิ่งที่มีประสิทธิภาพมากที่สุด

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

เรากำลังส่ง Ctrl + Backspace เพื่อลบอักขระทั้งหมดจากอินพุตคุณยังสามารถแทนที่ backspace ด้วยการลบ

แก้ไข: ลบการพึ่งพาคีย์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.