【问题标题】:Clear text from textarea with selenium使用 selenium 从 textarea 清除文本
【发布时间】:2011-12-05 15:17:25
【问题描述】:

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

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

类似:

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

【问题讨论】:

  • 我找到了 driver.get_element_by_id('foo').clear()
  • 9 年后,使用显而易见的东西 input_field.clear 并拥有它仍然令人惊讶地普遍......而不是 clear input_field。没有好的理由。圣伊西多尔帮助我们。

标签: python selenium selenium-webdriver


【解决方案1】:
driver.find_element_by_id('foo').clear()

【讨论】:

  • 这在最新的 Selenium 版本中对我不起作用。
  • 你的 chromedriver 也打破了这一点。 Fenix 答案无处不在
  • 这可能是 selenium 和 chromedriver 版本冲突的问题。开发人员似乎不太可能故意从 chromedriver 中删除此功能。
  • 目前这个答案在 React 应用程序中无法正常工作,因为 clear 不会导致 React onChange 函数触发。因此,您的输入将被清除,测试将继续进行,您的组件状态将保持原样。 react issue, selenium issue
  • @ncrmro 3 年后看起来这仍然不起作用
【解决方案2】:

选项 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.find_element_by_xpath
  • driver.find_element

选项 b)

 webElement.clear()

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

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

【讨论】:

  • 当使用 CTRL+'a' 时,请考虑测试将在 MacOS 上运行的情况(其他键盘快捷键)。顺便说一句 - 好建议,解决了我的问题。
  • “Keys.BACK_SPACE”解决了我的问题。我只是捕获搜索测试字段,运行 .click() 然后在 for 循环中运行代码。它删除了搜索字段之前的所有租船人。然后将新值发送到搜索字段。只是 .clear() 函数对我不起作用。
  • 在我奇怪的情况下只帮助webElement.sendKeys(Keys.BACK_SPACE); //do repeatedly, e.g. in while loop
  • from selenium.webdriver.common.keys import Keys 只是为了方便新手。
  • 发送Keys.CONTROL + 'a' 到目前为止对我有用,看起来 Chrome 或 Selenium 中的某些内容已经发生了变化,所以现在它只将“a”字符发送到我不需要的 text_field 中。切换到element.clear(),现在只需一行代码而不是两行代码即可完美运行,谢谢!
【解决方案3】:

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

【讨论】:

  • ; 又是什么意思?
  • @surfer190 ; 在 python 中不是必需的。我不小心添加了它。很好的收获。
  • driver.find_element_by_id('foo').send_keys(...)the same solution like webElement.send_keys(...) driver.find_element_by_id() 是一种返回 WebElement 的方法。您可以使用其他方式来定位元素。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

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

    编辑:删除 Keys 依赖项

    【讨论】:

      【解决方案6】:

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

      WebElement.clear()
      

      不工作。

      我用过

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

      这对我来说非常有用。

      【讨论】:

        【解决方案7】:

        java

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

        webElement.clear();
        

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

        【讨论】:

          【解决方案8】:

          一般语法

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              通过简单的 clear() 调用,在 DOM 中显示相应的 input/textarea 组件仍然具有其旧值,因此该组件上的任何后续更改(例如,用新值填充组件)将不会被处理及时。

              如果您查看 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 之旅有所帮助!

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:

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

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

                  【讨论】:

                  • 请添加代码高亮和解释
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多