选择标签在小节中重复的字段
Selecting a field whose label is repeated in subsections
我有一个表格有一些重复的标签,但在不同的小节中。这是我的部分表格的示例:
例如,我希望能够独立选择 A 部分的天数和 B 部分的天数。为此,我尝试使用 getByLabelText 方法:
it('should display correct value for days field', async () => {
const {getByLabelText} = render(<MyForm/>);
const daysElement = await waitForElement(() =>
getByLabelText(/Days/i) as HTMLInputElement
);
expect(daysElement.value).toEqual('0');
});
我在 Days 的标签上使用 htmlFor,并在关联的输入元素上使用匹配的 ID。每个部分都提供了一个上下文来消除其他匹配 ID 的歧义(例如,几天)。例如:
<Field label={i18n.days} htmlFor={`${name}_days`} value = {<NumberControl name='days' id={`${name}_days`} value={this.state.days}}/>
在此代码中,${name} 将解析为 A 部分与 B 部分不同的内容。(Field 和 NumberControl 最终将创建标签和输入元素,适当地设置 htmlFor 和 id 值)。
当我如上图所示使用 getByLabelText 时,它获取了部分 A 的值。但是我还需要获取部分 B 的值。我该怎么做?
根据您的 DOM 结构,您有不同的选择。
如果你有办法查询你的部分——例如使用 data-testid
——你可以使用 within
:
within(getByTestId('id-for-section-A')).getByLabelText('Days')
within(getByTestId('id-for-section-B')).getByLabelText('Days')
within
为您提供 render
返回的所有查询助手,但它们仅限于您传递给它们的节点的子节点。
如果您无法将 data-testid
添加到您的部分,但您始终确定字段在页面上的显示顺序,您可以使用 getAllByLabelText
:
const [firstInput, secondInput] = getAllByLabelText('Days')
最后,如果上述 none 有效,您可以使用 id
属性,因为它们是唯一的。 renderd
returns 一个 container
元素,它只是一个 DOM 节点。您可以在其上使用常规 DOM 方法:
const { container } = render(<YourForm />)
container.getElementById('section_A_days')
container.querySelector('#section_A_days')
如何在 container
中查询取决于您的 DOM 结构。
我个人会选择 within
但这在很大程度上取决于您的用例。
我有一个表格有一些重复的标签,但在不同的小节中。这是我的部分表格的示例:
例如,我希望能够独立选择 A 部分的天数和 B 部分的天数。为此,我尝试使用 getByLabelText 方法:
it('should display correct value for days field', async () => {
const {getByLabelText} = render(<MyForm/>);
const daysElement = await waitForElement(() =>
getByLabelText(/Days/i) as HTMLInputElement
);
expect(daysElement.value).toEqual('0');
});
我在 Days 的标签上使用 htmlFor,并在关联的输入元素上使用匹配的 ID。每个部分都提供了一个上下文来消除其他匹配 ID 的歧义(例如,几天)。例如:
<Field label={i18n.days} htmlFor={`${name}_days`} value = {<NumberControl name='days' id={`${name}_days`} value={this.state.days}}/>
在此代码中,${name} 将解析为 A 部分与 B 部分不同的内容。(Field 和 NumberControl 最终将创建标签和输入元素,适当地设置 htmlFor 和 id 值)。
当我如上图所示使用 getByLabelText 时,它获取了部分 A 的值。但是我还需要获取部分 B 的值。我该怎么做?
根据您的 DOM 结构,您有不同的选择。
如果你有办法查询你的部分——例如使用 data-testid
——你可以使用 within
:
within(getByTestId('id-for-section-A')).getByLabelText('Days')
within(getByTestId('id-for-section-B')).getByLabelText('Days')
within
为您提供 render
返回的所有查询助手,但它们仅限于您传递给它们的节点的子节点。
如果您无法将 data-testid
添加到您的部分,但您始终确定字段在页面上的显示顺序,您可以使用 getAllByLabelText
:
const [firstInput, secondInput] = getAllByLabelText('Days')
最后,如果上述 none 有效,您可以使用 id
属性,因为它们是唯一的。 renderd
returns 一个 container
元素,它只是一个 DOM 节点。您可以在其上使用常规 DOM 方法:
const { container } = render(<YourForm />)
container.getElementById('section_A_days')
container.querySelector('#section_A_days')
如何在 container
中查询取决于您的 DOM 结构。
我个人会选择 within
但这在很大程度上取决于您的用例。