Skip to main content
Cypress应用

focus

聚焦一个DOM元素。

.focus()之后继续链式调用依赖于目标元素的命令是不安全的

语法

.focus()
.focus(options)

用法

正确用法

cy.get('input').first().focus() // 聚焦第一个输入框

错误用法

cy.focus('#search') // 错误,不能从'cy'开始链式调用
cy.window().focus() // 错误,'window'不返回DOM元素

参数

options (对象)

传入选项对象以改变.focus()的默认行为。

选项默认值描述
logtrue命令日志中显示该命令
timeoutdefaultCommandTimeout超时前等待.focus()解析的时间

生成结果 了解主题管理

  • .focus()返回与输入相同的目标元素。
  • .focus()之后继续链式调用依赖于目标元素的命令是不安全的

示例

无参数

聚焦输入框

cy.get('[type="input"]').focus()

聚焦、输入并失焦文本域

cy.get('textarea').focus()
cy.get('textarea').type('Nice Product!')
cy.get('textarea').blur()

注意事项

可操作性

Focus不是动作命令

.focus()的实现方式与其他动作命令不同,不遵循等待可操作性的相同规则。

.focus()是一个有用的快捷命令。通常用户无法在不引起其他动作或副作用的情况下"聚焦"一个元素。通常用户需要通过点击或Tab键来聚焦元素。

很多时候直接使用.focus()更简洁,并能准确表达你想要测试的内容。

如果你需要等待元素变为可操作的其他保证,应该使用其他命令如.click()

失焦事件

Cypress会先使其他聚焦元素失焦

如果当前有其他DOM元素处于聚焦状态,Cypress会先向该元素发出blur事件,然后再执行.focus()命令。

可聚焦性

只能在有效的可聚焦元素上调用

确保你尝试调用.focus()的元素是一个可聚焦元素

超时

可能因浏览器未收到任何聚焦事件而超时

如果看到此错误,你可能需要确保主浏览器窗口当前处于聚焦状态。这意味着在运行命令时不要聚焦在调试器或其他窗口上。

Cypress内部会处理这种情况,必要时会模拟浏览器发出的失焦事件。遗憾的是当浏览器窗口不处于聚焦状态时,其行为仍会有所不同——例如可能会限制异步事件。最佳做法是在运行测试时保持Cypress窗口处于聚焦状态。

规则

要求 了解命令链

  • .focus()需要链式调用在返回DOM元素的命令之后。
  • .focus()要求元素能够接收焦点。

断言 了解断言

  • .focus()会自动等待链式断言通过。

超时设置 了解超时机制

  • .focus()可能因等待添加的断言通过而超时。

命令日志

聚焦文本域

cy.get('[name="comment"]').focus()

以上命令将在命令日志中显示为:

命令日志 focus

当点击命令日志中的focus命令时,控制台会输出以下内容:

console.log focus

另请参阅