查询带有特定文本的按钮

Posted

技术标签:

【中文标题】查询带有特定文本的按钮【英文标题】:Query a button with specific text 【发布时间】:2020-02-12 22:21:56 【问题描述】:

我有一个(开玩笑的)测试来确定按钮是否存在:

it('renders a signup button', () => 
  expect(sut.getByText('Sign up for free')).toBeDefined()
)

此测试是因为组件中有一个按钮和带有“免费注册”文本的标题。

testid 可以添加到按钮中,但我更愿意遵循 react-testing-library 模拟用户行为的原则。

我认为用户想要“单击标有‘免费注册’的按钮”是合法的。在这种情况下,指定 html 元素的类型是有意义的,因为 <button /> 对用户来说是一个独特的元素,而不是 <h2 /><h3 />

如何查询标有“免费注册”的按钮元素?例如,getByText() 是否可以进一步受到查询选择器的限制?

【问题讨论】:

【参考方案1】:

我很惊讶这里没有人给出最惯用的答案。您可以使用getByRole() 并传递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
)

【讨论】:

感谢您的回答! name 属性在我的 React 测试库版本中不存在,所以我必须更新包。以防其他人遇到同样的问题。【参考方案2】:

您可以将选项传递给查询以更改其默认行为:

getByText('Sign up for free',  selector: 'button' )

你可以找到完整的文档here

【讨论】:

【参考方案3】:

你可以这样做:

getByText('Sign up for free').closest('button')

你可以从here阅读更多关于closest的信息

【讨论】:

这仍然会找到多个元素,在react-testing-library >= 7.0 中失败。我只想选择一个元素。

以上是关于查询带有特定文本的按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何使在文本区域中输入的文本对应于特定的单选按钮?

动态添加带有特定文本和坐标的标签

自动单击包含某些文本的按钮的方法?

.net C# 将值作为查询字符串发布到带有按钮的另一个页面

访问具有多个值的文本框进行查询

垂直对齐带有包装文本的按钮,并排