用硒清除textarea中的文本


142

我进行了一些测试,这些测试用于检查某些字段中的文本无效时是否出现了正确的错误消息。有效性检查之一是某个textarea元素不为空。

如果此文本区域中已经有文本,我如何告诉硒清除该字段?

就像是:

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

1
我找到了driver.get_element_by_id('foo')。clear()
艾萨克

Answers:


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

4
在最新的Selenium版本中,这对我不起作用。
学习统计数据,例如

3
youp chromedriver也打破了这一点。Fenix答案无处不在
norbertas.gaulia 2015年

1
硒和chromedriver版本冲突可能是一个问题。开发人员似乎不太可能故意从chromedriver中删除此功能。
以撒

7
目前,此答案在React应用中无法正常运行,因为clear不会触发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上运行测试的情况(其他键盘快捷键)。顺便说一句-好建议,解决了我的问题。
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

17

我遇到了.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);

又是什么;
斯蒂芬

1
@ surfer190 ;在python中不是必需的。我是偶然添加的。接得好。
Jortega


4

对于java

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()方法记录在案并带有以下注释:

/ **如果此元素是文本输入元素,则将清除该值。对其他元素没有影响。文本输入元素是INPUT和TEXTAREA元素。请注意,此事件引发的事件可能与您预期的不同。特别是,我们不会触发任何键盘或鼠标事件。如果要确保触发键盘事件,请考虑将{@link #sendKeys(CharSequence ...)}之类的键与退格键一起使用。为确保您收到更改事件,请考虑使用Tab键跟随对{@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 +退格键以删除输入中的所有字符,您也可以使用delete替换退格键。

编辑:删除键依赖


0

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') 与FireFox一起工作得很好

  • u'\ ue003'对像我这样的人来说是BACK_SPACE-永远不会记住它)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.