Xóa văn bản từ textarea bằng selen


142

Tôi đã có một số thử nghiệm trong đó tôi đang kiểm tra xem thông báo lỗi thích hợp xuất hiện khi văn bản trong các trường nhất định không hợp lệ. Một kiểm tra tính hợp lệ là một yếu tố textarea nhất định không trống.

Nếu textarea này đã có văn bản trong đó, làm thế nào tôi có thể nói với selen để xóa trường?

cái gì đó như:

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

1
Tôi tìm thấy nó driver.get_element_by_id ('foo'). Clear ()
Isaac

Câu trả lời:


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

4
Điều này không hoạt động với tôi trong phiên bản Selenium gần đây nhất.
Học thống kê bằng ví dụ

3
youp chromedriver cũng phá vỡ cái này. Câu trả lời của Fenix ​​hoạt động ở mọi nơi
norbertas.gaulia

1
Nó có thể là một vấn đề với các phiên bản selen và chromedriver xung đột. Dường như các nhà phát triển sẽ loại bỏ chức năng này khỏi chromedriver một cách có chủ ý.
Isaac

7
Hiện tại, câu trả lời này không hoạt động chính xác trong các ứng dụng React vì rõ ràng sẽ không khiến chức năng React onChange kích hoạt. Do đó, đầu vào của bạn sẽ bị xóa và các kiểm tra sẽ tiếp tục và trạng thái của thành phần của bạn sẽ vẫn như trước đây. vấn đề phản ứng , vấn đề selen
ncrmro

1
@ncrmro 3 năm sau có vẻ như điều này vẫn không làm việc
stephen

81

Bạn có thể dùng

 webElement.clear();

Nếu phần tử này là một phần tử nhập văn bản, điều này sẽ xóa giá trị.

Lưu ý rằng các sự kiện được kích hoạt bởi sự kiện này có thể không như bạn mong đợi. Đặc biệt, chúng tôi không kích hoạt bất kỳ sự kiện bàn phím hoặc chuột. Nếu bạn muốn đảm bảo các sự kiện bàn phím được kích hoạt, hãy cân nhắc sử dụng một cái gì đó như sendKeys(CharSequence). Ví dụ:

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

hoặc là:

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

4
Khi sử dụng CTRL + 'a' xem xét tình huống khi kiểm tra sẽ chạy trên MacOS (các phím tắt khác). Btw - đề nghị tốt, giải quyết vấn đề của tôi.
Bên ngoài_Box

1
Vấn đề của tôi được giải quyết bằng "Phím.BACKinksACE". Tôi chỉ chụp trường kiểm tra tìm kiếm, chạy .click () sau đó bên trong một vòng lặp for chạy mã. nó loại bỏ tất cả những người thuê tàu mà lĩnh vực tìm kiếm trước đây đã có. sau đó gửi giá trị mới cho trường tìm kiếm. Hàm .clear () không hoạt động đối với tôi.
Noman_ibrahim

Chỉ được giúp đỡ webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while looptrong trường hợp kỳ lạ của tôi
Chaki_Black

17

Tôi chạy vào một lĩnh vực nơi .clear () không hoạt động. Sử dụng kết hợp hai câu trả lời đầu tiên làm việc cho lĩnh vực này.

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

Một ;lần nữa là gì?
stephen

1
@ surfer190 ;không cần thiết trong python. Tôi đã thêm nó một cách tình cờ. Nắm bắt tốt.
Jortega


4

cho java

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

hoặc là

webElement.clear();

Nếu phần tử này là một phần tử nhập văn bản, điều này sẽ xóa giá trị.


3

Đây là cú pháp chung

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

1

Với một lệnh gọi đơn giản là Clear () xuất hiện trong DOM rằng thành phần đầu vào / textarea tương ứng vẫn có giá trị cũ, do đó, bất kỳ thay đổi nào sau đây trên thành phần đó (ví dụ điền vào thành phần với giá trị mới) sẽ không được xử lý kịp thời.

Nếu bạn xem mã nguồn selen, bạn sẽ thấy rằng phương thức rõ ràng () - được ghi lại với nhận xét sau:

/ ** Nếu phần tử này là một phần tử nhập văn bản, điều này sẽ xóa giá trị. Không có tác dụng đối với các yếu tố khác. Các yếu tố nhập văn bản là các yếu tố INPUT và TEXTAREA. Lưu ý rằng các sự kiện được kích hoạt bởi sự kiện này có thể không như bạn mong đợi. Đặc biệt, chúng tôi không kích hoạt bất kỳ sự kiện bàn phím hoặc chuột. Nếu bạn muốn đảm bảo các sự kiện bàn phím được kích hoạt, hãy cân nhắc sử dụng một cái gì đó như {@link #sendKeys (CharSequence ...)} với phím xóa lùi. Để đảm bảo bạn nhận được một sự kiện thay đổi, hãy cân nhắc theo dõi bằng một cuộc gọi đến {@link #sendKeys (CharSequence ...)} bằng phím tab. * /

Vì vậy, bằng cách sử dụng gợi ý hữu ích này để xóa đầu vào / textarea (thành phần đã có giá trị) VÀ gán giá trị mới cho nó, bạn sẽ nhận được một số mã như sau:

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

Xin lỗi vì mã này là Java chứ không phải Python. Ngoài ra, tôi đã phải bỏ qua một phương thức "WaitUntilPageIsReady () - bổ sung sẽ khiến bài đăng này quá dài.

Hy vọng điều này sẽ giúp bạn trên hành trình của bạn với Selenium!


1

Theo kinh nghiệm của tôi, điều này hóa ra là hiệu quả nhất

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

Chúng tôi đang gửi Ctrl + Backspace để xóa tất cả các ký tự khỏi đầu vào, bạn cũng có thể thay thế backspace bằng xóa.

EDIT: loại bỏ khóa phụ thuộc


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') làm việc tuyệt vời với FireFox

  • u '\ ue003' là một NỀN TẢNG cho những người như tôi - không bao giờ nhớ nó)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.