用硒从文本区清除文本

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

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

比如:

driver.get_element_by_id('foo').clear_field()
335451 次浏览
driver.find_element_by_id('foo').clear()

在最新的硒版本中,使用:

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

方案 a)

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

例子一:

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

例二:

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

WebElement

有很多方法可以获得所需的 WebElement,例如:

  • Find _ element _ by _ id
  • Find _ element _ by _ xpath
  • Find _ element

方案 b)

 webElement.clear()

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

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

这是一般的语法

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

为了咖啡

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

或者

webElement.clear();

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

通过一个简单的 clear ()调用,在 DOM 中看起来相应的输入/文本区组件仍然保留着它的旧值,因此对该组件的任何后续更改(例如用新值填充组件)都不会及时处理。

如果您查看一下 selenium 源代码,您会发现 clear ()-方法的文档包含以下注释:

/* * 如果这个元素是一个文本输入元素,这将清除该值。对其他元素没有影响。文本输入元素是 INPUT 和 TEXTAREA 元素。请注意,此事件触发的事件可能与您预期的不同。特别是,我们不触发任何键盘或鼠标事件。如果希望确保触发键盘事件,可以考虑使用类似{@link # sendKeys (CharSeries...)}这样的方式与退格键一起使用。为了确保获得更改事件,可以考虑使用 tab 键调用{@link # sendKeys (CharSeries...)}。*/

因此,使用这个有用的提示来清除一个输入/textarea (已经有值的组件)并为其赋一个新值,您将得到如下代码:

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 ()-方法,它会使这篇文章太长。

希望这对你的硒之旅有所帮助!

我跑进了一片田野。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)

根据我的经验,这是最有效率的

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

我们正在发送 Ctrl + Backspace 来删除输入中的所有字符,也可以用 delete 替换 Backspace。

编辑: 删除键依赖项

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

  • U’ue003’对于像我这样的人来说是一个 BACK _ space ——永远不要记住它)

我使用 Selenium = = 3.141.0,我不知道为什么

WebElement.clear()

不起作用。

我用过

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

这对我来说很管用。

来自 selenium.webdriver.common.Keys 导入密钥

Element = driver.find _ element _ by _ css _ selector (‘ foo’) Send _ keys (Keys.CONTROL + Keys.Backspace)

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

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

试试:

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)

如果 clear ()不工作,您可以使用 driver.get_element_by_id('foo').send_keys(Keys.BACKSPACE)多次模拟 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)

我建议:

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)