셀레늄으로 텍스트 영역에서 텍스트 지우기


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
최신 Selenium 버전에서는 작동하지 않습니다.
학습 통계 통계 : 예 :

3
youp chromedriver도 이것에서 깨집니다. 훼 릭스의 대답은 모든 곳에서 작동
norbertas.gaulia

1
충돌하는 셀레늄 및 크롬 드라이버 버전에 문제가있을 수 있습니다. 개발자가 의도적으로 크롬 드라이버 에서이 기능을 제거하지는 않을 것 같습니다.
Isaac Isaac

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"로 해결되었습니다. 검색 테스트 필드를 캡처하고 .click ()을 실행 한 다음 for 루프 내에서 코드를 실행하십시오. 검색 필드가 이전에 보유한 모든 헌장을 제거합니다. 그런 다음 검색 필드에 새로운 값을 보냅니다. .clear () 함수가 작동하지 않았습니다.
Noman_ibrahim

webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop이상한 경우 에만 도움이 되었습니다
Chaki_Black

18

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

이란 무엇입니까 ;다시 위해?
stephen

1
;파이썬에서는 @ surfer190 이 필요하지 않습니다. 우연히 추가했습니다. 잘 잡았습니다.
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에서 해당 입력 / 텍스트 영역 구성 요소에 여전히 이전 값이있는 것으로 표시되므로 해당 구성 요소에 대한 다음 변경 사항 (예 : 구성 요소를 새 값으로 채움)은 제 시간에 처리되지 않습니다.

셀레늄 소스 코드를 보면 clear ()-method가 다음 주석과 함께 문서화되어 있음을 알 수 있습니다.

/ **이 요소가 텍스트 입력 요소이면 값이 지워집니다. 다른 요소에는 영향을 미치지 않습니다. 텍스트 입력 요소는 INPUT 및 TEXTAREA 요소입니다. 이 이벤트에서 발생한 이벤트는 예상과 다를 수 있습니다. 특히 키보드 나 마우스 이벤트는 발생하지 않습니다. 키보드 이벤트가 발생하도록하려면 백 스페이스 키와 함께 {@link #sendKeys (CharSequence ...)}와 같은 것을 사용하십시오. 변경 이벤트를 받으려면 탭 키를 사용하여 {@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;
}

이 코드는 Python이 아닌 Java 인 것이 유감입니다. 또한이 게시물을 너무 오래 만들 수있는 추가 "waitUntilPageIsReady ()-방법을 생략해야했습니다.

이것이 셀레늄으로 여행하는 데 도움이되기를 바랍니다!


1

내 경험상, 이것은 가장 효율적인 것으로 판명되었습니다

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

입력에서 모든 문자를 삭제하기 위해 Ctrl + Backspace를 보내고 있으며, 백 스페이스를 delete로 바꿀 수도 있습니다.

편집 : 제거 된 키 종속성


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') FireFox와 잘 작동

  • u '\ ue003'은 나와 같은 사람들을위한 BACK_SPACE입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.