使用Selenium清除文本区域中的文本

208

我有一些测试,测试需要检查当某些字段中的文本无效时,是否会显示正确的错误消息。其中一个验证步骤是确保特定的文本区域元素不为空。

如果此文本区域已经有文本,我该如何告诉Selenium清空该字段呢?

类似这样:

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

7
我用driver.get_element_by_id('foo').clear() 找到它。 - Isaac
2
9年过去了,仍然很常见使用显而易见的input_field.clear,但它却不能清除input_field。没有任何好的理由。圣伊西多尔啊,帮助我们吧。 - phtrivier
17个回答

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

18
在最新的Selenium版本中,这对我不起作用。 - Union find
5
你好,您的翻译已完成:您的 ChromeDriver 也在这个问题上出现了故障。Fenix 的解决方案适用于任何地方。 - norbertas.gaulia
2
这可能是与selenium和chromedriver版本冲突的问题。开发人员故意删除chromedriver的此功能似乎不太可能。 - Isaac
8
目前这个答案在React应用程序中不能正常工作,因为clear不会触发React的onChange函数。因此,您的输入将被清除,测试将继续进行,组件的状态将保持与之前相同。React问题Selenium问题 - ncrmro
4
@ncrmro 三年后看起来这仍然不起作用。 - tread
显示剩余3条评论

144

选项a)

如果您想确保触发键盘事件,请考虑使用sendKeys(CharSequence)

示例1:

 from selenium.webdriver.common.keys import Keys
 # ...
 webElement.sendKeys(Keys.CONTROL + "a")
 webElement.sendKeys(Keys.DELETE)

例子 2:

 from selenium.webdriver.common.keys import Keys
 # ...
 webElement.sendKeys(Keys.BACK_SPACE)  //do repeatedly, e.g. in while loop

WebElement

获取所需的WebElement有多种方法,例如:

  • driver.find_element_by_id
  • driver.find_element_by_xpath
  • driver.find_element

选项 b)

 webElement.clear()

如果这个元素是一个文本输入元素,那么它将清除其值。

请注意,此事件触发的事件可能不符合您的预期。特别地,我们不会触发任何键盘或鼠标事件。


8
在使用CTRL+'a'时,请考虑测试将在MacOS上运行的情况(其他键盘快捷键)。顺便说一句,好建议,解决了我的问题。 - Outside_Box
2
我的问题通过“Keys.BACK_SPACE”得到解决。我只是捕获搜索文本字段,运行 .click() 然后在 for 循环内运行代码。它会删除搜索字段先前具有的所有字符。然后将新值发送到搜索字段。只使用 .clear() 函数对我来说不起作用。 - Noman_ibrahim
1
在我的奇怪情况下,只有 webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop 有帮助。 - Chaki_Black
6
为了方便新手,导入selenium.webdriver.common.keys模块。 - Burak Kaymakci
发送 Keys.CONTROL + 'a' 在我之前一直有效,看起来Chrome或Selenium中的某些东西已经改变,所以现在它只会发送'a'字符到我的文本字段中,这是不期望的。转而使用 element.clear(),现在只需要一行代码就可以完美地解决问题了,谢谢! - rodikno

33

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

分号 ; 的作用是什么? - tread
1
@surfer190 在Python中不需要使用 ;。我是不小心加上去的。好发现。 - Jortega
driver.find_element_by_id('foo').send_keys(...) 是与 webElement.send_keys(...) 相同的解决方案。driver.find_element_by_id() 是返回 WebElement 的一种方式,你也可以使用其他方式来定位元素。 - Fenix

21

在最新的Selenium版本中,请使用:

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

14
在我的经验中,这被证明是最有效的。
driver.find_element_by_css_selector('foo').send_keys(u'\ue009' + u'\ue003')
我们正在发送Ctrl + Backspace以删除输入框中的所有字符,您还可以用delete替换backspace。EDIT:已移除Keys依赖。

这可以在Python 3.9、最新版本的浏览器以及最新的selenium中运行。 - Arun
是的,没错。你有任何想法为什么 ...clear(); 不起作用吗? - Romasius

9

我正在使用selenium==3.141.0,但不知道为什么。

WebElement.clear()

无法工作。 我使用了。
WebElement.send_keys(Keys.CONTROL, 'a')
WebElement.send_keys(Keys.DELETE)

这对我来说非常完美可行。


8

在React中,CTRL+A send_keys的解决方案对我无效。在直接测试浏览器时,CTRL+A只会将光标移到文本元素的开头。相反,以下方法似乎可靠地选择元素中的所有内容。

preferred_name_field.send_keys(Keys.SHIFT, Keys.ARROW_UP)
preferred_name_field.send_keys(Keys.DELETE)

6

Java相关

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

或者

webElement.clear();

如果这个元素是一个文本输入元素,那么它将清除其值。

6

这是一般的语法。

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

4

我建议:

WebElement.send_keys([Keys.BACKSPACE] * 1000)

使用这种方式比while循环更快、更优雅。 而Keys.BACKSPACE可以在Mac上使用。 这些方法在我在Mac上使用Chrome时都不起作用:

WebElement.clear()

WebElement.send_keys(Keys.CONTROL, 'a')
WebElement.send_keys(Keys.DELETE)

while _ in range(1000):
    WebElement.send_keys(Keys.DELETE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接