我有一个 Vue 组件(模态),如果挂载了一个活动元素,它会从活动元素中移除焦点,如果有input
元素,则聚焦它找到的第一个输入。代码正在运行,我对第一种情况进行了工作测试。
我评估输入元素是否聚焦的测试不起作用,但我找不到我的错误。
vue-component 的相关代码部分:
mounted() {
this.removeActiveFocusedElements()
if (this.autoFocusFirstInputElement) {
this.focusFirstInput()
}
}
removeActiveFocusedElements() {
if (document.activeElement) {
document.activeElement.blur()
}
}
focusFirstInput() {
const firstInput = this.$el.querySelector('input')
if (firstInput) {
firstInput.focus()
}
}
相关测试部分:
const wrapper = document.createElement('div')
const initialFocusedElement = document.createElement('button')
wrapper.appendChild(initialFocusedElement)
initialFocusedElement.setAttribute('data-testid', 'initial-focused-element')
const container = render(Modal, {
container: document.body.appendChild(wrapper),
slots: {
header: '<h2>Dialog</h2>',
body: '<div><input type="text" data-testid="first-input"/></div>'
}
})
const firstInput = container.getByTestId('first-input')
expect(firstInput).toHaveFocus()
expect(document.body).not.toHaveFocus()
我知道/尝试过的事情:
如果我没有输入元素并
removeActiveFocusedElements()
从我的 vue 组件中删除,则initialFocusedElement
它是焦点,所以这是有效的,我对此进行了测试。<input type="text" data-testid="first-input"/>
在“DOM”中focusFirstInput()
被调用并找到输入元素document.activeElement.outerHTML
如果我在之后登录firstInput.focus()
,它是带有 test-id 的输入元素,所以它是正确的。如果我登录
document.activeElement.outerHTML
测试,它是身体,所以我的期望当然失败了。我试过了
queryByTestId
,没有任何区别
老实说,我的想法已经不多了。