使用 selenium 从文本区域清除文本

问题描述 投票:0回答:18

我进行了一些测试,检查当某些字段中的文本无效时是否会显示正确的错误消息。有效性检查之一是某个文本区域元素不为空。

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

类似:

driver.get_element_by_id('foo').clear_field()
python selenium selenium-webdriver
18个回答
298
投票
driver.find_element_by_id('foo').clear()

146
投票

选项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,例如:

  • driver.find_element_by_id
  • driver.通过_xpath查找元素
  • driver.find_element

选项b)

 webElement.clear()

如果该元素是文本输入元素,这将清除该值。

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


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)

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 来删除输入中的所有字符,您也可以将退格键替换为删除。

编辑:删除了键依赖性


9
投票

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

WebElement.clear()

不起作用。

我用过

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

这对我来说非常有效。


9
投票

CTRL+A send_keys 解决方案在反应中对我不起作用。直接在浏览器中测试,CTRL+A 只是将光标发送到文本元素的开头。相反,这对于选择元素中的所有内容似乎是可靠的。

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

6
投票

这是通用语法

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

6
投票

对于java

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

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

3
投票

通过简单地调用clear(),在DOM中就会出现相应的输入/文本区域组件仍然具有其旧值,因此该组件上的任何后续更改(例如,用新值填充组件)将不会被及时处理.

如果您查看 selenium 源代码,您会发现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()-方法,这会使这篇文章太长。

希望这对您的 Selenium 之旅有帮助!


2
投票

尝试:

driver=self.driver
driver.find_element_by_xpath('Path').send_keys(Keys.CONTROL + "a")      
driver.find_element_by_xpath('Path').send_keys(Keys.BACK_SPACE)

1
投票

driver.find_element_by_xpath("path").send_keys(Keys.CONTROL + u'\ue003') 
与 FireFox 配合得很好

  • u'\ue003' 对于像我这样的人来说是一个 BACK_SPACE - 从来不记得它)

1
投票

从 selenium.webdriver.common.keys 导入密钥

element = driver.find_element_by_css_selector('foo') element.send_keys(Keys.CONTROL + Keys.BACKSPACE)


1
投票

如果clear()不起作用,您可以使用以下方法模拟多次按下Backspace:

driver.get_element_by_id('foo').send_keys(Keys.BACKSPACE)

要多次执行此操作,请使用:

from selenium.webdriver.common.keys import Keys

# Replace 100 with the number of time you want to press backspace.
for i in range(0, 100): 
    driver.get_element_by_id('foo').send_keys(Keys.BACKSPACE)

1
投票

首先找到元素

element = driver.find_element_by_id('your element id')

清除Input或Textarea中的文本:如果元素是input或textarea,可以直接使用clear()函数删除。

element.clear()

重置单选按钮或复选框:只需再次单击单选按钮或复选框项目即可。

element.click()

取消选择Dropdow:在选择中,可以通过以下方式取消选择。

Select select = new Select(element);

select.deselectByVisibleText("Female");
select.deselectByValue("1");
select.deselectByIndex(1);
select.deselectAll();

1
投票

尝试使用这个

text=((Keys.BACKSPACE*20)+(Keys.DELETE * 20))

0
投票

强制输入值为空字符串也可以在

execute_script
函数的帮助下工作

element = driver.find_element(By.ID,"some_element")
driver.execute_script('arguments[0].value = "0";', element)
© www.soinside.com 2019 - 2024. All rights reserved.