如何使用 React 测试库查找并单击没有文本的按钮?

Rom*_*her 9 reactjs material-ui react-testing-library

许多React 测试库示例展示了如何使用getByText查询查找和单击按钮,如下所示:

fireEvent.click(getByText("Create"))
Run Code Online (Sandbox Code Playgroud)

或者

userEvent.click(getByText("Create"))
Run Code Online (Sandbox Code Playgroud)

但是,按钮没有文本而只有 SVG 图标是很常见的,例如 Material UI 的图标按钮浮动操作按钮。有没有推荐的方法来查询和单击这些按钮?对于上下文,我使用的是配套用户事件库提供的更高级别的事件。

Nea*_*arl 11

对于图标按钮,添加如下aria-label属性:

<button aria-label='edit'>
  <edit-icon />
</button>
Run Code Online (Sandbox Code Playgroud)

然后在您的测试中,在调用时传递可访问的名称 getByRole()

screen.getByRole('button', {
  name: /edit/i
})
Run Code Online (Sandbox Code Playgroud)

文档

该访问名称是简单的情况下等于例如在label一个的 form元素,或的文本内容button,或价值 aria-label属性。


Ale*_*x K 5

有几种方法可以查询一个元素,没有看到你的元素层次结构,很难说。但是,有多种方法可以查询元素,使用的替代方法getByText()可能是getByRole('button'). 如果要将 a 添加data-testid到元素,可以使用getByTestId(). 这里还有一些可用的查询:https : //testing-library.com/docs/dom-testing-library/api-queries

  • 我明白了,因此需要向按钮添加一个或多个可识别属性,例如“role”、“aria-label”、“alt”或“data-testid”,以启用其他查询之一。在 Material UI 图标按钮和浮动操作按钮示例中,它们似乎添加了 aria-labels,如 `aria-label="delete"`,这将允许使用 `getByLabelText` 进行查询。 (2认同)
  • @RomanScher 你想要思考的是“当焦点位于此按钮上时,屏幕阅读器将阅读什么文本?” 并使用适当的方法通过该文本获取它(getByLabelText通常就是您想要的)。如果您对屏幕阅读器问题的回答是它不会读取任何内容,那么您应该解决这个问题。 (2认同)