查询具有特定文本的按钮
Query a button with specific text
我有一个(Jest)测试来确定按钮是否存在:
it('renders a signup button', () => {
expect(sut.getByText('Sign up for free')).toBeDefined()
})
这个测试是因为组件中有一个按钮和带有“免费注册”文本的标题。
一个testid
可以添加到按钮,但我更愿意遵循react-testing-library模拟用户行为的原则。
我觉得用户想要“单击标有 'Sign up for free' 的按钮”是合法的。在这种情况下,指定 HTML 元素的类型是有意义的,因为 <button />
对用户来说是一个独特的元素,而不是 <h2 />
vs <h3 />
.
如何查询标有“免费注册”的按钮元素?例如,getByText()
可以通过查询选择器进一步限制吗?
你可以这样做:
getByText('Sign up for free').closest('button')
您可以从 here
阅读更多关于 closest
的信息
您可以将选项传递给查询以更改其默认行为:
getByText('Sign up for free', { selector: 'button' })
您可以找到完整的文档here
我很惊讶这里没有人给出最地道的答案。您可以使用 getByRole()
and pass an accessible name。可访问的名称是按钮的文本或 aria-label
属性的值。
如果屏幕上呈现多个具有相同作用的元素,则可以用于查询特定元素。
Text button
<button>Text Button</button>
screen.getByRole('button', {
name: /text button/i
})
Icon button
<button aria-label='edit'>
<edit-icon />
</button>
screen.getByRole('button', {
name: /edit/i
})
如果您查询 return 多个 html 元素,您还可以使用:
const elements = getAllByText('Sign up for free');
这将 return 一个与查询匹配的元素数组。然后如果你知道你需要哪个元素,你可以这样访问:nodes[1]
您可以将单词 'All' 添加到不同的选择器,以获取所有匹配查询(getAllByRole、queryAllByText 等)的数组
我有一个(Jest)测试来确定按钮是否存在:
it('renders a signup button', () => {
expect(sut.getByText('Sign up for free')).toBeDefined()
})
这个测试是因为组件中有一个按钮和带有“免费注册”文本的标题。
一个testid
可以添加到按钮,但我更愿意遵循react-testing-library模拟用户行为的原则。
我觉得用户想要“单击标有 'Sign up for free' 的按钮”是合法的。在这种情况下,指定 HTML 元素的类型是有意义的,因为 <button />
对用户来说是一个独特的元素,而不是 <h2 />
vs <h3 />
.
如何查询标有“免费注册”的按钮元素?例如,getByText()
可以通过查询选择器进一步限制吗?
你可以这样做:
getByText('Sign up for free').closest('button')
您可以从 here
阅读更多关于closest
的信息
您可以将选项传递给查询以更改其默认行为:
getByText('Sign up for free', { selector: 'button' })
您可以找到完整的文档here
我很惊讶这里没有人给出最地道的答案。您可以使用 getByRole()
and pass an accessible name。可访问的名称是按钮的文本或 aria-label
属性的值。
如果屏幕上呈现多个具有相同作用的元素,则可以用于查询特定元素。
Text button
<button>Text Button</button>
screen.getByRole('button', {
name: /text button/i
})
Icon button
<button aria-label='edit'>
<edit-icon />
</button>
screen.getByRole('button', {
name: /edit/i
})
如果您查询 return 多个 html 元素,您还可以使用:
const elements = getAllByText('Sign up for free');
这将 return 一个与查询匹配的元素数组。然后如果你知道你需要哪个元素,你可以这样访问:nodes[1]
您可以将单词 'All' 添加到不同的选择器,以获取所有匹配查询(getAllByRole、queryAllByText 等)的数组