跳至主要内容

元素的出现和消失

有时您需要测试元素是否存在,然后消失或反之。

等待元素出现

如果您需要等待元素出现,异步等待实用程序 允许您等待断言满足后再继续。等待实用程序会一直重试,直到查询通过或超时。异步方法返回 Promise,因此您必须始终在调用它们时使用 await.then(done)

1. 使用 findBy 查询

test('movie title appears', async () => {
// element is initially not present...
// wait for appearance and return the element
const movie = await findByText('the lion king')
})

2. 使用 waitFor

test('movie title appears', async () => {
// element is initially not present...

// wait for appearance inside an assertion
await waitFor(() => {
expect(getByText('the lion king')).toBeInTheDocument()
})
})

等待元素消失

waitForElementToBeRemoved 异步辅助 函数使用回调函数在每次 DOM 发生变动时查询元素,并在元素被移除时解析为 true

test('movie title no longer present in DOM', async () => {
// element is removed
await waitForElementToBeRemoved(() => queryByText('the mummy'))
})

使用 MutationObserver 比以固定时间间隔轮询 DOM 使用 waitFor 更有效率。

waitFor 异步辅助 函数会一直重试,直到包装函数停止抛出错误。这可用于断言元素从页面上消失了。

test('movie title goes away', async () => {
// element is initially present...
// note use of queryBy instead of getBy to return null
// instead of throwing in the query itself
await waitFor(() => {
expect(queryByText('i, robot')).not.toBeInTheDocument()
})
})

断言元素不存在

标准的 getBy 方法在找不到元素时会抛出错误,因此如果您想要断言元素不存在于 DOM 中,可以使用 queryBy API。

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

queryAll API 版本返回匹配节点的数组。数组的长度对于断言元素添加到 DOM 或从 DOM 中删除后很有用。

const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(0) // expect no elements

not.toBeInTheDocument

jest-dom 实用程序库提供了 .toBeInTheDocument() 匹配器,可用于断言元素是否存在于文档的正文中,或不存在。这比断言查询结果为 null 更具意义。

import '@testing-library/jest-dom'
// use `queryBy` to avoid throwing an error with `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()